一、pagehelper
场景
使用MyBatis进行数据库查询,当数据量大时,一般都需要分页查询;这时可以自己手写sql语句,传入当前页pageNum 和 每页数量 pageSize,自己封装ResultMap。但这样做非常麻烦,特别是开发需求多的时候,这样的操作显然有点累赘。这时候就可以使用一个非常好用的MyBatis分页工具PageHelper。
环境
本次示例使用的是Spring Boot2.x + MyBatis;先引用一下关键依赖
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.3.1</version> <exclusions> <exclusion> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.4</version> <exclusions> <exclusion> <artifactId>mybatis-spring</artifactId> <groupId>org.mybatis</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.0</version> </dependency>
PS:mybatis-spring-boot-starter 依赖最好使用版本标签指定版本<version>,而不是依靠<parent>标签,因为pagehelper的依赖会自动引用mybatis-spring-boot-starter,这时会有冲突的。但如果自己规定版本标签后,则不回冲突。这种bug因人而异,在此仅做记录。
配置
(本次示例使用的时spring boot 的yml配置。且省略MyBatis相关配置)
在application.yml配置文件中,添加:
#pagehelper相关配置 pagehelper: helperDialect: mysql reasonable: true supportMethodsArguments: true params: count=countSql returnPageInfo: check
使用
controller层Api
1 @RequestMapping(value = "/getAll") 2 @ResponseBody 3 public List<TUser> getAll(Integer pageNumber, Integer pageSize) { 4 //使用PageHelper,传入当前页数pageNumber,默认第一页为 1; 每页数量 pageSize 5 PageHelper.startPage(pageNumber, pageSize); 6 //直接调用请求Mapper的方法 7 List<TUser> list = tUserService.getAll(); 8 //将Mapper 返回的List 放入 PageInfo对象中获取分页信息page 9 PageInfo<TUser> page = new PageInfo<>(list); 10 log.info("总数total=" + page.getTotal()); 11 return list; 12 }
service层实现
1 @Service 2 public class TUserServiceImpl implements TUserService { 3 4 @Autowired 5 TUserMapper tUserMapper; 6 7 @Override 8 public List<TUser> getAll() { 9 return tUserMapper.findAll(); 10 } 11 }
dao层接口
1 @Repository 2 public interface TUserMapper { 3 List<TUser> findAll(); 4 }
mapper.xml
1 <select id="findAll" resultType="com.kellan.demo.model.TUser"> 2 select 3 id, name, sex, create_time, last_time 4 from t_user 5 </select>
基础分析
日志输出sql语句
==> Preparing: SELECT count(0) FROM t_user ==> Parameters: <== Total: 1 ==> Preparing: select id, name, sex, create_time, last_time from t_user LIMIT ? ==> Parameters: 2(Integer) <== Total: 2
1、由日志可以看出,在使用PageHelper.startPage 方法之后,使用MyBatis拦截器,拦截对应的mapper方法,输出的sql语句会多了一个搜索语句
SELECT count(0) FROM t_user
从而获得分页总数,也可以自定义sql语句,在对应mapper.xml中增加{所要执行的方法名}_COUNT,即会执行{所要执行的方法名}_COUNT这个方法。例如例子中我们要执行findAll方法,可自定义findAll_COUNT方法作为获取总数的方法,pagehelper会提前判断是否存在自定义得获取总数的方法来看是自动生成还是采用自定义方法
2.可以从输出sql语句看出,pagehelper所做的事其实就是在sql后面添加了Limt语句,在第一页的时候添加limit {count},在大于第一页时添加limit {offset}, {count}
3.
返回的list需要放到PageInfo对象中获取分页信息,这是因为使用PageHelper之后,执行返回的结果是一个Page对象,而Page对象继承了ArrayList。所以将返回结果的list置于PageInfo中,可通过强转Page对象来获取对应信息。(有兴趣的可以研究下源码,这里不详说)
二、mybatis-plus