柏睿数据java_数据库动态查询最佳实现 陈氏查询

我占个位,命名为陈氏查询!一帮所谓牛人总说不是什么创新,为我的“陈氏查询”名称感到很不爽!但他们所提供的证据范例个人认为连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=?]]]>

thread-1156905-1-1.html

本功能最大的优点在于动态查询条件时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 编辑]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值