精华帖 (0) :: 良好帖 (3) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-03-18
最后修改:2010-05-16
首先来看效果吧: 先看这个有六个条件的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、类图: 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-03-19
谢谢楼主分享,正在研究源码中
|
|
返回顶楼 | |
发表时间:2010-03-19
看了下,好像只能用于struts2,假如没有使用struts2你这个工具包就没有用了~!
|
|
返回顶楼 | |
发表时间:2010-03-19
最后修改:2010-03-19
引用 看了下,好像只能用于struts2,假如没有使用struts2你这个工具包就没有用了~!
上面说得很明白,依赖xwork.core.2.16包,如果不用Struts2,那么只要这个包就可以,另外要改写RequestUtil类,以提供获得当前请求的方法 |
|
返回顶楼 | |
发表时间:2010-03-19
最后修改:2010-03-20
说实话...楼主发帖没多久我就收藏了...
当时觉得也提不出什么好建议,就没回帖...但是,过去这么久都没人理? |
|
返回顶楼 | |
发表时间:2010-03-19
Angel_Night 写道 说实话...楼主发帖没多久我就收藏了...
当时觉得也提不出什么好建议,就没回帖...当时,过去这么久都没人理? 多谢捧场,呵呵,可能大家都有自已一套实现了吧,我也不知道做个的我是第几个人... |
|
返回顶楼 | |
发表时间:2010-03-20
bboss group project contain follow subprojects:
1.bboss-persistent, a persistent framework. 参考bbossgroups框架来实现持久层的操作: a.灵活的事务管理(声明式事务管理,可编程事务管理,java注解事务管理,jdbctemplate事务管理,五种经典的事务类型,支持事务嵌套,支持多数据库分布式事务) b.灵活的访问数据库的接口(普通sql操作,预编译sql操作,普通/预编译批处理操作,存储过程,函数) c.一套经典的数据库操作标签库(增删改查,普通sql操作,预编译sql操作,普通/预编译批处理操作) d.经典的多数据库连接池配置管理和使用方法(所有的数据库操作接口可以直接指定连接池的名称,方便地实现对不同数据库的操作) e.提供了简单的o/r mapping查询接口 f.提供了多种行处理器来提升查询操作的性能 g.可以方便地实现blob,clob字段的处理 h.提供分页操作接口(预编译和普通),可以方便地址各种数据库的分页操作 2.bboss-taglib, a web layer taglib framework(list tag,pageine list tag,detail tag ,logic tag,tree tag,tabpane tag,dbutil tag). 3.bboss-aop, an aop framework.(ioc ,rpc[jms,mina,jgroups,cxf webservice,restful],bean component,cxf webservice component framworkset and so on). 4.bboss-event, an event framework(local event,remote distribute event framework base aop rpc framework). 5.bboss-util, an utility framework. 6.antbuildall, ant build project that build up projects. 7.bbossevent-client, an event remote client test project. 8.bboss-client, an rpc client test project.(jms,mina,jgroups,cxf webservice,restful). 9.bboss-ws, bboss webserive framework test project. 10.bbossgroups document 目录包含framework 开发文档和bboss aop框架的技术使用文档 bboss group project blog: http://blog.csdn.net/yin_bp http://yin-bp.iteye.com/ bboss group project sourceforge site url: http://sourceforge.net/projects/bboss/files/ 从bbossgroup 1.0开始,已经将以前的持久层框架,aop框架,标签库框架,事件框架,工具框架,全部作为bbossgroup 的子项目一起发布 新增antbuildall [ant complile for all bboss group projects],可以运行antbuildall下的run.bat命令编译所有的子项目,并且更新相应工程 的引用jars。 release version : bbossgroups-1.0 release date: 2010/03/18 release files:Contain all sub projects source files,distribute files,All projects dependended jars,So the file size is some bigger,do not warry,every sub project can be downloaded alone. bbossgroups 最新版本 1.0,整合了原来所有的子项目(持久层框架,标签库框架,aop框架,事件框架),下载地址: https://sourceforge.net/projects/bboss/files/ |
|
返回顶楼 | |
发表时间:2010-03-22
你也可以应用放射机制,写一个hql语句,然后setProperties()
|
|
返回顶楼 | |
发表时间:2010-03-22
deng_1987 写道 你也可以应用放射机制,写一个hql语句,然后setProperties()
你的意思是说也写一个自动拼装HQL的工具类吗,以前没有这种想法,不知道你是不是做了? |
|
返回顶楼 | |
发表时间:2010-03-23
我猜想 楼主的实现机制,也应该是反射原理。
我实现过。只需要传送实体对象就行(里面属性有地有值有地没值)。通过反射机制,拼接SQL语句,然后用setProperties(实体)就行 |
|
返回顶楼 | |