JAVA网页设计Hibernate完成分页查询的道理剖析仓酷云
你精通任何一门语言就最强大。现在来看,java的市场比C#大,C#容易入手,比较简单,java比较难Hibernate能够完成分页查询,比方:从第2万条入手下手掏出100笔记录
Queryq=session.createQuery("fromCatasc");
q.setFirstResult(20000);
q.setMaxResults(100);
Listl=q.list();
那末Hibernate底层怎样完成分页的呢?实践上Hibernate的查询界说在net.sf.hibernate.loader.Loader这个类内里,细心浏览该类代码,就能够把成绩完全弄分明。
Hibernate2.0.3的Loader源代码第480行以下:
if(useLimit)sql=dialect.getLimitString(sql);
PreparedStatementst=session.getBatcher().prepareQueryStatement(sql,scrollable);
假如响应的数据库界说了限制查询纪录的sql语句,那末间接利用特定命据库的sql语句。
然厥后看net.sf.hibernate.dialect.MySQLDialect:
publicbooleansupportsLimit(){
returntrue;
}
publicStringgetLimitString(Stringsql){
StringBufferpagingSelect=newStringBuffer(100);
pagingSelect.append(sql);
pagingSelect.append("limit?,?");
returnpagingSelect.toString();
}
这是MySQL的公用分页语句,再来看net.sf.hibernate.dialect.Oracle9Dialect:
publicbooleansupportsLimit(){
returntrue;
}
publicStringgetLimitString(Stringsql){
StringBufferpagingSelect=newStringBuffer(100);
pagingSelect.append("select*from(selectrow_.*,rownumrownum_from(");
pagingSelect.append(sql);
pagingSelect.append(")row_whererownum<=?)whererownum_>?");
returnpagingSelect.toString();
}
Oracle接纳嵌套3层的查询语句分离rownum来完成分页,这在Oracle上是最快的体例,假如只是一层大概两层的查询语句的rownum不克不及撑持orderby。
除此以外,Interbase,PostgreSQL,HSQL也撑持分页的sql语句,在响应的Dialect内里,人人自行参考。
假如数据库不撑持分页的SQL语句,那末依据在设置文件内里
#hibernate.jdbc.use_scrollable_resultsettrue
默许是true,假如你不指定为false,那末Hibernate会利用JDBC2.0的scrollableresult来完成分页,看Loader第430行以下:
if(session.getFactory().useScrollableResultSets()){
//wecangostraighttothefirstrequiredrow
rs.absolute(firstRow);
}
else{
//weneedtostepthroughtherowsonerowatatime(slow)
for(intm=0;m<firstRow;m++)rs.next();
}
假如撑持scrollableresult,利用ResultSet的absolute办法间接移到查询出发点,假如不撑持的话,利用轮回语句,rs.next一点点的移已往。
可见利用Hibernate,在举行查询分页的操纵上,是具有十分年夜的天真性,Hibernate会起首实验用特定命据库的分页sql,假如没用,再实验Scrollable,假如不可,最初接纳rset.next()挪动的举措。
在查询分页代码中利用Hibernate的一年夜优点是,既分身了查询分页的功能,同时又包管了代码在分歧的数据库之间的可移植性。
批评1:robbin写道
再来看net.sf.hibernate.dialect.Oracle9Dialect:
publicbooleansupportsLimit(){
returntrue;
}
publicStringgetLimitString(Stringsql){
StringBufferpagingSelect=newStringBuffer(100);
pagingSelect.append("select*from(selectrow_.*,rownumrownum_from(");
pagingSelect.append(sql);
pagingSelect.append(")row_whererownum<=?)whererownum_>?");
returnpagingSelect.toString();
}
Oracle接纳嵌套3层的查询语句分离rownum来完成分页,这在Oracle上是最快的体例,假如只是一层大概两层的查询语句的rownum不克不及撑持orderby。
Oracle的这类完成假如有orderby子句仍然有成绩。某些时分会招致翻页有纪录反复大概丢失,很难找到纪律,十分奇异。
厥后往google了一下,有Oracle专家说必要orderby的时分必需带上unique的字段,比方主键大概rowid等。
别的,在利用这类接纳rownum的查询时,只管速率绝对对照快,可是背景Oracle在内存和CPU的损耗上会增添很多。实在除非了局集十分复杂(几万以上),而且必需翻倒很前面(skip的纪录良多),接纳ResultSet.absolute办法功能还能够,并没无数量级上的不同。
批评2joachimz写道
Oracle的这类完成假如有orderby子句仍然有成绩。某些时分会招致翻页有纪录反复大概丢失,很难找到纪律,十分奇异。
厥后往google了一下,有Oracle专家说必要orderby的时分必需带上unique的字段,比方主键大概rowid等。
别的,在利用这类接纳rownum的查询时,只管速率绝对对照快,可是背景Oracle在内存和CPU的损耗上会增添很多。实在除非了局集十分复杂(几万以上),而且必需翻倒很前面(skip的纪录良多),接纳ResultSet.absolute办法功能还能够,并没无数量级上的不同。
这类情形常常呈现,包含其他数据库,缘故原由就是排序中呈现不异关头字怎样处置
一个是每次分页都从头查询,也就必要从头排序
另外一个是数据库是不是实行不乱排序
起首表有个默许按次,好比主键递增,对orderby:
假如数据库接纳不乱排序,排序关头字不异时,坚持默许按次(主键递增),那末重复查询重复排序失掉的了局都是一样的
假如接纳不不乱排序,关头字不异时,按次不断定,那末重复排序时了局便可能纷歧样,因而就会呈现看似反复、漏掉的情形
举措很复杂,就是排序时加上一个主键,关于各个不不乱排序的数据库体系多数应当如许做
来自:http://www.javaeye.com/topic/261
其实产生见解的过程就是训练自己发现问题,分析问题的能力。根据以上的认识我想谈下传统的学习与通过视频独立学习的优缺点: J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。 是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能 多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。 http://www.jdon.com/去下载,或到同济技术论坛的服务器ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。 那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧! 如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。 Java是一种计算机编程语言,拥有跨平台、面向对java 是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言 如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。 J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。 那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧! Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。 http://www.jdon.com/去下载,或到同济技术论坛的服务器ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。 是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言 还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。 接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。 你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。 象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。 Java 编程语言的风格十分接近C、C++语言。
页:
[1]
2