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


相关推荐

  • redisson读写锁使用场景_Redisson酒店

    redisson读写锁使用场景_Redisson酒店读写锁一次只有一个线程可以占有写模式的读写锁,但是可以有多个线程同时占有读模式的读写锁.正是因为这个特性,当读写锁是写加锁状态时,在这个锁被解锁之前,所有试图对这个锁加锁的线程都会被阻塞.当读写锁在读加锁状态时,所有试图以读模式对它进行加锁的线程都可以得到访问权,但是如果线程希望以写模式对此锁进行加锁,它必须直到所有的线程释放锁.通常,当读写锁处于读模式锁住状态时,如果有另外线程试图以写模式加锁,读写锁通常会阻塞随后的读模式锁请求,这样可以避免读模式锁长期占用,而等待的写模式

    2022年8月12日
    8
  • 最近程序员频繁被抓,如何避免面向监狱编程!?「建议收藏」

    最近程序员频繁被抓,如何避免面向监狱编程!?「建议收藏」最近,有关程序员因为参与某些项目开发导致被起诉,甚至被判刑的事件发生的比较多:某程序员因为接了个外包,帮别人写了个软件,结果这个软件被用于赌博导致被抓。某公司利用爬虫抓取用户信息,最后被发现,导致该公司的程序员被抓。某P2P公司暴雷,老板跑路,程序员被抓。中科大博士卖“外挂”非法牟利300多万,被警方逮捕。那么,作为一个程序员,如何避免这些坑呢?怎样尽可能的保护自己呢?本文就从爬虫、赌…

    2022年6月9日
    30
  • Gstreamer中加入�x265编解码器

    Gstreamer中加入�x265编解码器

    2021年12月6日
    53
  • Redis学习——redis.conf 配置文件介绍

    学以致用 学在用前参看文章: redis.conf配置详细解析 redis.conf 配置详解 Redis配置文件详解(redis.conf)-云栖社区在Redis的使用过程,除了知道对Redis五种数据类型的操作方法之外,最主要额就是对redis.conf进行配置了,下面整理出redis.conf中常见的一些配置介绍。 参数说明 redis.conf 配置项说…

    2022年2月26日
    48
  • Linux基础命令—shutdown

    Linux基础命令—shutdown

    2021年6月15日
    119
  • Mysql中的关联查询(内连接,外连接,自连接)

    Mysql中的关联查询(内连接,外连接,自连接)在使用数据库查询语句时,单表的查询有时候不能满足项目的业务需求,在项目开发过程中,有很多需求都是要涉及到多表的连接查询,总结一下mysql中的多表关联查询一,内连接查询是指所有查询出的结果都是能够在连接的表中有对应记录的。以t_employee(员工表)和t_dept(部门表)为例:t_employee表中的记录如下:dept代表该员工所在的部门t_dept表中记录

    2022年5月24日
    30

发表回复

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

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