java 复杂 sql_复杂的SQL条件
概述
什么是 Nutz.Dao 中的復雜SQL條件
對于 Nutz.Dao 來說,它本質上就是將你的 Java 對象轉化成 SQL,然后交給 JDBC 去執行。
而 SQL 中,當執行數據刪除和查詢操作時,最常用的就是 WHERE 關鍵字。
WHERE 關鍵字后面的就是所謂的復雜查詢條件
Nutz.Dao 將如何如何使用這個條件
Dao 接口的 clear 方法和 query 方法的第二個參數,就是為了生成 WHERE 后面那段字符串設計的
這個參數是一個 org.nutz.dao.Condition 接口的實現類
通過該接口的 toSql(org.nutz.dao.entity.Entity) 方法, Nutz.Dao 將獲得 WHERE 后面那段字符串
當然也包括 ORDER BY
Condition 接口
這個接口只有一個方法toSql(Entity> entity)
這個方法帶一個參數 org.nutz.dao.entity.Entity
通過這個參數,實現者可以獲得當前需要操作的實體的配置信息
當然,如果你不需要的話,你可以不理睬這個參數
Nutz.Dao 會將toSql(Entity> entity) 的返回直接拼接到SQL 的 WHERE 關鍵字后面
如果你返回的字符串以 WHERE 或者 ORDER BY 開頭,它會直接使用,否則會補上一個 WHERE 關鍵字
這個判斷會忽略前后空白以及大小寫
Nutz 給你的快速實現
如果你的數據庫字段被假設不會發生變化,用直接硬編碼是個很好的選擇
如果在開發期,你的數據庫字段變化非常頻繁,用 Cnd 工具類則是更好的選擇
一個友好的工具類 -- Cnd
有些情況,數據庫中的字段同 Java 對象中的字段并不同名,
所以就需要給 Java 字段上的數據庫字段注解加上參數 @Column("數據庫字段名")
如果你通過 Cnd.wrap() 硬編碼某個字段,那么當這個字段數據庫字段名發生改變時,你就需要改動很多。
因此你希望僅僅將對于數據庫的變動限制在 Java 對象的源文件里
所以 Nutz 提供了 Cnd.where() 方法
Condition c = Cnd.where("age",">",30).and("name", "LIKE", "%K%").asc("name").desc("id");
這個條件將生成 SQL
WHERE age>30 AND name LIKE '%K%' ORDERBY name ASC, id DESC
你也可以嵌套表達式
SqlExpressionGroup e1 = Cnd.exps("name", "LIKE", "P%").and("age", ">", "20");
SqlExpressionGroup e2 = Cnd.exps("name", "LIKE", "S%").and("age", "
Condition c = Cnd.where(e1).or(e2).asc("name");
這個條件將生成 SQL
WHERE (name LIKE 'P%' AND age>'20') OR (name LIKE 'S%' AND age
直接硬編碼(不推薦)
最暴力的方法就是直接輸出 WHERE 關鍵字后面的 SQL 代碼了。比如查詢一個 Person 對象
List crowd = dao.query(Person.class, Cnd.wrap("name LIKE 'J%' AND age>20"), null);
部分暴力,使用Static
// 篩選年齡(age)小于20,現金(cash字段)多于負債(due字段)的XX
List list = dao.query(Girl.class, Cnd.where("age", " due")));
拼裝更加復雜的條件
上面的例子的 Cnd.where 函數,在大多數情況下可以快速的生成一個簡單的查詢條件。但是,如果查詢條件非常復雜,
用它可能就比較費勁了。是的,它的設計初衷就是 "查詢條件應該一行搞定"。
有些時候,查詢條件很復雜,一行確實搞不定,怎么辦?Nutz-1.b.38 以后,提供了 Criteria 接口,它繼承自
Condition 接口,它的設計目的有兩個:讓程序員更容易的拼裝復雜邏輯的條件
讓生成的 SQL 可以被參數化,更好的支持 PreparedStatement
這個接口的使用也很簡單,它基本符合 "IDE 的所見即所得" 接口設計原則。 就是說,如果你的 IDE 有智能提示的話,
你使用這個接口是不需要文檔的。
// 創建一個 Criteria 接口實例
Criteria cri = Cnd.cri();
// 組裝條件
if(...){
cri.where().andIn("id", 3,4,5).andIn("name", "Peter", "Wendal", "Juqkai");
}else if(...){
cri.where().andLT("id", 9);
}else if(...){
cri.where().andInBySql("關聯字段","select id from 關聯表 where name = '%s'",變量);
}else if(...){
cri.where().andInBySql("關聯字段","select id from 關聯表 where name like '%%%s%%'",變量);
}
if(...){
cri.where().andLike("name", "%A%");
}
cri.getOrderBy().asc("name").desc("id");
// 執行查詢
List list = dao.query(MyObj.class, cri, null);
Criteria 的 where() 函數返回的是 SqlExpressionGroup,主要由它來提供各種 SQL 條件的組合方法。
這里需要給出一點提示,比如方法名 andGT,表示的是 andGreatThan,即
"大于" 的意思,同理:LT : 小于 (LessThan)
GTE : 大于等于 (GreatThanEqual)
LTE : 小于等于 (LessThanEqual)
模糊查詢的小提示
如下代碼,當str的長度大于1和等于1時的行為有差異
Cnd cnd = Cnd.where("name", "like", str);
// 若str的長度為1,輸出的SQL是
// where name like "%a%"
// 若str的長度為2,輸出的SQL是
// where name like "ab"
正確的寫法是
Cnd cnd = Cnd.where("name", "like", "%" + str + "%s");
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的java 复杂 sql_复杂的SQL条件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: chrome 内核CEF 编译和qt 封
- 下一篇: Android插件化实现方案