论坛首页 Java企业应用论坛

一个关于Hibernate的优化实例:从HQL到QBC,从QBC到QBE,再到“增强的”QBE

浏览 43297 次
该帖已经被评为良好帖
作者 正文
   发表时间: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 &gt;=to_date('$ACCESSTIME1$ 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
          -->
          <isPropertyAvailable prepend="and" property="ACCESSTIME1">
              ACCESSTIME &gt;= to_date('$ACCESSTIME1$ 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
          </isPropertyAvailable>
        </dynamic>
        ) row_ where rownum <= #row1#) where rownum_ >= #row0#
    </select>


ibatis配置虽然麻烦点 但自己搞个从数据表/POJO自动生成配置模板也不困难
0 请登录后投票
   发表时间:2008-08-29  
Ibatis 和 hibernate 用起来都不爽,自己了个给予jdbc template的dao。用起来很不错,尤其是条件是动态的。和一些单表的增删改查很爽
0 请登录后投票
   发表时间:2008-08-29  
楼主这种需求,还是qbc更方便,三种我都用过,我的轨迹是从QBE->QBC->QBDC(DetachedCriteria)->HQL,推荐的还是hql,省得再学一套qbc。

查询复杂度是固有,有时候没必要再去封装一层,省了一些代码,但是少了很多功能和灵活性,还增加学习成本。

从最近的hibernate发布情况来看,看不出qbc有进一步完善和加强的迹象,非常失望。
0 请登录后投票
   发表时间: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的代码非常简洁易懂。
0 请登录后投票
   发表时间:2008-08-29  
终于看到一些比较具体的建议了,谢谢!

Quake Wang的思路很不错,我回头再试试如何用QBC封装成通用的方法

hetylei提到的ibatis的做法也挺有趣,跟Hibernate的理念很不一样了,似乎不容易借鉴
0 请登录后投票
   发表时间:2008-08-29  
都是分层惹的祸啊。Hibernate自己封了一层又一层, 拿到应用里又封了一层又一层。
0 请登录后投票
   发表时间:2008-08-29  
看到楼上的几位,想必一定是是Hibernate用的很有经验了,但是从过去直接用JDBC的经验来看,为了实现一个动态查询要写么多代码,真给人一种想哭的感觉,相比这下Ibatis还稍好一些。
0 请登录后投票
   发表时间:2008-08-29  
524javaey 写道
看到楼上的几位,想必一定是是Hibernate用的很有经验了,但是从过去直接用JDBC的经验来看,为了实现一个动态查询要写么多代码,真给人一种想哭的感觉,相比这下Ibatis还稍好一些。

我记得ibatis的动态查询只能针对具体的entity做,如果你有多个动态查询的表单,就得写多个XML配置,在里面写上很多拼凑sql的语句。
而QBC只用写一个通用方法,如果配合webwork/struts2的参数绑定机制,还可以做到零代码/零配置的效果。
0 请登录后投票
   发表时间: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());

 

0 请登录后投票
   发表时间:2008-08-29  
524javaey 写道
看到楼上的几位,想必一定是是Hibernate用的很有经验了,但是从过去直接用JDBC的经验来看,为了实现一个动态查询要写么多代码,真给人一种想哭的感觉,相比这下Ibatis还稍好一些。


由于IDE的关系,开发效率并不低,而且编译期检查等特性更能节省出大量的调试时间,再加上后期复用代码的好处,真给人一种想笑的感觉(我之前写了很多年的jdbc,不过也是用自己封装的小框架,每次都干写jdbc,那才是真的要哭)。
9 请登录后投票
论坛首页 Java企业应用版

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