对于使用Mybatis时,最头痛的就是写分页,需要先写一个查询count的select语句,然后再写一个真正分页查询的语句,当查询条件多了之后,会发现真不想花双倍的时间写count和select,所以这个时候我们可以使用Mybatis的分页插件pagehelper
1.首先架包的导入:https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper
2. 配置拦截器插件
<!--
plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:
properties?, settings?,
typeAliases?, typeHandlers?,
objectFactory?,objectWrapperFactory?,
plugins?,
environments?, databaseIdProvider?, mappers?
-->
<!-- 配置分页拦截器插件:拦截sql语句 -->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- 使用下面的方式配置参数,后面会有所有的参数介绍 -->
<property name="supportMethodsArguments" value="true"/>
</plugin>
</plugins>
接下来使用一个实例来测试:
实体类:
public class Emp {
private int empno;
private String ename;
private String job;
private int sal;
public int getSal() {
return sal;
}
public void setSal(int sal) {
this.sal = sal;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public int getEmpno() {
return empno;
}
public void setEmpno(int empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
@Override
public String toString() {
return "Emp [empno=" + empno + ", ename=" + ename + ", job=" + job + ", sal=" + sal + "]";
}
}
接口类:
public interface EmpMapper {
public List<Emp> queryEmp(String name);
public List<Emp> queryEmp1(String name,@Param("pageNum") int pageNum,@Param("pageSize") int pageSize);
}
测试类:
public class TestMybatis {
// 获取SqlSession对象
public static SqlSession getSession() {
/*这里的路径可能你门要改*/
String resource = "config.xml";
InputStream resourceAsStream = TestMybatis.class.getResourceAsStream(resource);
// session工厂 负责产生会话
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
// 会话就是打开了和数据库的链接
SqlSession openSession = sqlSessionFactory.openSession();
return openSession;
}
/**
*
* 物理分页(推荐使用)
*/
@Test
public void test() {
SqlSession session = getSession();
EmpMapper mapper = session.getMapper(EmpMapper.class);
// 参数是(页数,每页的数据量)
PageHelper.startPage(0, 3);
// 根据分页将查询出的数据存到List里面
List<Emp> queryEmp = mapper.queryEmp("%%");
System.out.println(queryEmp.size());
// 查询出总数据量
PageInfo pi = new PageInfo(queryEmp);
System.out.println(pi.getTotal());
}
/**
* 参数中的两个分页的值必须在接口中打上固定的别名
* 同时在configxml中的配置里配置属性:supportMethodsArguments=true
* 物理分页
*/
@Test
public void test1() {
SqlSession session = getSession();
EmpMapper mapper = session.getMapper(EmpMapper.class);
List<Emp> queryEmp1 = mapper.queryEmp1("%小%", 2, 10);
System.out.println(queryEmp1.size());
// 查询出总数据量
PageInfo pi = new PageInfo(queryEmp1);
System.out.println(pi.getTotal());
}
}
config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 这里是资源文件路径 -->
<properties resource="jdbc.properties"></properties>
<!-- 打印出运行日志 -->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>
<!-- 配置分页拦截器插件:拦截sql语句 -->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="supportMethodsArguments" value="true"/>
</plugin>
</plugins>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbcDriver}" />
<property name="url" value="${jdbcUrl}" />
<property name="username" value="${jdbcUsername}" />
<property name="password" value="${jdbcPassword}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/pk/lesson04/pagehelper/empMapping.xml"></mapper>
</mappers>
</configuration>
与接口对应的映射xml文件: empMapping.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">
<!-- 映射文件规范: namespace属性不能少 sql语句 >>查询 必须告知单行返回的类型 -->
<mapper namespace="com.pk.lesson04.pagehelper.EmpMapper">
<select id="queryEmp" resultType="com.pk.lesson04.pagehelper.Emp">
select * from emp where ename like #{0}
</select>
<select id="queryEmp1" resultType="com.pk.lesson04.pagehelper.Emp">
select * from emp where ename like #{0}
</select>
</mapper>