Mybatis使用之分页
一:简介
注:示例基于mysql数据库。Oracle可以自行测试。
使用Mybatis分页主要有两种方式、一种是将分页参数传递到配置文件中、在写sql的时候就做分页。另一种是使用Mybatis的拦截器拦截需要分页的sql语句、重新组装成具有分页功能的sql语句。
分页查询的关键在于查询时需要告诉数据库从第几条开始取、取多少条记录。也就是常用到Page对象(一般是方便传递参数、自己构建的实体类)的pageNumer、pageSize两个主要参数。至于Page对象的总记录数等是需要带到前台构造数据展示表格时使用的参数。
二:传递参数形式的分页
2.1 关键点
传递参数形式的分页就是将分页信息以参数的形式传递到映射文件中、这样就可以在编写具体的sql语句时实现分页功能。这种方式的重点在于一般的查询语句都会带有一个或者多个查询参数、而'select'标签的parameterType只能接收一个值。所以需要我们将查询参数与分页参数组装成一个Map作为参数传递到映射语句中。
不过前台展示所需要的数据总数还需要另写一条count查询语句来获取。多多少少会有些不便。
2.2 具体代码
映射文件:
<select id="selectAuthorWithPageParam"resultType="author" parameterType="hashMap">
SELECT
t.id,
t.username,
t.password,
t.email,
t.bio,
t.favourite_section favouriteSection
FROM author t
WHERE t.username = {username} AND t.password = {password} limit {page.dbIndex},{page.dbNumber}
</select>
映射接口:
List<Author> selectAuthorWithPageParam(Map<String, Object>map);
测试代码:
@Test
public void testSelectAuthorWithPageParam() throws Exception {
Page page = new Page();
page.count();
Map<String, Object> map = new HashMap<>();
map.put("page", page);
map.put("username", "alien");
map.put("password","alien");
List<Author> authors =this.authorMapper.selectAuthorWithPageParam(map);
Assert.assertEquals(5, authors.size());
}
三:拦截器分页
3.1 关键点
拦截器实现分页的关键之处在于、在需要分页的sql语句执行之前、拦截下来并改造成具有分页功能的sql语句(还可以查询一下总数、设置到Page