Jboot中有很多中查询数据库的方式,我大概的罗列了一下
1、Db+sql方式,代表方式:Db.find("sql")
2、Colmns方式,代表方式:DAO.findListByColumns(Columns.create("xxx","yyy"));
3、sql模版,代表方式:Db.templete("xxxx");
我在使用columns方法查询的时候每次都写一大推的DAO.findListByColumns(xxxx),于是想着能否写一个通用的查询方法?
思考了很久,也不知道有没有这必要,我想要达到的效果也就是下面这样子(代码2替换代码1)
代码1:
List findListByNameAndAge(String name,Integer age){ Columns columns = Columns.create("name","test"); columns.set("age",18); return DAO.findListByColumns(columns); } List findListByNameAndAge(String name,Integer age){ Columns columns = Columns.create("name","test",Column.LOGIC_NOT_EQUALS);//不等于test columns.set("age",18,Column.LOGIC_LE);//小于18岁 return DAO.findListByColumns(columns); }
代码2:
List findList(Kv){//Kv.by("name","test").set("age",18) return DAO.findListByColumns(ColumnKit.toColumns(kv)))); }; //findFirst(ColumnKit.toColumns(Kv.by("name","test").set("age",18))))); List findList(Kv kv){//Kv.by("name#not","test").set("age#le",18) return DAO.findListByColumns(ColumnKit.toColumns(kv)))); } Kv kv = Kv.by("name#not","test").set("age#le",18); findList(kv);//注意这里的 “name#not”
看起来好像完全像是多此一举,但我想要达到目的有以下几点:
1、controller中不要出现任何Columns类似的查询,所有controller中的查询全部变为:findList和findFirst两种,例如:xxxservice.findList(Kv kv) xxxservice.findFirst(Kv kv)
2、任何时候我想用Columns方式组织列进行查询的时候我能用Kv替代(其实说到底就是不想在controller中出现Columns,废话?)
2、减少部分重复性的代码
3、service的实现类相对会更加整洁点
以下是toColumns()方法的实现(这部分代码比较紧敢):
代码位置:https://gitee.com/lcting/codes/ek8a7fisg3tlbumzcj20o54
随便写写,找点存在感,望指正 ^_^
SELECT
`future_cron_task`.*
FROM
future_cron_task AS `future_cron_task`
WHERE 1=1
#@cronTaskWheres()
#@cronTaskOrderby()
#end
#define cronTaskWheres()
#if(id)
AND `future_cron_task`.cronTaskId=#para(id)
#end
#if(active)###查询任务是否启动
AND `future_cron_task`.active=#(active)
#end
#end
#define cronTaskOrderby()
#if(prop)
order by `future_cron_task`.#(prop) #if(sort) #(sort) #end
#else
order by `future_cron_task`.cronTaskNo
#end
#end
这样不是更舒服,既然有了模板就在模板里写这些东西不是更好
//service调用
@Override
public List list(Kv kv) throws Exception {
return Db.template(getSqlKey(), kv).find();
}
这样也是只用一个kv就可以