Mybatis分页查询(通过SQL分页实现)[通俗易懂]

Mybatis分页查询(通过SQL分页实现)[通俗易懂]Mybatis分页查询(通过SQL分页实现)前言实现有哪几种方式:网页分页(一次查询所有数据,加载到网页,那么适合数量小的操作)服务器端分页java程序中查询所有数据,网页需要哪一页,就给哪一页数据,会撑爆java服务器,建议查询缓存优化数据库分页请求一页数据,查询数据库即可本文采用Oracle中的rownum实现分页,数据表使用Oracle中Scott的EMP表一、搭建环境目录结构导入jar包mybatis-3.2.7.jarojdbc6.jar数

大家好,又见面了,我是你们的朋友全栈君。

Mybatis分页查询(通过SQL分页实现)

前言

实现有哪几种方式:

  1. 网页分页

    (一次查询所有数据,加载到网页,那么适合数量小的操作)

  2. 服务器端分页

    java程序中查询所有数据,网页需要哪一页,就给哪一页数据,会撑爆java服务器,建议查询缓存优化

  3. 数据库分页

    请求一页数据,查询数据库即可

本文采用Oracle中的rownum实现分页,数据表使用Oracle中Scott的EMP表

一、搭建环境

目录结构

在这里插入图片描述

  1. 导入jar包

    mybatis-3.2.7.jar
    ojdbc6.jar

  2. 数据库配置文件(db.properties)

    db.driver=oracle.jdbc.driver.OracleDriver
    db.url=jdbc:oracle:thin:@10.25.164.149:1521:orcl
    db.username=scott
    db.password=123456
    
  3. mybatis-config.xml

    <environments default="development">
        <environment id="development">
          <transactionManager type="JDBC"/>
          <dataSource type="POOLED">
            <property name="driver" value="${db.driver}"/>
            <property name="url" value="${db.url}"/>
            <property name="username" value="${db.username}"/>
            <property name="password" value="${db.password}"/>
          </dataSource>
        </environment>
        
    
      </environments>
      <mappers>
      <!-- 这是映射文件,一个表一个,我们的sql就写在这里 -->
        <mapper resource="config/EmpMapper.xml"/>
      </mappers>
    </configuration>
    
    
  4. MybatisUtils.java

    package net.neuedu.mybatis3.util;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    
    public class MybatisUtils { 
         
    	
    	private static SqlSessionFactory sqlSessionFactory;
    	
    	static
    	{ 
         
    		String resource = "config/mybatis-config.xml";
    		
    		InputStream inputStream=null;
    		try { 
         
    			inputStream = Resources.getResourceAsStream(resource);
    		} catch (IOException e) { 
         
    			e.printStackTrace();
    		}finally
    		{ 
         
    		}
    		sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
    		
    	}
    	
    	public static SqlSession getSqlSession()
    	{ 
         
    		SqlSession sqlSession=null;
    		
    		sqlSession=sqlSessionFactory.openSession();
    		
    		return sqlSession;
    	}
    
    }
    

二、创建实体类

Emp.java

package net.neuedu.mybatis3.domain;

import java.math.BigDecimal;
import java.util.Date;

public class Emp { 
   
	 private Integer empno;private String ename;private String job;private Short mgr;private Date hiredate;private BigDecimal sal;private BigDecimal comm;

  // private Short deptno;


​	   

​    public Integer getEmpno() { 
   return empno;}@Overridepublic String toString() { 
   return "Emp [empno=" + empno + ", ename=" + ename + ", job=" + job

   + ", mgr=" + mgr + ", hiredate=" + hiredate + ", sal="

        + sal + ", comm=" + comm + "]";
          }

     public void setEmpno(Integer empno) { 
   
     	this.empno = empno;
     }

