我占个位,命名为陈氏查询!一帮所谓牛人总说不是什么创新,为我的“陈氏查询”名称感到很不爽!但他们所提供的证据范例个人认为连ibatis的做法都不如,反增加了开发的麻烦!
还是开门见山,本文所要介绍的是针对数据库查询(当然要是ldap什么的基于查询指令的都适用),其目的在于将sql跟代码进行分离,同时能够保持sql或hql语句的
结构完整性(写sql的步骤一般是:在数据库客户端整理好sql并排版好放到代码中用stringbuffer拼起来,要是修改就痛苦了,还得调试代码得到整个语句),请好好看上面红色字的内容,平时是不是这样做的?如果是你就接着看下面的内容,对你帮助很大!
我们有很多时候数据库查询是由多个条件组合而成,但究竟是哪个条件是不确定的
展示一下效果:
提示一下,本功能支持hql查询如(对于hql优点主要体现在查询条件不固定时,hql写法非常优雅):
from HrOrganInfo
where 1=1
#[and createDate>=? and createDate<=?]
#[and ORGAN_NO like ?]
#[and ORGAN_NAME like ?]
#[and IS_ACTIVE=?]]]>
本功能最大的优点在于动态查询条件时hql或sql的写法非常的优雅,结构完整!
同时#[]支持嵌套,如:
#[]相当于if判断
select t.*
from table_name t
where 1 = 1
and t.type=:type
#[and t.status=:status
and t.orderId=(select orderId
from t2
#[where t2.namelike :name]
)
]
调用方法:
sql语句可以是
select * from t where t.name=:name and t.createDate>:createDate 不一定是?号,以解除使用者需要记住参数顺序
的烦恼。
1、分页调用
通过反调映射到对象
PaginationModel findPageByJdbc(final String sqlOrNamedSql,
final String[] paramsNamed, final Object[] paramsObj,
final PaginationModel paginationModel,
final RowCallbackHandler rowCallbackHandler);
直接返回数据库结果结合,不映射对象
PaginationModel findPageByJdbc(final String sqlOrNamedSql,
final String[] paramsNamed, final Object[] paramsObj,
final PaginationModel paginationModel);
直接转VO式调用
PaginationModel findPageByJdbc(final String sqlOrNamedSql,
final String[] paramsNamed, final Object[] paramsObj,
final PaginationModel paginationModel, final Class voClass);
2、非分页反调方式
直接数据库数据集合返回
List findByJdbcQuery(final String sqlOrNamedSql,
final String[] paramsNamed, final Object[] paramsValue);
通过反调映射到对象
List findByJdbcQuery(final String sqlOrNamedSql,
final String[] paramsNamed, final Object[] paramsValue,
final RowCallbackHandler rowCallHandler)
直接转VO对象调用
List findByJdbcQuery(final String sqlOrNamedSql,
final String[] paramsNamed, final Object[] paramsValue,
final Class voClass)
hql的调用差不多:findByhql 或findPageByhql,参数当然就没有voClass和RowCallbackHandler了,因为hql返回的就是对象集合!
工作机理很简单,就是通过判断参数是否为null(结合sql特性如is null)对sql语句进行重新整理,后台提供了convertSqlParams功能将特定值转为null
this.findPageByJdbc("hr_getOrganInfoByNo", null,new Object[] { organNO,SqlUtil.filterEquals(status,"-1")}, pageModel,OrganInfoVO.class);
提供java反射器直接映射成VO,也提供了RowCallbackHandler通过反调方式生成VO,当然voClass和RowCallbackHandler都为null,就直接返回数组集合!
目前增加了缓存机制
一句分页查询就这么简单:
return this.findPageByJdbc("security_findRole", null, new Object[] {
SqlUtil.filterEqual(roleVO.getActiveFlag(), SystemConstants.FULL),
SqlUtil.filterEqual(roleVO.getLayerFlag(), SystemConstants.FULL),
SqlUtil.filterBlank(roleVO.getAllRoleNos()) }, pageModel, RoleVO.class);
如果你想藐视请你拿出你的写法,要是更简单我服你,要是觉得不错请回帖顶一下(实在是看到太多没有看明白就否定一切的人)
[本帖最后由 zhongxuchen 于 2009-6-23 17:34 编辑]