该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2008-08-29
movingboy 写道 cats_tiger 写道 这个不错,投个良好贴:D
ibatis可以很好的解决这类问题。 不懂ibatis,能否请你大致地描述一下解决办法或思路? 随便摘了个配置 ibatis 的 dynamic 提供了比较好的解决方案 <select id="getEntityListByParam" resultMap="WEBLOGResult" parameterClass="map"> select * from ( select row_.*, rownum rownum_ from ( select * from WEBLOG <dynamic prepend="where"> <!--如果有ACCESSTIME参数传入 dynamic 生成的结果是 where ACCESSTIME = #ACCESSTIME# #ACCESSTIME#表层引用map参数为ACCESSTIME的值 --> <isPropertyAvailable prepend="and" property="ACCESSTIME"> ACCESSTIME = #ACCESSTIME# </isPropertyAvailable> <!--如果有ACCESSTIME1参数传入 又有ACCESSTIME传入 dynamic 生成的结果是 where ACCESSTIME = #ACCESSTIME# and ACCESSTIME >=to_date('$ACCESSTIME1$ 00:00:00', 'yyyy-mm-dd hh24:mi:ss') --> <isPropertyAvailable prepend="and" property="ACCESSTIME1"> ACCESSTIME >= to_date('$ACCESSTIME1$ 00:00:00', 'yyyy-mm-dd hh24:mi:ss') </isPropertyAvailable> </dynamic> ) row_ where rownum <= #row1#) where rownum_ >= #row0# </select> ibatis配置虽然麻烦点 但自己搞个从数据表/POJO自动生成配置模板也不困难 |
|
返回顶楼 | |
发表时间:2008-08-29
Ibatis 和 hibernate 用起来都不爽,自己了个给予jdbc template的dao。用起来很不错,尤其是条件是动态的。和一些单表的增删改查很爽
|
|
返回顶楼 | |
发表时间:2008-08-29
楼主这种需求,还是qbc更方便,三种我都用过,我的轨迹是从QBE->QBC->QBDC(DetachedCriteria)->HQL,推荐的还是hql,省得再学一套qbc。
查询复杂度是固有,有时候没必要再去封装一层,省了一些代码,但是少了很多功能和灵活性,还增加学习成本。 从最近的hibernate发布情况来看,看不出qbc有进一步完善和加强的迹象,非常失望。 |
|
返回顶楼 | |
发表时间:2008-08-29
最近自己做的一个小项目试用自己写的一个dao,不过这个得在jdk6上跑。用了java新特性。其接口如下:
public interface SimpleDAO<T> { public int delete(BoolExpr condition); public T create(T obj); public T create(Insert<T> insert); public T create(T obj, String... insertedAttrs); public int modify(Update<T> update); public int modify(T obj, BoolExpr condition); public int modify(T obj, BoolExpr condition, String... updatedAttrs); public int modify(String statementId, Object... parameters); public T query(Select<T> select); public T query(BoolExpr condition); public T query(BoolExpr condition, String... selectedAttrs); public T query(String statementId, Object... parameters); public List<T> queryList(); public List<T> queryList(Select<T> select); public List<T> queryList(BoolExpr condition); public List<T> queryList(BoolExpr condition, String... selectedAttrs); public List<T> queryList(String statementId, Object... parameters); } 这些接口都实现了,有几个接口实现还不很好,还需要完善。再使用中很方便,action和biz的代码非常简洁易懂。 |
|
返回顶楼 | |
发表时间:2008-08-29
终于看到一些比较具体的建议了,谢谢!
Quake Wang的思路很不错,我回头再试试如何用QBC封装成通用的方法 hetylei提到的ibatis的做法也挺有趣,跟Hibernate的理念很不一样了,似乎不容易借鉴 |
|
返回顶楼 | |
发表时间:2008-08-29
都是分层惹的祸啊。Hibernate自己封了一层又一层, 拿到应用里又封了一层又一层。
|
|
返回顶楼 | |
发表时间:2008-08-29
看到楼上的几位,想必一定是是Hibernate用的很有经验了,但是从过去直接用JDBC的经验来看,为了实现一个动态查询要写么多代码,真给人一种想哭的感觉,相比这下Ibatis还稍好一些。
|
|
返回顶楼 | |
发表时间:2008-08-29
524javaey 写道 看到楼上的几位,想必一定是是Hibernate用的很有经验了,但是从过去直接用JDBC的经验来看,为了实现一个动态查询要写么多代码,真给人一种想哭的感觉,相比这下Ibatis还稍好一些。
我记得ibatis的动态查询只能针对具体的entity做,如果你有多个动态查询的表单,就得写多个XML配置,在里面写上很多拼凑sql的语句。 而QBC只用写一个通用方法,如果配合webwork/struts2的参数绑定机制,还可以做到零代码/零配置的效果。 |
|
返回顶楼 | |
发表时间:2008-08-29
可以使用rapid-xsqlbuilder, 仍然是清晰的sql语法.提供sql拼接与使用占位符两种方式 使用Criteria 这种没有sql灵活.
示例:
// 清晰的sql语句,/~ ~/为一个语法块 String sql= "select * from user where 1=1 " + "/~ and username = {username} ~/" + "/~ and password = {password} ~/"; // filters为参数 Map filters = new HashMap(); filters.put("username", "badqiu"); filters.put("sex", "F"); XsqlFilterResult result = new XsqlBuilder().generateHql(sql,filters); //构造结果 assertTrue(result.getAcceptedFilters().containsKey("username")); assertFalse(result.getAcceptedFilters().containsKey("sex")); assertEquals("select * from user where 1=1 and username = :username ", result.getXsql());
|
|
返回顶楼 | |
发表时间:2008-08-29
524javaey 写道 看到楼上的几位,想必一定是是Hibernate用的很有经验了,但是从过去直接用JDBC的经验来看,为了实现一个动态查询要写么多代码,真给人一种想哭的感觉,相比这下Ibatis还稍好一些。
由于IDE的关系,开发效率并不低,而且编译期检查等特性更能节省出大量的调试时间,再加上后期复用代码的好处,真给人一种想笑的感觉(我之前写了很多年的jdbc,不过也是用自己封装的小框架,每次都干写jdbc,那才是真的要哭)。 |
|
返回顶楼 | |