     public String getEname() { 
   
     return ename;
         }public void setEname(String ename) { 
   this.ename = ename == null ? null : ename.trim();}public String getJob() { 
   return job;}public void setJob(String job) { 
   this.job = job == null ? null : job.trim();}public Short getMgr() { 
   return mgr;}public void setMgr(Short mgr) { 
   this.mgr = mgr;}public Date getHiredate() { 
   return hiredate;}public void setHiredate(Date hiredate) { 
   this.hiredate = hiredate;}public BigDecimal getSal() { 
   return sal;}public void setSal(BigDecimal sal) { 
   this.sal = sal;}public BigDecimal getComm() { 
   return comm;}public void setComm(BigDecimal comm) { 
   this.comm = comm;}

// public Short getDeptno() { 
   
// return deptno;
// }
//
// public void setDeptno(Short deptno) { 
   
// this.deptno = deptno;
// }
}

三、EmpMapper接口

public interface EmpMapper { 
   
/** * 查询员工表中一共有多少条数据 * @return */
public Integer selectSize();

/** * 分页查询 * @param pageUtil * @return */
public List<Emp> selectEmpByPage(PageUtil pageUtil);}

四、分页工具类

PageUtil.java

package net.neuedu.mybatis3.domain;



/** * 具体功能:告诉他每页显示几条数据,和一共有多少数据,还有显示第几页数据,它帮我们算出需要分多少页,每页的起始索引 * @author hp * */
public class PageUtil { 
   
	
	public final static int PAGECOUNT=3;//每页显示几条数据 3
	private int pageNumber;//显示第几页数据 1
	private int size;// 一共有多少条数据 3
	private int startIndex;//对应页面开始的索引 include
	private int endIndex;//对应页面结束的索引 不包含
	private int pageNums;//一共有多少页
	
	
	@Override
	public String toString() { 
   
		return "PageUtil [pageCount=" + PAGECOUNT + ", pageNumber="
				+ pageNumber + ", size=" + size + ", startIndex=" + startIndex
				+ ", endIndex=" + endIndex + ", pageNums=" + pageNums + "]";
	}

	/** * 构造方法:需要三个参数,每页显示几条数据,一共有多少条数据,显示第几页数据 * @param pageCount * @param size * @param pageNumber */
	public PageUtil(int pageCount,int size,int pageNumber)
	{ 
   
		//根据参数给对应属性赋值
		this.pageNumber=pageNumber;
		this.size=size;
		
		//帮我们算出需要分多少页,每页的起始索引
		this.pageNums=size%pageCount==0?size/pageCount:size/pageCount+1;
		this.startIndex=this.PAGECOUNT*(pageNumber-1)+1;//0
		
		if(pageNumber==pageNums)//如果请求页码刚好是最后一页,那么结束索引要好好计算一下
		{ 
   
			this.endIndex=size;
		}else { 
   
			this.endIndex=this.PAGECOUNT*pageNumber; 
		}
		
		//处理pageNumber=0的情况
		if(pageNumber==0)
		{ 
   
			this.startIndex=0;
			this.endIndex=0;
		}
	}
	
	public static void main(String[] args) { 
   
		PageUtil pageUtil=new PageUtil(10, 3,1);//13页, 10-20
		System.out.println(pageUtil);
	}
	
	
	public int getPageNumber() { 
   
		return pageNumber;
	}
	public void setPageNumber(int pageNumber) { 
   
		this.pageNumber = pageNumber;
	}
	public int getSize() { 
   
		return size;
	}
	public void setSize(int size) { 
   
		this.size = size;
	}
	public int getStartIndex() { 
   
		return startIndex;
	}
	public void setStartIndex(int startIndex) { 
   
		this.startIndex = startIndex;
	}
	public int getEndIndex() { 
   
		return endIndex;
	}
	public void setEndIndex(int endIndex) { 
   
		this.endIndex = endIndex;
	}
	public int getPageNums() { 
   
		return pageNums;
	}
	public void setPageNums(int pageNums) { 
   
		this.pageNums = pageNums;
	}
}

五、SQL实现分页

