论坛首页 入门技术论坛

开创性的陈氏数据库动态查询设计

浏览 11801 次
该帖已经被评为新手帖
作者 正文
   发表时间:2009-03-19   最后修改:2009-03-19

List<QueryCondition> params = new ArrayList<QueryCondition>();
params.add(new QueryCondition(QueryCondition.LIKE, new QueryParam("title", "%"+title+"%")));
params.add(new QueryCondition(QueryCondition.LIKE, new QueryParam("author", "%"+author+"%")));
params.add(new QueryCondition("addTime",  QueryCondition.BETWEEN, new QueryParam("startTime", startTime), new QueryParam("endTime",
					endTime)));
ResultObject<Page<Topic>> result = topicService.findTopicByPage(RequestUtils.getPageNo(request), params);


我觉得这样的查询代码比起外部文件和复杂的用法来说更方便一些吧。。。。。。这个返回的数据类型相当于数据源,可以直接在页面上绑定到分页表格中。。(恩,是asp.net的风格)
呵呵。。莫怪,写写而已。。。
0 请登录后投票
   发表时间:2009-03-19  
fireflyc 写道

List<QueryCondition> params = new ArrayList<QueryCondition>();
params.add(new QueryCondition(QueryCondition.LIKE, new QueryParam("title", "%"+title+"%")));
params.add(new QueryCondition(QueryCondition.LIKE, new QueryParam("author", "%"+author+"%")));
params.add(new QueryCondition("addTime",  QueryCondition.BETWEEN, new QueryParam("startTime", startTime), new QueryParam("endTime",
					endTime)));
ResultObject<Page<Topic>> result = topicService.findTopicByPage(RequestUtils.getPageNo(request), params);


我觉得这样的查询代码比起外部文件和复杂的用法来说更方便一些吧。。。。。。这个返回的数据类型相当于数据源,可以直接在页面上绑定到分页表格中。。(恩,是asp.net的风格)
呵呵。。莫怪,写写而已。。。

你这个是简单对象的查询用hibernate 中的条件查询不就可以了,还更简单呢,我说的是sql语句,好几个表嵌套关联的(什么字表拉,join拉、union拉),你这个可以这样写?而且你这个是参数固定的,
如:
params.add(new QueryCondition(QueryCondition.LIKE, new QueryParam("title", "%"+title+"%")));
这叫什么?我指的是如果根本就没有这个条件查询(查询条件不定呀,你再看下面你的能叫更简单?),你还不得
if(title!=null || !title.equals("")) 
  params.add(new QueryCondition(QueryCondition.LIKE, new QueryParam("title", "%"+title+"%")));
0 请登录后投票
   发表时间:2009-03-19   最后修改:2009-03-19
没听过hirbernate叫tom式数据库操作框架!::S
或者jack式mvc。。。。。。。。。。。。。。。。。。。。
0 请登录后投票
   发表时间:2009-03-20  
lz的这个思路很不错,准备借鉴。

ls各位好像都有点没明白lz的动态参数的意思啊?

这个模式的方便之处就是将sql或hql分离出了业务方法,放到外面,这样看起来也更加优雅,看lz的使用方式也确实方便很多。

至于“陈氏”这个命名,lz显然指的是这种思路,至于这种思路是基于hibernate还是直接的sql并不重要
0 请登录后投票
   发表时间:2009-03-21  
wjx 写道
lz的这个思路很不错,准备借鉴。

ls各位好像都有点没明白lz的动态参数的意思啊?

这个模式的方便之处就是将sql或hql分离出了业务方法,放到外面,这样看起来也更加优雅,看lz的使用方式也确实方便很多。

至于“陈氏”这个命名,lz显然指的是这种思路,至于这种思路是基于hibernate还是直接的sql并不重要

哈哈,算有一个明白的,但太多人还是回答的那么的幽默。
0 请登录后投票
   发表时间:2009-04-11  
说实话,没觉得这个“陈氏查询”有什么开创性....不就对ibatis换了个表达方式吗?何来开放式之有?
0 请登录后投票
   发表时间:2009-09-01  
不错!曾经也有这样的困惑,为了把不确定的因素考虑进来,在查询的时候动用了类似
if(...){.....}
else if (...){
...
}else if
.......
操作起来很麻烦,而且查询的层次不清,不过鉴于项目时间问题没考虑其它的只管实现功能了说,见天借鉴楼主的这种方法,感觉挺好的,谢谢分享!
0 请登录后投票
   发表时间:2010-01-15  
