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


相关推荐

  • job 定时任务的五种创建方式 || xxl-job 定时任务调度中心「建议收藏」

    一、job定时任务的创建方式1、使用线程创建job定时任务/***TODO使用线程创建job定时任务*@author王松*@date2019/9/14001422:12*/publicclassJobThread{publicstaticclassDemo01{staticlongcount…

    2022年4月15日
    104
  • windows loader v2.2_Windows Modules Installer

    windows loader v2.2_Windows Modules Installer这是WindowsLoader最新版本,解决了Win7+Win8双系统情况下,Win7“软改”激活的失效异常。目前网上“软改”工具尽管不少但制作精良者不多。特别是制作技术精湛、支持版本众多的更是凤毛麟角。我对激活工具历来要求比较苛刻。今天向大家推荐的这款“软改”工具,支持包括Win7在内的MicrosoftWindows多版本永久激活。值得各位网友收藏使用。可对以下32位/64位…

    2022年10月12日
    0
  • SSM项目结构

    SSM项目结构SSM:Spring、SpringMVC和Mybatis,Spring是一个开源框架,用来解耦,方便实MVC;SpringMVC分离了控制器、模型对象、过滤器以及处理程序对象的角色,这种分离让它们更容易进行定制;MyBatis是一个基于Java的持久层框架,包括SQLMaps和DataAccessObjects(DAO),对数据库进行操作。SSM的项目结构:

    2022年6月17日
    90
  • CentOS 7 安装 LNMP 环境(PHP7 + MySQL5.7 + Nginx1.10)

    CentOS 7 安装 LNMP 环境(PHP7 + MySQL5.7 + Nginx1.10)

    2021年10月18日
    46
  • RTX3060安装pytorch

    RTX3060安装pytorchRTX3060安装pytorch1安装anaconda2查看本机显卡支持的cuda最高版本(2)根据pytorch版本选择要安装的CUDA(3)下载安装CUDA(4)下载cudNN(5)下载安装刚刚选择的pytorch版本前不久刚刚入手了一台新电脑,显卡为RTX3060,在安装环境的时候,踩了不少坑,现在将经验总结如下:1安装anaconda这个可以看这个教程:https://blog.csdn.net/in546/article/details/117400839需要注意的是,要记得添加到环

    2022年9月1日
    4
  • 2060s

    2060s2060s老版本三星核心:175显存:2030功耗:125算力:43+镁光核心:-400显存:1050功耗:125算力:37+升级系统后三星核心:1035显存:2030镁光核心:1035显存:1050

    2022年6月22日
    64

发表回复

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

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