Hibernate实现分页查询
分页查询就是把数据库中某张表的记录数进行分页查询,在做分页查询时会有一个Page类,下面是一个Page类,我对其做了详细的注解:
1 package com.entity;
2 /**
3 * @author:秦林森
4 */
5
6 import javax.persistence.criteria.CriteriaBuilder;
7
8 public class Page {
9 /**
10 * 其中currentPage,perPageRows这两个参数是做分页查询必须具备的参数
11 * 原因是:hibernate中的Criteria或则是Query这两个接口:都有setFirstResult(Integer firstResult)
12 * 和setMaxResult(Integer maxResult),
13 * 这里的firstResult就是每页的开始的索引数:
14 * 每页开始的索引数的计算公式是:(currentPage-1)*perPageRows+1,(这是相对索引从1开始的)
15 * 但是Hibernate中的firstResult的索引是从0开始的,所以在hibernate中每页开始的索引数的计算公式是:
16 * (currentPage-1)*perPageRows+1-1=(currentPge-1)*perPageRows.
17 *
18 * maxResult就是每页能查询的最大记录数:也就是perPageRows.
19 *
20 * Math.ceil(totalRows/perPageRows)==totalPages;//这是根据总记录数和每页的记录数算出总页数的计算公式。
21 */
22 private Integer currentPage;//当前页
23 private Integer perPageRows;//每页的记录数
24 private Integer totalRows;//总记录数:
25 private Integer totalPages;//总页数:
26 public Integer getCurrentPage() {
27 return currentPage;
28 }
29
30 public void setCurrentPage(Integer currentPage) {
31 this.currentPage = currentPage;
32 }
33
34 public Integer getPerPageRows() {
35 return perPageRows;
36 }
37
38 public void setPerPageRows(Integer perPageRows) {
39 this.perPageRows = perPageRows;
40 }
41
42 public Integer getTotalRows() {
43 return totalRows;
44 }
45
46 public void setTotalRows(Integer totalRows) {
47 this.totalRows = totalRows;
48 }
49
50 public Integer getTotalPages() {
51 return totalPages;
52 }
53
54 public void setTotalPages(Integer totalPages) {
55 this.totalPages = totalPages;
56 }
57 }
下面用Hibernate的Criteira接口进行查询:
对应的实体类Employee的代码如下:
1 package com.entity;
2
3 import javax.persistence.*;
4
5 @Entity
6 @Table(name = "EMPLOYEE")
7 public class Employee {
8 @Id
9 @GeneratedValue(strategy = GenerationType.IDENTITY)
10 private int id;
11 @Column(name = "first_name")
12 private String firstName;
13 @Column(name = "last_name")
14 private String lastName;
15 @Column(name = "salary")
16 private int salary;
17 //a constructor with no arguments
18
19
20 public Employee() {
21 }
22
23 public int getId() {
24 return id;
25 }
26
27 public void setId(int id) {
28 this.id = id;
29 }
30
31 public String getFirstName() {
32 return firstName;
33 }
34
35 public void setFirstName(String firstName) {
36 this.firstName = firstName;
37 }
38
39 public String getLastName() {
40 return lastName;
41 }
42
43 public void setLastName(String lastName) {
44 this.lastName = lastName;
45 }
46
47 public int getSalary() {
48 return salary;
49 }
50
51 public void setSalary(int salary) {
52 this.salary = salary;
53 }
54 }
//创建EMPLOYEE表的sql语句是:
create table EMPLOYEE (
id INT NOT NULL auto_increment,
first_name VARCHAR(20) default NULL,
last_name VARCHAR(20) default NULL,
salary INT default NULL,
PRIMARY KEY (id)
);
首先在写一个配置文件:hibernate.cfg.xml用于连接数据库;
hibernate.cfg.xml的代码如下:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-5.0.dtd"> <hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">130850a,</property>
<property name="hibernate.connection.pool_size">10</property>
<property name="show_sql">true</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.current_session_context_class">thread</property> <mapping class="com.entity.Employee" /> </session-factory>
</hibernate-configuration>
在写一个用于启动Hibernate的util类:HibernateUtil的代码如下:
1 package com.util;
2 import org.hibernate.SessionFactory;
3 import org.hibernate.boot.Metadata;
4 import org.hibernate.boot.MetadataSources;
5 import org.hibernate.boot.registry.StandardServiceRegistry;
6 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
7 import org.hibernate.cfg.Configuration;
8 import org.hibernate.service.ServiceRegistry;
9 public class HibernateUtil {
10 private static final SessionFactory sessionFactory;
11
12 private static ServiceRegistry serviceRegistry;
13
14 static {
15 try {
16 StandardServiceRegistry standardRegistry =
17 new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build();
18 Metadata metaData =
19 new MetadataSources(standardRegistry).getMetadataBuilder().build();
20 sessionFactory = metaData.getSessionFactoryBuilder().build();
21 } catch (Throwable th) {
22
23 System.err.println("Enitial SessionFactory creation failed" + th);
24 throw new ExceptionInInitializerError(th);
25
26 }
27 }
28 public static SessionFactory getSessionFactory() {
29
30 return sessionFactory;
31
32 }
33 }
最后是分页查询的代码,代码如下:
package com.hibDemo; import com.entity.Employee;
import com.entity.Page;
import com.util.HibernateUtil;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction; import java.util.List; public class PaginationQuery { public void paginationByCriteria(){
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = sessionFactory.getCurrentSession();
Transaction tx=null;
try {
//do some work
tx=session.beginTransaction();
Page page = new Page();
/**
* 假设现在查询的是第一页,每页查询的最大记录数是3.
*/
page.setCurrentPage(1);
page.setPerPageRows(3);
Criteria criteria = session.createCriteria(Employee.class);
Integer currentPage = page.getCurrentPage();//得到当前页
Integer perPageRows = page.getPerPageRows();//得到每页的记录数:
/**
* 在Page类中我已说明了:每页开始的索引数在hibernate中的计算公式是:(currentPage-1)*perPageRows
*/
criteria.setFirstResult((currentPage-1)*perPageRows);
criteria.setMaxResults(perPageRows);
List<Employee> employees = criteria.list();
for(Employee employee:employees){
System.out.println("*********************");
System.out.println("id="+employee.getId()+" firstName="+employee.getFirstName()+" lastName="+employee.getLastName());
}
tx.commit(); } catch (Exception e) {
if(tx!=null){
tx.rollback();
}
e.printStackTrace();
} finally {
session.close();//关闭流,一定要关闭,不然会影响运行速度。
}
}
public static void main(String[] args) {
PaginationQuery paginationQuery = new PaginationQuery();
paginationQuery.paginationByCriteria();
}
}
总结:这个Page类为Hibernate中setFirstResult,和setMaxResult服务的,抓住这个就可以了。代码可以随便写。
Hibernate实现分页查询的更多相关文章
- hibernate 的分页查询
hibernate的分页查询有个好处,就是不用管数据库方言.比如db2的分页查询很麻烦,但是用hibernate的方式,就完全不用管这些了 /* 使用HQL分页查询Customer信息 */ publ ...
- Hibernate 条件-分页查询
这里我们继续跟着上一次的节奏继续学习Hibernate的查询. 1.条件查询一(占位符) 按照占位符的方式进行条件查询,这里query有一个setInteger(arg1, arg2)方法,其中第一个 ...
- 用Hibernate实现分页查询
分页查询就是把数据库中某张表的记录数进行分页查询,在做分页查询时会有一个Page类,下面是一个Page类,我对其做了详细的注解: package com.entity; /** * @author:秦 ...
- hibernate 实现分页查询语句、单条查询语句、多条查询语句、修改、删除语句
package com.hanqi.test; import java.util.Date; import java.util.List; import org.hibernate.Query; im ...
- Hibernate第十篇【Hibernate查询详解、分页查询】
前言 在Hibernate的第二篇中只是简单地说了Hibernate的几种查询方式-.到目前为止,我们都是使用一些简单的主键查询阿-使用HQL查询所有的数据-.本博文主要讲解Hibernate的查询操 ...
- 用Hibernate和Struts2+jsp实现分页查询、修改删除
1.首先用get的方法传递一个页数过去 2.通过Struts2跳转到Action 3.通过request接受主页面index传过的页数,此时页数是1, 然后调用service层的方法获取DAO层分页查 ...
- 【java】spring-data-jpa 集成hibernate实现多条件分页查询
初次接触spring-data-jpa,实现多条件分页查询. 基础环境 Spring Boot+spring-data-jpa+hibernate+mysql 1.接口 要继承这个接口,这个接口提供了 ...
- [原创]java WEB学习笔记90:Hibernate学习之路-- -HQL检索方式,分页查询,命名查询语句,投影查询,报表查询
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Hibernate分页查询小结
通常使用的Hibernate通常是三种:hql查询,QBC查询和QBE查询: 1.QBE(Qurey By Example)检索方式 QBE 是最简单的,但是功能也是最弱的,QBE的功能不是特别强大, ...
随机推荐
- 2020/2/12 PHP编程学习
感冒终于差不多好了.. 学了一天的tp框架商城开发,到此,一个小商城算是开发完了,写一个简单小总结吧233 首先说的编程方面,其实并没有质的提升orz,怎么可能几天就有大突破233 不过收获还是有的, ...
- 使用 this 关键字定义方法和属性
1.方法和属性的定义 属性是类中声明的变量,与其他地方变量的声明基本相同,只是属性必须 this 关键字,并且这里没有var 关键字. this.age; 在使用时,先是 this 关键字,之后的点语 ...
- POJ 2676:Sudoku 数独
Sudoku Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 15830 Accepted: 7737 Special ...
- Json字符串转Java对象和List集合
对象POJO和JSON互转 public class JsonUtil { /** * JSON 转 POJO */ public static <T> T getObject(Strin ...
- 18 12 28 css 浮动 定位
浮动 浮动特性 1.浮动元素有左浮动(float:left)和右浮动(float:right)两种 2.浮动的元素会向左或向右浮动,碰到父元素边界.其他元素才停下来 3.相邻浮动的块元素可以并在一行, ...
- CTF-域渗透--HTTP服务--命令注入1
开门见山 1. 扫描靶机ip,发现PCS 192.168.31.210 2. 用nmap扫描开放服务和服务版本 3. 再扫描全部信息 4. 探测http服务的目录信息 5. 再用dirb扫描 6. 查 ...
- Java固定资产管理系统 源码 jsp ssh
固定资产管理系统是对高校固定资产的一个信息化管理系统,基本功能包括:对固定资产的购进.接触.销毁,对物品的使用状态.借出状态.库存状态等进行标识,对各类物品进行编号,根据编号进行查询,根据名称进行查询 ...
- Aras Innovator如何配置SMTP中转Office365
参考文档:http://www.ebdadvisors.com/blog/2015/7/31/configure-an-smtp-server-in-windows-iis-for-aras-inno ...
- LCA--P3379 【模板】最近公共祖先(LCA)
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入格式 第一行包含三个正整数 N,M,S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来 N−1 行每行包含两个 ...
- sudo: /etc/sudoers is mode 0777, should be 0440 单用户 sudo不用输入密码的方法
sudo权限问题考察一题 su - sudo su - sudo su - test [root@localhost ~]# su - zzx #root用户进行切换不需要输入密码 [ ...