EmpMapper.xml

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="net.neuedu.mybatis3.mapper.EmpMapper">
    <!--查询员工表中一共有多少条数据 public Integer selectSize(); -->
    <select id="selectSize" resultType="Integer">select count(1) from emp</select>
    <!-- /** * 分页查询 * @param pageUtil * @return */ -->      
    <select id="selectEmpByPage" parameterType="PageUtil" resultType="Emp"> 
        select ee.*      from      
        (select e.*,rownum rn from emp e       
        where rownum<![CDATA[<=]]>#{endIndex}) ee      
        where ee.rn>=#{startIndex}   
    </select>  
</mapper>

测试

package test;

import java.util.List;

import net.neuedu.mybatis3.domain.Emp;
import net.neuedu.mybatis3.domain.PageUtil;
import net.neuedu.mybatis3.mapper.EmpMapper;
import net.neuedu.mybatis3.util.MybatisUtils;

import org.apache.ibatis.session.SqlSession;

public class TestPageSQL { 
   

	public static void main(String[] args) { 
   
		
		SqlSession sqlSession=MybatisUtils.getSqlSession();
		
		EmpMapper mapper=sqlSession.getMapper(net.neuedu.mybatis3.mapper.EmpMapper.class);
		//查询员工表中一共有多少条数据
		Integer size=mapper.selectSize();
		//实例化分页工具类,它会帮我们算出开始索引和结束索引
		PageUtil pageUtil=new PageUtil(3, size, 5);
		//分页查询
		List<Emp> list=mapper.selectEmpByPage(pageUtil);
		
		System.out.println(list.toString());
		
		sqlSession.close();

	}

}

测试结果

在这里插入图片描述
[

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/140939.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SpringBoot集成Quartz动态定时任务「建议收藏」

    SpringBoot自带schedule沿用的springboot少xml配置的优良传统,本身支持表达式等多种定时任务注意在程序启动的时候加上@EnableScheduling@Scheduled(cron="0/5****?")publicvoidjob(){System.out.println("每五秒执行一次");}…

    2022年4月17日
    48
  • 面试官:MySQL索引底层数据结构原理与性能调优,你能回答多少?「建议收藏」

    面试官:MySQL索引底层数据结构原理与性能调优,你能回答多少?「建议收藏」面试官:听说你精通MySQL,那来和我大战三百个回合吧!

    2022年6月24日
    23
  • mysql 读写分离_详解MySQL读写分离

    mysql 读写分离_详解MySQL读写分离主从复制的原理MySQL的主从复制和读写分离两者有着紧密的联系,首先要部署主从复制,只有主从复制完成了才能在此基础上进行数据的读写分离。读写分离的原理简单来说,读写分离就是只在主服务器上写,只在从服务器上读。基本原理是让主数据库处理事务性查询,而从服务器处理select查询。数据库复制被用来把事务性查询导致的变更同步到从数据库中。基于中间代理层实现:代理一般位于客户端和服务器之间,代理服务器接到客…

    2022年4月29日
    47
  • qt通过OpenGL实现3d游戏开发框架

    qt通过OpenGL实现3d游戏开发框架开发环境:win8编程语言c++IDE:QtCreatoropengl版本:opengles3.0(可编程渲染管线,着色器语言)OpenGLES(OpenGLforEmbeddedSystems)是OpenGL三维图形API的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。该API由Khronos集团定义推广,Khronos是一个图形软硬件行业协会,…

    2022年5月25日
    34
  • java根据经纬度计算距离_java经纬度转换xy坐标公式

    java根据经纬度计算距离_java经纬度转换xy坐标公式反余弦计算方式:privatestaticfinaldoubleEARTH_RADIUS=6371000;//平均半径,单位:m;不是赤道半径。赤道为6378左右publicstaticdoublegetDistance(Doublelat1,Doublelng1,Doublelat2,Doublelng2){//经纬度(角度)转弧度。弧度用作参数,以调用Math…

    2022年9月23日
    2
  • 同济大学 线性代数 第六版 pdf_【课后习题答案】工程数学线性代数同济第六版+课后习题答案…

    同济大学 线性代数 第六版 pdf_【课后习题答案】工程数学线性代数同济第六版+课后习题答案…资料介绍本次分享资源内容为工程数学线性代数(第六版)课后习题答案教材:工程数学线性代数(第六版)作者:同济大学数学系编出版社:高等教育出版课后习题答案第一章行列式第二章矩阵及其运算第三章矩阵的初等变换与线性方程组第四章向量组的线性相关性第五章相似矩阵及二次型第六章线性空间与线性变换温馨提示:1、资料下载链接如有失效请联系小编获取最新链接!2、声明:上述资料…

    2022年7月25日
    14

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号