每做一个新的模块都要写一大堆组装查询条件的逻辑代码,不小心有一个条件没有用ignocase,又是一个BUG,可能你早已烦透了。
首先来看效果吧:
先看这个有六个条件的URL:
.../findUsers.action?user.realName=lgd&user.phone=&user.age=20&user.age=30&user.organization.name=技术部&user.birthday=1980
用下面一行可以完成所有条件的封装
//三个参数分别是:pojo类,请求参数的前辍,别名
//其中前辍是,如果URL参数写成formBean.user.realName,那么前缀为
//formBean.user;当URL参数写成user.realName,那么前缀就是user
DetachedCriteria c = DetachedCriteriaUtil.createDetachedCriteria(User.class, "user", "u")
//前缀的作用是,所有以此开头的URL参数才会被考虑用来拼装条件
具体用法:下载附件JAR包并导入到工程中,然后在任何地方使用上面那一句即可。
工具类做了这几件事:
1、根据属性类型对各种值转型。
2、年龄条件有两个,即20和30,因为是数值,自动使用>=和<=。
3、对于所在部门的名称,是个关联表字段,先创建别名,再拼条件。这个特点还支持无限级联,比如你可以写一个很变态的URL参数aaa.bbb.ccc.ddd.eee.name=fff,只要你的实体确实有种关联,就可以拼装。
4、手机字段条件没有输入值,不作为条件。
5、对于生日这个条件,组装成>=19800101000000 and <=19801231235959
上面那一行把除了分页外的工作都做了,你已经可以拿这个criteria去查询了,如果你不想分页的话。分页逻辑可在此基础上进行封装,不在此讨论范围内。hibernate打出的SQL类似这样:
select ...... from sys_user user inner join sys_organization org on user.organization_id=org.id where user.real_name like ? and user.age>=? and user.age<=? and org.name like ? user.birthday>=? and user.birthday<=?
此工具类功能包含:
1、根据请求参数自动组装条件--组装结果是DetachedCriteria对象。
2、部份属性查询--即支持只查表中部份字段,且支持无限级联。
3、范围值的自动拆分,如日期,如查询条件中对日期字段只给出一个值,那么会被拆分成两个,只有年份的,拆成当年第0秒和当年最后一微秒,有年月的,拆分成当月第0秒和当月最后一微秒,以此类推,因为你永远不可能拿仅有4位年份构造出工一个日期来和数据库进行相等比较,那不会是客户要的结果。对于数字型的字段,一个值时,进行相等比较,两个值时,进行between比较,不支持多于两值。
4、支持或条件组装,如URL为 user.realName
|user.age=35,那么SQL为user.real_name=? or user.age=?。注意这时目标页面无法用${user.realName|...}取回原值,可以用${realName}取值。
此工具依据功能不同有三个同名的方法,上面是第一种,只具有自动拼装条件功能,下面是剩下两个方法的介绍
//第二种:前三个参数同上,多加一个字符串数组,表示只需要查询这部份属性,是属性名,不是字段名
criteria = DetachedCriteriaUtil.createDetachedCriteria(User.class, "user", "_user", new String[]{"id","realName"});
//SQL如下:select u.id , u.real_name from sys_user...
//第三种:在前面的基础上再加一个数组,表示不希望作为查询条件的请求参数
//如url为../index.action?user.realName=lgd&user.password=123,
//此时如果不想要password这个查询条件,那么这个数组定义为new String[]{"user.password"}
criteria = DetachedCriteriaUtil.createDetachedCriteria(User.class, "user", "_user", new String[]{"id","realName"},new String[]{"user.password"});
库依赖说明:
1、xwork.core.2.16包,struts2.18版本带有此包,代码里面用到它的一个OnglUtil工具将查询结果组装成List<Pojo>,另外RequestUtil类使用ActionContext类取得当前请求,仅此两处依赖xwork包。
2、hibernate3.x,这是必不可少的。
补充:
1、支持除了java.sql.Date、Map属性外的所有常用类型属性条件拼装,要支持这两种只需要依葫芦画瓢实现IValueHandler接口就行了。
2、只要改写AliasToBean类,很容易支持Struts2.0x版本。
3、集合属性需为泛型。
4、支持POST提交表单。
5、类图:
- 大小: 151.9 KB
分享到:
相关推荐
Java 后台数据拼装成树结构工具类,JDK版本要求 jdk8及以上.
基于Dom4j的Xml解析与组装项目工具类.
hibernate实现动态SQL查询,通过XML配置SQL,FREEMARKER 解析,生成要执行的SQL
写java程序时用来拼装sql语句时使用的小工具,在.net 4.0环境下运行。 跟前一版本比较,增加了前缀和空格位置的自定义,并增加了一个配置文件,保存自定义项 例如将 select a, b, c from abc where a like('3') ...
NULL 博文链接:https://fanshuyao.iteye.com/blog/2425817
写java程序时用来拼装sql语句时使用的小工具,在.net 4.0环境下运行。例如将 select a, b, c from abc where a like('3') 转换为: sql.append("select "); sql.append(" a, "); sql.append(" b, "); sql.append...
mysql中有种可以通过join相关操作进行表与表之间的方式查询不同结果集,但是在一对多的情况下,关键查询的结果是多条的.例如:班级和学习的关系,我想很直观的看到班级和学生的情况,列表显示出班级的信息和班级的男生...
行业文档-设计装置-一种可快速拼装的工具式梯子
于是决定用易语言模仿一个, 这个版本只支持 "生成拼装SQL", 下次准备结合ad0o对象. 允许直接操作数据库。制作这么一个东西的初衷是为了 "更快更高效的开发程序", 我们往往在SQL上耽搁了太多时间. 并不是它难. 而是...
基于深度学习视觉和激光辅助的盾构管片自动拼装定位方法.docx
一种预拼装钢构件的点云自动分割算法.docx
ftp上传工具类+ftp登录认证及回写数据处理+主观java代码参考样例及xml拼装方式
行业分类-设备装置-一种拼装式水暖墙体.zip
行业分类-设备装置-一种拼装式碳晶电暖墙体.zip
行业分类-设备装置-一种拼装式电缆电热墙体.zip
通过输入的下发命令自动计算出CRC校验码,简答方便,适用于现场设备调试,不需要任何代码。 工具简单便捷,不需要安装,绿色打开即用。
行业分类-设备装置-一种拼装式电热膜电暖墙体.zip
行业文档-设计装置-方便拼装组合的多媒体显示屏.zip
钢网架结构拼装工程交底记录.doc
行业文档-设计装置-一种壳体类钢结构拼装用卡具