028-86261949

当前位置:首页 > 技术交流 > MyBatis的分页插件的使用

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的分页插件大大简化了我们的分页代码,提高了程序员的开发效率。

#标签:Java,源码时代,源码时代重庆校区,重庆IT培训,重庆Java,重庆Java培训机构,Java培训,重庆Java培训,Java编程,MyBatis