JFinal利用自帶的Template Engine實現了Sql管理功能。可使用的指令包括#sql 、#para、#namespace,以及jfinal template engine的全部指令和功能。java
ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin); arp.setBaseSqlTemplatePath(PathKit.getRootClassPath()); arp.addSqlTemplate("sql/learing.sql");
一、setBaseSqlTemplatePath加載sql模板時的基礎路徑,該基礎路徑與arp.addSqlTemplate("sql/learing.sql")方法傳入的路徑組合成最終的的sql模板路徑。sql
二、PathKit.getRootClassPath()表示classpath的根,編譯器會將maven項目下的resources的文件自動編譯至classpath下。數組
三、addSqlTemplate能夠添加任意多個外部sql文件,這樣有利於多數據源下對sql進行模塊化管理。maven
四、開發是想要對修改的sql文件實現熱加載,能夠配置arp.setDevMode(true)或者arp.getEngine().setDevMode(true);,不配置默認用configConstant中的配置。模塊化
一、(1)經過#sql指令能夠定義sql語句,如在命名空間sys下定義一個key值爲findByUserName的sql語句:函數
#namespace("sys") ### 根據用戶名獲取用戶 #sql("findByUserName") select * from sys_user where user_name = ? #end #end
(2)在java中獲取方式以下:ui
public User findByUserName(String userName) { String sql = User.getSql("sys.findByUserName"); User user = User.findFirst(sql, userName); return user; }
User.getSql和Db.getSql功能基本同樣,惟一不一樣的是User.getSql在自身所對應的ActiveRecordPlugin的sql模板中去取sql,sql,Db.getSql在主ActiveRecordPlugin的sql模板中去取sql,可經過Db.use(...).getSql(...)實現Model.getSql()相同功能。spa
一、#para指令用於生成sql中的問號佔位符以及佔位符所 對應的參數,二者分別生成了在SqlPara對象的sql和paraList對象之中。經過SqlPara.getSql()和SqlPara.getPara()可分別獲取到他們。code
二、#para的兩種用法對象
(1)傳入int型常量參數,如定義一個key值爲findUser的sql,查詢指點年齡段的用戶
###傳入int型常量參數 #sql("findUserByAge") select * from sys_user where age > #para(0) #end
在java中獲取方式以下:
SqlPara sqlPara = Db.getSqlPara("findUserByAge",18,50); Db.find(sqlPara);
(2)傳入除了int型常量意外的任意類型參數,如:
###傳入int型常量參數 #sql("findUser") select * from sys_user where age > #para(age) #end
在java中獲取方式以下:
Kv cond = Kv.by("age",18) SqlPara sqlPara = Db.getSqlPara("findUserByAge",cond); Db.find(sqlPara);
以上兩種方法的區別是前者傳入的是Object...paras參數,後者是Map data參數。
三、sql語句的like子句用法
#sql("findUser") select * from sys_user where username like concat('%',#para(username),'%') #end
.# namespace指令爲sql語句指定命名空間,不一樣的命名空間可讓#sql指令使用相同的key值去定義sql,有利於模塊化管理。
與普通查詢徹底同樣,如:
SqlPara sqlPara = Db.getSqlPara("findUserByAge",18,50); Db.paginate(1,10,sqlPara);
一、(1)定義sql模板
#sql("find") select * from girl #for(x:cond) #(for.index==0?"where":"and") #(x.key) #para(x.value) #end #end
(2)java獲取以下:
Kv cond = Kv.by("age>",16).set("age<",23).set("sex=","female"); SqlPara sp = Db.getSqlPara("find",Kv.by("cond",cond)); Db.find(sp);
二、能夠用jfinal模板引擎的#define指令將經常使用的sql定義成通用的模板函數,以便消除重複性sql代碼,下面是利用id數組刪除數據的示例:
###定義模板函數deleteByIdList #define deleteByIdList(table,idList) delete from #(table) where id in ( #for(id:idList) #(for.index>0?",":"") #id #end ) #end
###調用上面定義的模板函數 #sql(deleteUser) #@deleteByIdList("user",idList) #end