标题: 数据库动态查询最佳实现 陈氏查询 [打印本页] 作者: zhongxuchen 时间: 2009-4-26 18:19 标题: 数据库动态查询最佳实现 陈氏查询 我占个位,命名为陈氏查询!一帮所谓牛人总说不是什么创新,为我的“陈氏查询”名称感到很不爽!但他们所提供的证据范例个人认为连ibatis的做法都不如,反增加了开发的麻烦!
还是开门见山,本文所要介绍的是针对数据库查询(当然要是ldap什么的基于查询指令的都适用),其目的在于将sql跟代码进行分离,同时能够保持sql或hql语句的 结构完整性(写sql的步骤一般是:在数据库客户端整理好sql并排版好放到代码中用stringbuffer拼起来,要是修改就痛苦了,还得调试代码得到整个语句),请好好看上面红色字的内容,平时是不是这样做的?如果是你就接着看下面的内容,对你帮助很大! 我们有很多时候数据库查询是由多个条件组合而成,但究竟是哪个条件是不确定的
展示一下效果: 提示一下,本功能支持hql查询如(对于hql优点主要体现在查询条件不固定时,hql写法非常优雅):
<sql-query name="hr_searchOrganInfo">
<![CDATA[
from HrOrganInfo
where 1=1
#[and createDate>=? and createDate<=?]
#[and ORGAN_NO like ?]
#[and ORGAN_NAME like ?]
#[and IS_ACTIVE=?]
]]>
</sql-query>
本功能最大的优点在于动态查询条件时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.name like :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返回的就是对象集合!