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();
}
}

测试结果

在这里插入图片描述
[

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • mysql数据库中int类型的最大值_mysql自增主键最大值

    mysql数据库中int类型的最大值_mysql自增主键最大值1、mysql中int(11)中的11代表显示宽度整数列的显示宽度,与mysql需要用多少个字符来显示该列数值,与该整数需要的存储空间的大小都没有关系。比如,不管设定了显示宽度是多少个字符,bigint都要占用8个字节。a、int是整型,(11)是指显示字符的宽度,最大为255。b、int(11)是记录行数的id,插入10条记录,那么它就显示00000000001~~~00000000010。c…

  • k8s基础知识_k8s快速入门

    k8s基础知识_k8s快速入门K8S的基础学习,欢迎来访

  • mp4 文件中的h264 avc1格式介绍

    mp4 文件中的h264 avc1格式介绍转自:http://www.mworkbox.com/wp/work/314.htmlMP4的视频H264封装有2种格式:h264和avc1,对于这个细节,很容易被忽略。笔者也是在改编LIVE555流媒体时,增加mp4文件类型支持时遇到了该问题。(一)首先,从原理上了解一下这2种格式的区别:AVC1描述:H.264bitstreamwithoutstartcode

    2022年10月17日
  • 八数码问题简单解决办法

    八数码问题简单解决办法问题分析:八数码问题是一个经典的BFS问题,把棋局看成一个状态图,共有9!种状态。从初始棋局开始,每次转移到下个状态,直到目标棋局为止。仔细分析可知,八数码的关键是判重,如果不去除重复状态,程序会产生很多无效状态,从而复杂度大大增加解决算法:BFS+Cantor案例分析:(0表示空格所在位置)初始棋局:|1|2|3||0|8|4||7|6|5|目标棋局:|1|0|…

  • wannacry病毒作者_wannacry病毒利用了哪种漏洞

    wannacry病毒作者_wannacry病毒利用了哪种漏洞1.样本概况1.1样本信息病毒名称:Trojan-Ransom.Win32.Wanna.m所属家族:木马/勒索/蠕虫MD5:DB349B97C37D22F5EA1D1841E3C89EB4SHA1:E889544AFF85FFAF8B0D0DA705105DEE7C97FE26CRC32:9FBB12271.2测试环境及工具…

  • Brocade 光纤交换机级联配置「建议收藏」

    Brocade 光纤交换机级联配置「建议收藏」一、需求说明两台Brocade光纤交换机做级联二、检查级联许可:首先分别核查两台设备是都均具有级联License:1、通过licenseshow命令查看:三、更改DomainID修改switchdomainID,确保两台switch的domainID唯一1、运行switchshow命令确认当前的domainID:switch:admin>…

发表回复

您的电子邮箱地址不会被公开。

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