Jfinal提供了兩種操作數據庫的組件,分別是Model類和DB類,可以極大地減少代碼量,提高開發效率。
Db類提供了在Model類之外更豐富的的數據庫操作能力,使用Db類以及嵌套的Record類時,無需對數據庫表進行映射,Record類相當於一個通用的Model。
以下為Db+Record的常見用法:
什么時候選擇用Db類?
1. 沒有創建 Model,不得不使用
2. 由於Active Record 限制一個model對象對應一條記錄,當需要批量操作表中的記錄時需要使用Db + Record,例如,需要對 account 表中的 cash 字段統一加上 100 塊錢:Db.update("update account set cash=cash+100"),這種情況下 Model 只能一條一條地處理數據,而 Db 可以利用 sql 去批量處理
3. 在某些非常需要高度靈活性、通用性的系統之下使用 Db.find(...),例如做一個報表系統,其中絕大部分業務都是跨多表的聯合查詢的數據展現,用 Db.find(sql) 更加方便,以及擁有更大自由度。比如:
1 List<A> list = A.dao.find("select A.a,B.b from A left join (select a,b from B) B on A.a = B.a")
這個時候如果需要對list中的數據進行處理,list.get(index).get("b")將會出錯,因為list初始化是A類型的,而實體類A即數據庫A中沒有字段b。
這個時候采用Db類:
1 List<Record> list = Db.use(configname).find("select A.a,B.b from A left join (select a,b from B) B on A.a = B.a")
4. 在一些刪除、更新語句使用的時候,比如:
a. Model類在執行刪除語句的時候可以使用deleteById()方法,該方法的使用需要數據庫字段具有主鍵(當然,好的數據庫設計每張表都具有一個主鍵)。如果沒有主鍵,Model方法執行刪除語句就無法進行了。當然我們可能會想到利用model.dao.find(sql)方法去執行delete操作,這樣是不可以的。這個時候可以使用Db類的update方法:
1 Db.use("User").update("delete from tablename where para = ?", para);
"User"是數據庫配置configname:
public static final String CONFIG_NAME = "User";
b.批量插入、更新、刪除時,可以使用Db類的batch方法:
public static int[] batch(java.lang.String sql, java.lang.String columns, java.util.List modelOrRecordList, int batchSize)
- sql 參數是指 insert into 或者 update 語句,動態參數使用問號占位,例如:String sql = "insert into user(name, cash) values(?, ?)";上面這個 sql 其中要插入 name、cash 兩個字段,而 values 中用了兩個問號,這兩個問號中的值從后續的 modelOrRecordList 中獲取
- columns 是指前面 sql 中問號占位的地方的參數名稱,jfinal 在填充字段值的時候會根據這個名稱去 modelOrRecordList 中去取數據
- modelOrRecordList 是指 List < User > 或者 List < Record> 或者這種列表
- batchSize 是指多少條數據寫一次數據庫
1 Db.use("User").batch("delete from tablename where para = ?", new Object[][] {{para}}, 1);