楼主,ibatis 3 相对 ibatis 2,写法就更简单了,不防看一下。另外,何必“重复造轮子”,把你的
<hibernate-mapping>
<sql-query name="hr_searchOrganInfo">
这个文件,直接使用ibatis的xml代替。你只需要集成ibatis的精华到你的项目就可以使用:

使用ibatis 3 把 sql 写在 xml中,在你的dao中传入 “参数”,然后叫ibatis:"喂,大哥,我给你参数了,你返回一条动态的sql给我,记得把我这条sql语句相对应的参数也返回给我"。Ibatis二话没说满足你的要求。

如你写的ibatis 2

<statement id="someName" resultMap="account-result" >
select * from ACCOUNT
<dynamic prepend="where">
<isGreaterThan prepend="and" property="id" compareValue="0">
ACC_ID = #id#
</isGreaterThan>
<isNotNull prepend=”and" property="lastName">
ACC_LAST_NAME = #lastName#
</isNotNull>
</dynamic>
order by ACC_LAST_NAME
</statement>

传入的参数Accout类的id="1",
得到的sql如sql = "select * from ACCOUNT where ACC_ID = ?"
返回的参数只有Object[]{"1"}

这样,ibatis的精华你已经到手(动态sql,动态参数),于是你自然而然的,地球人都知道,在dao(hibernate,jpa,...)中,类似使用PrepareStatement,将 ? 代换吧
0 请登录后投票
   发表时间:2010-02-03   最后修改:2010-02-03
yuanhuiwu 写道
楼主,ibatis 3 相对 ibatis 2,写法就更简单了,不防看一下。另外,何必“重复造轮子”,把你的
<hibernate-mapping>
<sql-query name="hr_searchOrganInfo">
这个文件,直接使用ibatis的xml代替。你只需要集成ibatis的精华到你的项目就可以使用:

使用ibatis 3 把 sql 写在 xml中,在你的dao中传入 “参数”,然后叫ibatis:"喂,大哥,我给你参数了,你返回一条动态的sql给我,记得把我这条sql语句相对应的参数也返回给我"。Ibatis二话没说满足你的要求。

如你写的ibatis 2

<statement id="someName" resultMap="account-result" >
select * from ACCOUNT
<dynamic prepend="where">
<isGreaterThan prepend="and" property="id" compareValue="0">
ACC_ID = #id#
</isGreaterThan>
<isNotNull prepend=”and" property="lastName">
ACC_LAST_NAME = #lastName#
</isNotNull>
</dynamic>
order by ACC_LAST_NAME
</statement>

传入的参数Accout类的id="1",
得到的sql如sql = "select * from ACCOUNT where ACC_ID = ?"
返回的参数只有Object[]{"1"}

这样,ibatis的精华你已经到手(动态sql,动态参数),于是你自然而然的,地球人都知道,在dao(hibernate,jpa,...)中,类似使用PrepareStatement,将 ? 代换吧

你好像是没有看懂我说的是什么,条件固定了那用ibatis和hibernate都很容易实现,再看看我说的动态参数什么意思!不是将?替换值,而是
select * from ACCOUNT where ACC_ID = ? 当页面上没有传来id时,sql为
select * from ACCOUNT 就没有where ACC_ID = 这部分了,页面很多条件查询时有些条件未必选,不选就不用对这个条件进行查询了,如
select * from table a=? and b=? and c=?
当页面上只传a过来,sql就应该是 select * from table a=? 你说
select * from table a=? and b=? and c=? 还能用吗?
哎!现在人都是浮躁,就不能看清楚吗?
0 请登录后投票
   发表时间:2010-02-03  
大致看了下,楼主自己也认为类似ibatis

我认为ibatis的优点在于:
1、命名替换,也就是说你不必关心参数的顺序,只要匹配好参数的key就行
2、更加动态化,比如select * from $tabname$,甚至可以整个sql语句。
3、规范化,作为一个已经被广泛认可的框架,文档齐全,上手容易。

我没看出楼主写的配置文件比ibaits的sql文件优雅到哪儿去,这个算是个人喜好问题。

另外ibaits基本也考虑到sql语句执行的方方面面,例如插入语句后返回主键,存储过程的调用,批量语句的优化等等,另外在和spring结合上也做的够好。

楼主的轮子不比ibaits高明,没有明显的优势啊。

如果仅仅就一条sql配置看起来比ibaits更优雅,是无法服众的
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics