JFinal利用自带的Template Engine实现了Sql管理功能。可以使用的指令包括#sql 、#para、#namespace,以及jfinal template engine的所有指令和功能。
一、基本配置如下
ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);
arp.setBaseSqlTemplatePath(PathKit.getRootClassPath());
arp.addSqlTemplate("sql/learing.sql");
1、setBaseSqlTemplatePath加载sql模板时的基础路径,该基础路径与arp.addSqlTemplate("sql/learing.sql")方法传入的路径组合成最终的的sql模板路径。
2、PathKit.getRootClassPath()表示classpath的根,编译器会将maven项目下的resources的文件自动编译至classpath下。
3、addSqlTemplate可以添加任意多个外部sql文件,这样有利于多数据源下对sql进行模块化管理。
4、开发是想要对修改的sql文件实现热加载,可以配置arp.setDevMode(true)或者arp.getEngine().setDevMode(true);,不配置默认用configConstant中的配置。
二、sql指令
1、(1)通过#sql指令可以定义sql语句,如在命名空间sys下定义一个key值为findByUserName的sql语句:
#namespace("sys")
### 根据用户名获取用户
#sql("findByUserName")
select * from sys_user where user_name = ?
#end
#end
(2)在java中获取方式如下:
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()相同功能。
三、para指令
1、#para指令用于生成sql中的问号占位符以及占位符所 对应的参数,两者分别生成了在SqlPara对象的sql和paraList对象之中。通过SqlPara.getSql()和SqlPara.getPara()可分别获取到他们。
2、#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参数。
3、sql语句的like子句用法
#sql("findUser")
select * from sys_user where username like concat('%',#para(username),'%')
#end
四、namespace指令
.# namespace指令为sql语句指定命名空间,不同的命名空间可以让#sql指令使用相同的key值去定义sql,有利于模块化管理。
五、分页用法
与普通查询完全一样,如:
SqlPara sqlPara = Db.getSqlPara("findUserByAge",18,50);
Db.paginate(1,10,sqlPara);
六、高级用法
1、(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);
2、可以用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