分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 运营维护

用Hibernate实现分页查询

发布时间:2023-09-06 01:21责任编辑:顾先生关键词: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 arguments18 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 }

首先在写一个配置文件: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 }

最后是分页查询的代码,代码如下:

 1 package com.hibDemo; 2 ?3 import com.entity.Employee; 4 import com.entity.Page; 5 import com.util.HibernateUtil; 6 import org.hibernate.Criteria; 7 import org.hibernate.Session; 8 import org.hibernate.SessionFactory; 9 import org.hibernate.Transaction;10 11 import java.util.List;12 13 public class PaginationQuery {14 15 ????public void paginationByCriteria(){16 ????????SessionFactory sessionFactory = HibernateUtil.getSessionFactory();17 ????????Session session = sessionFactory.getCurrentSession();18 ????????Transaction tx=null;19 ????????try {20 ????????????//do some work21 ????????????tx=session.beginTransaction();22 ????????????Page page = new Page();23 ????????????/**24 ?????????????* 假设现在查询的是第一页,每页查询的最大记录数是3.25 ?????????????*/26 ????????????page.setCurrentPage(1);27 ????????????page.setPerPageRows(3);28 ????????????Criteria criteria = session.createCriteria(Employee.class);29 ????????????Integer currentPage = page.getCurrentPage();//得到当前页30 ????????????Integer perPageRows = page.getPerPageRows();//得到每页的记录数:31 ????????????/**32 ?????????????* 在Page类中我已说明了:每页开始的索引数在hibernate中的计算公式是:(currentPage-1)*perPageRows33 ?????????????*/34 ????????????criteria.setFirstResult((currentPage-1)*perPageRows);35 ????????????criteria.setMaxResults(perPageRows);36 ????????????List<Employee> employees = criteria.list();37 ????????????for(Employee employee:employees){38 ????????????????System.out.println("*********************");39 ????????????????System.out.println("id="+employee.getId()+" firstName="+employee.getFirstName()+" lastName="+employee.getLastName());40 ????????????}41 ????????????tx.commit();42 43 ????????} catch (Exception e) {44 ????????????if(tx!=null){45 ????????????????tx.rollback();46 ????????????}47 ????????????e.printStackTrace();48 ????????} finally {49 ????????????session.close();//关闭流,一定要关闭,不然会影响运行速度。50 ????????}51 ????}52 ????public static void main(String[] args) {53 ????????PaginationQuery paginationQuery = new PaginationQuery();54 ????????paginationQuery.paginationByCriteria();55 ????}56 }

总结:这个Page类为Hibernate中setFirstResult,和setMaxResult服务的,抓住这个就可以了。代码可以随便写。

用Hibernate实现分页查询

原文地址:http://www.cnblogs.com/1540340840qls/p/7749646.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved