上次发表过这样的介绍,可能是我介绍的不够准确,太多人都没有搞明白(挺郁闷,当然也请大家将文章能够看的仔细点,主要是提供针对hibernate查询不足的弥补(当然这种做法并不局限于hibernate,事实上是针对所有涉及数据库查询的一个非常好的解决办法,这里且拿hibernate说事),简单的查询可以不考虑如:User user=(User)this.getHibernateTemplate().get(User.class,id); this.getHibernateTemplate().find("from User where enable=?","") ,这些大家其实都差不多,还有就是hibernate的条件查询Criteria很多人都会就不特别说了)。
还是开门见山,本文所要介绍的是针对数据库查询(当然要是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的写法非常的优雅,结构完整!
调用方法:
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,this.convertSqlParams(status,"-1")}, pageModel,OrganInfoVO.class);
提供java反射器直接映射成VO,也提供了RowCallbackHandler通过反调方式生成VO,当然voClass和RowCallbackHandler都为null,就直接返回数组集合!