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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python range在for循环里的用法_PyThon range()函数中for循环用法「建议收藏」

    python range在for循环里的用法_PyThon range()函数中for循环用法「建议收藏」最初range和xrange都生成可以用for循环迭代的数字,然而在python2和3里实现方式并不完全一致,下面着重讲讲python3的range()函数for循环用法。1、函数语法range(start,stop,[step])2、参数说明start:可选参数,计数从start开始。默认是从0开始。例如range(5)等价于range(0,5)stop:必选参数,计数到st…

    2022年8月12日
    2
  • ipad越狱有什么坏处吗?_平板越狱有什么好处

    ipad越狱有什么坏处吗?_平板越狱有什么好处1. iPad越狱是什么?iPad越狱有什么好处和坏处?不越狱又有啥缺点?越狱就是解除一些原版固件的限制。最大的好处是可以安装激活成功教程的软件和游戏,这些软件和游戏本来都是收费的。而且,有些功能很强大的软件,并不是花钱能在官方的App Store里能买到的(某些有米之人或许会说“我就不越狱,我都花钱买正版”,我只能客气地说他只知其一不知其二),比如SBSettings, OpenSSH, Lockd

    2022年9月2日
    2
  • MBUS协议_ofdm调制原理框图

    MBUS协议_ofdm调制原理框图4.4slave设计传输特性:slaves被设计为具有两种不同恒定sink电流,因此在总线上电压有1V的变化的时候,sink电流的变化一定不能超过0.2%。为了传输一个Mark,一个单位负载被指定,一个单位负载由最大为1.5mA的恒定电流组成。如果slave需要更多的电流,就必须增加适当数量的单位负载。当发送一个space的时候,slave需要多增加11~20mA的电流消耗。Slave在接收…

    2022年10月15日
    0
  • java 添加 psd_psd缩略图生成上传解决方案「建议收藏」

    java 添加 psd_psd缩略图生成上传解决方案「建议收藏」第一点:Java代码实现文件上传FormFilefile=manform.getFile();StringnewfileName=null;Stringnewpathname=null;StringfileAddre=”/numUp”;try{InputStreamstream=file.getInputStream();//把文件读入StringfilePath=r…

    2022年6月11日
    48
  • android反编译apk_apk反编译找不到

    android反编译apk_apk反编译找不到反编译代码:1、解压apk得到class.dex2、dex2jar.bat class.dex3、用Javadecompiler查看编译出来的*.jar文件就可以看到代码反编译资源文件:1、apktool.bat d *.apk  APKTool是GOOGLE提供的APK编译工具,需要JAVA运行环境,推荐使用JDK

    2022年9月17日
    0
  • 多媒体开发之—h264 图像参数级语义

    多媒体开发之—h264 图像参数级语义

    2021年8月31日
    48

发表回复

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

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