jboot中使用Kv替代Columns做一个通用查询的工具

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()方法的实现(这部分代码比较紧敢):

image.png

代码位置:https://gitee.com/lcting/codes/ek8a7fisg3tlbumzcj20o54

随便写写,找点存在感,望指正  ^_^

评论区

久伴轻尘

2020-05-21 09:59

#sql("list")
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就可以

leomj

2020-05-21 11:19

@久伴轻尘 我写这是为了替代Columns,本意是不想写sql,(替代Columns),你这种方法也可以。

久伴轻尘

2020-05-21 14:18

@leomj 我还是觉得一点,sql层次的东西还是放到sql层面把,这样写后面也好维护,而且你这个设计#not #le #re很难让人接受,字段后面加一个#not我感觉可维护性根本不行,当然这只是个人意见

JFinal

2020-05-21 17:26

针对实际场景对 jfinal 做进一步封装,提升开发效率是有价值的

jfinal 站在通用框架的立足点上,只能提供最为通用的功能,否则学习成本会急剧增加,同时用户也不一定用得上

所以,乐见博主的封装

leomj

2020-05-21 21:02

@久伴轻尘
我这样子封装只是做一些简单的查询,不能太过深入,从而达到:快速的写完简单的查询语句,并能有效节约后期维护成本。
复杂的语句我也是建议有必要放sql层的。

久伴轻尘

2020-05-22 15:15

@leomj 怎么样封装都行,最好要考虑到实用性和可维护性,你可以让同事试试你这个用法