查看: 7185|回复: 11

[原创] 数据库动态查询最佳实现 陈氏查询

[复制链接]
论坛徽章:
0
跳转到指定楼层
1#
发表于 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返回的就是对象集合!


工作机理很简单,就是通过判断参数是否为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 编辑 ]
论坛徽章:
350
2006年度最佳版主
日期:2007-01-24 12:56:49NBA大富翁
日期:2008-04-21 22:57:29地主之星
日期:2008-11-17 19:37:352008年度最佳版主
日期:2009-03-26 09:33:53股神
日期:2009-04-01 10:05:56NBA季后赛大富翁
日期:2009-06-16 11:48:01NBA季后赛大富翁
日期:2009-06-16 11:48:01ITPUB年度最佳版主
日期:2011-04-08 18:37:09ITPUB年度最佳版主
日期:2011-12-28 15:24:18ITPUB年度最佳技术原创精华奖
日期:2012-03-13 17:12:05
2#
发表于 2009-4-26 18:37 | 只看该作者
GOOD!

使用道具 举报

回复
论坛徽章:
4
3#
发表于 2009-4-27 23:40 | 只看该作者
恩有空得仔细看看

使用道具 举报

回复
论坛徽章:
19
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44版主1段
日期:2012-05-15 15:24:112012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252011新春纪念徽章
日期:2011-02-18 11:42:502011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:33
4#
发表于 2009-4-28 14:37 | 只看该作者
多谢分享

使用道具 举报

回复
论坛徽章:
3
5#
发表于 2009-4-29 09:56 | 只看该作者
不错

使用道具 举报

回复
论坛徽章:
131
乌索普
日期:2017-09-26 13:06:30马上加薪
日期:2014-11-22 01:34:242014年世界杯参赛球队: 尼日利亚
日期:2014-06-17 15:23:23马上有对象
日期:2014-05-11 19:35:172014年新春福章
日期:2014-04-04 16:16:58马上有对象
日期:2014-03-08 16:50:54马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14
6#
发表于 2009-4-30 22:34 | 只看该作者
干了这么多年, 还没写过sql, 郁闷

使用道具 举报

回复
招聘 : Java研发
论坛徽章:
114
SQL数据库编程大师
日期:2013-12-06 13:59:43萤石
日期:2013-12-06 15:50:21ITPUB元老
日期:2007-09-25 17:05:532011数据库大会纪念章
日期:2015-04-23 10:33:192010数据库技术大会纪念徽章
日期:2015-04-23 10:33:19喜羊羊
日期:2015-03-24 13:02:282015年新春福章
日期:2015-03-06 11:57:31喜羊羊
日期:2015-03-04 14:49:39马上有房
日期:2015-01-22 17:30:45马上加薪
日期:2014-12-25 08:48:51
7#
发表于 2009-5-1 21:28 | 只看该作者
不想打击楼主,这点东西还能跟ibatis相提并论,
随便写个变量替代估计比你这个都强, 没有最好,只要适合自己项目,自己使用规则就好

使用道具 举报

回复
论坛徽章:
0
8#
 楼主| 发表于 2009-5-2 14:51 | 只看该作者
你看清楚了文章没有呀?没有说全部跟ibatis比,但查询时比ibatis好的,你怎么打击我也没有用呀,ibatis的动态查询就是没有我这个优雅呀,ibatis我也用过呀!sql结构打乱了,我这个也是支持参数命名的,请看清楚再回复(顺便再提醒一下,不仅仅是sql、hql等等的都一样支持)
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]
                                      )
             ]

使用道具 举报

回复
招聘 : Java研发
论坛徽章:
114
SQL数据库编程大师
日期:2013-12-06 13:59:43萤石
日期:2013-12-06 15:50:21ITPUB元老
日期:2007-09-25 17:05:532011数据库大会纪念章
日期:2015-04-23 10:33:192010数据库技术大会纪念徽章
日期:2015-04-23 10:33:19喜羊羊
日期:2015-03-24 13:02:282015年新春福章
日期:2015-03-06 11:57:31喜羊羊
日期:2015-03-04 14:49:39马上有房
日期:2015-01-22 17:30:45马上加薪
日期:2014-12-25 08:48:51
9#
发表于 2009-5-2 16:34 | 只看该作者
呵呵,的确,打击别人永远是错误的,
我写sql及存储过程语句比写java代码要多的多, 你说的参数命名spring的 NamedParameterJdbcTemplate 都有这方法的(估计比你这个要强大,直接支持数组),
而且自己实现也基本是相当容易, 任何的定制的sql在项目中都有可能会不够用, 如果谈优雅,最好是开发人员都不用参与sql的编写,自动生成如果能达到80%的够用的话,那样也就够了, 有时候封装的方法并不一定是我们所要的,我们对数据库的结果有时并不需要是转好的List,而只是要一原始的ResultSet。 个人认为,自动生成数据库对象操作解决80%的问题,增删改及一些单表操作肯定是可以实现自动化的,其它20%,那就自己写sql吧,想怎么灵活就怎么灵活,一切在于规范及能力控制中.
一句话,如果你认为自己的架构或设计好,那一定要建立在开发人员之上, 当开发人员用此架构及设计时,不需要知道其中的约束,不清楚自己用的是什么,只是觉得好用,那就是成功的。

使用道具 举报

回复
论坛徽章:
4752
季节之章:冬
日期:2019-07-13 22:29:26季节之章:春
日期:2019-07-13 22:29:26季节之章:夏
日期:2019-07-13 22:29:26季节之章:秋
日期:2019-07-13 22:29:26嫦娥
日期:2019-08-03 07:05:29玉石琵琶
日期:2019-08-03 08:17:02铁扇公主
日期:2019-08-03 21:12:36九尾狐狸
日期:2019-08-05 21:05:25玉石琵琶
日期:2019-08-06 06:36:05玉兔
日期:2019-08-06 16:05:50
10#
发表于 2009-5-4 23:34 | 只看该作者
学习。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表