黑马程序员:hibernate分页底层的实现

来源:互联网 发布:什么软件修改视频 编辑:程序博客网 时间:2024/05/21 11:02

---------------------- android培训、java培训、期待与您交流! ----------------------

hibernate框架为我们提供了分页的方法,在运用分页的过程中感觉特别神奇,大批量的数据是如何优化,并且从数据库中查询出来,通过对视频的学习,以及网上的资料,以及基本了解了hibernate底层分页的原因。

        将sql的语句打印出来(可以通过hibernate进行配置将hibernate.show_sql设置为true),便可以发现sql语句在hibernate中进行的封装,如原来的sql语句为:

        String sql=" from Sb as Sb";

        Query query=factory.getCurrentSession().createQuery(sql);        
query.setFirstResult(page.getBeginIndex());
query.setMaxResults(page.getEveryPage());

        return query.list();


但在底层sql语句进行了一定的封装,如在oracle中

  • public boolean supportsLimit(); {   
  •   return true;   
  • }   
  •   
  • public String getLimitString(String sql); {   
  •   StringBuffer pagingSelect = new StringBuffer(100);;   
  •   pagingSelect.append("select * from ( select row_.*, rownum rownum_ from ( ");;   
  •   pagingSelect.append(sql);;   
  •   pagingSelect.append(" ); row_ where rownum <= ?); where rownum_ > ?");;   
  •   return pagingSelect.toString();;   
  • 其实他是对sql进行了封装的,Oracle采用嵌套3层的查询语句结合rownum来实现分页,这在Oracle上是最快的方式,如果只是一层或者两层的查询语句的rownum不能支持order by。 

    如果在mysql中

  • public boolean supportsLimit(); {   
  •   return true;   
  • }   
  • public String getLimitString(String sql); {   
  •   StringBuffer pagingSelect = new StringBuffer(100);;   
  •   pagingSelect.append(sql);;   
  •   pagingSelect.append(" limit ?, ?");;   
  •   return pagingSelect.toString();;   
  • }

  • 除此之外,Interbase,PostgreSQL,HSQL也支持分页的sql语句,只要正确的配置了方言,这就可以实现分页了,

    给大家一个对应方言的网站吧 http://blog.csdn.net/haofeng82/article/details/1575303 .

    ---------------------- android培训、java培训、期待与您交流! ----------------------
  • 原创粉丝点击