MyBatis的分页插件的使用
2018/10/29 09:26 分类: 技术交流 浏览:81
我们平时在做练习或者写项目的时候,经常要用到数据的分页展示功能,分页功能可以分为前台分页和后台分页,作为后端开发的我们,最经常用到的就是后端分页了。不同的数据库对数据的分页查询都有不同的语法支持,下面我们先简单介绍一下Mysql对分页的支持。
一、MySql对分页的支持
简单来说,MySql对分页的支持是通过limit子句实现的,如下所示:
语法:
LIMIT [offset,] rows
offset:指的是首行的索引(从0开始)
rows:是返回的条数
举例:
1、查询第一页数据,每页显示10条
select * from tableName limit 0,10;
2、查询第二页数据,每页显示20条
select * from tableName limit 1,10;
总结:
现在我们使用pageNum(第几页)和pageSize(每页显示多少条)来得出一个公式:
limit (pageNum-1)*pageSize,pageSize
二、原始的MyBatis分页实现
在我们使用Java操作数据库的时候,使用起来最便利的便是MyBatis这个持久层框架了。但是在使用MyBatis进行分页的时候,MyBatis并没有向JPA那样提供给我们什么快捷的做法,我们必须自己在sql后面写limit子句,而且一个分页查询我们通常要写两条sql语句,开发成本较高。
代码清单一:UserMapper.java
public interface UserMapper {
/**
* 查询总数
* @return 总条目数
*/
Long count();
/**
* 分页查询
* @param start limit的第一个参数
* @param end limit的第二个参数
* @return
*/
List<User> listPage(@Param("start")int start,@Param("end")int end);
}
代码清单二:UserMapper.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="cn.itsource.mybatis.mapper.UserMapper">
<!-- 查询总条目数 -->
<select id="count" resultType="long">
select count(*) from t_user
</select>
<!-- 分页查询 -->
<select id="listPage" resultType="User">
select * from t_user
limit #{start},#{end}
</select>
</mapper>
代码清单三:MyBatisTest.java
public class MyBatisTest {
private SqlSessionFactory factory;
/**
* 测试方法执行前创建factory对象
*/
@Before
public void before() {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
factory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 测试MyBatis的分页
* @throws Exception
*/
@Test
public void testListPage() throws Exception {
SqlSession session = factory.openSession();
//获取代理Mapper对象
UserMapper userMapper = session.getMapper(UserMapper.class);
//总条目数:
long total = userMapper.count();
//当前页的数据
int pageNum=1,pageSize=10;
List<User> rows = userMapper.listPage((pageNum-1)*pageSize, pageSize);
for (User user : rows) {
System.out.println(user);
}
}
}
总结:使用MyBatis做分页的时候我们需要写很多分页相关的代码,这样大大降低我们的开发效率。而MyBatis的拦截器给我们扩展MyBatis提供了入口,所以,我们可以通过使用MyBatis的插件来实现一个分页功能。
三、使用MyBatis的分页插件实现分页功能
我们使用的MyBatis的分页插件叫PageHelper,配置和使用起来都很简单,具体的使用步骤如下。
导入依赖
maven:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.4</version>
</dependency>
配置分页插件
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
在Spirng配置文件中配置分页插件:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注意其他配置 -->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageHelper">
<property name="properties">
<value>
<!-- 你使用的数据库类型 -->
dialect=mysql
reasonable=true
</value>
</property>
</bean>
</array>
</property>
</bean>
测试
代码清单四:UserMapper.java
public interface UserMapper {
/**
* 查询总数
* @return
*/
List<User> list();
}
代码清单五:UserMapper.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="cn.itsource.mybatis.mapper.UserMapper">
<!-- 查询总数 -->
<select id="list" resultType="User">
select * from t_user
</select>
</mapper>
代码清单六:MyBatisTest.java
public class MyBatisTest {
private SqlSessionFactory factory;
/**
* 测试方法执行前创建factory对象
*/
@Before
public void before() {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
factory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 测试MyBatis的分页
* @throws Exception
*/
@Test
public void testListPage() throws Exception {
SqlSession session = factory.openSession();
//获取代理Mapper对象
UserMapper userMapper = session.getMapper(UserMapper.class);
int pageNum = 1;
int pageSize = 10;
Page<User> page = PageHelper.startPage(pageNum, pageSize);
//查询
//当前页的数据
List<User> rows = userMapper.list();
//总条目数
long total = page.getTotal();
}
}
总结:从上面的实例代码可以看出,使用MyBatis的分页插件大大简化了我们的分页代码,提高了程序员的开发效率。
赞 0