使用SpringMVC+Spring+Mybatis-PageHelper实现翻页功能
一.翻页功能实现的简单工具类以及插件整合准备
Page类
public class Page<E> {
//当前页
private int pageNum;
//每页显示条数
private int pageSize;
//总页数
private int totalPage;
//总记录
private int totalRecord;
//当前页所有数据
private List<E> list;
public Page() {
super();
}
public Page(int pageNum, int pageSize, int totalPage, int totalRecord,
List<E> list) {
super();
this.pageNum = pageNum;
this.pageSize = pageSize;
this.totalPage = totalPage;
this.totalRecord = totalRecord;
this.list = list;
}
get,set....
}
插件整合准备
架包
Mybatis整合
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库 -->
<property name="diaect" value="mysql" />
</plugin>
</plugins>
只需在mybatis.xml文件中加入插件配置,可以看得出插件其实是个拦截器,即,在调用数据接口时,拦截器会对sql语句进行二次编写(改写)。
二.数据层
dao层结构和Mybatis mapper文件
接口
public interface UserService {
/**
* 查询某一个用户信息
* @return
*/
public User selectOne(String id);
/**
* search all
* @return a list of user
*/
public List<User> selectAll();
}
mapper文件
<?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="com.gree.dao.UserDao">
<!-- 根据id查询得到一个user对象 -->
<select id="selectOne" parameterType="int" resultType="com.gree.model.User">
select *from tb_user where id=#{id};
</select>
<!-- 查询全部用户 -->
<select id="selectAll" resultType="com.gree.model.User">
select *from tb_user
</select>
</mapper>
三.业务层(service层)
接口UserService.java
public interface UserService {
/**
* 查询某一个用户信息
* @return
*/
public User selectOne(String id);
/**
* search all
* @return a list of user
*/
public List<User> selectAll();
}
实现类UserServiceImple.java
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public User selectOne(String id) {
// TODO Auto-generated method stub
return userDao.selectOne(id);
}
@Override
public List<User> selectAll() {
// TODO Auto-generated method stub
return userDao.selectAll();
}
//不带条件翻页
public Page<User> selectAllLimit(Integer pageNum,Integer pageSize){
//使用插件进行翻页
PageHelper.startPage(pageNum,pageSize);
//默认会对紧跟在后面的第一个数据库查询进行翻页
List<User> list=this.selectAll();
//需将查询到的结果list交给PageInfo(此时list中的数据是加了limit的部分数据,而非全部)
PageInfo<User> info=new PageInfo<User>(list);
//通过info属性可以以次获取:当前页,每页显示条数,总页数,总记录等。。。
Page<User> page=new Page<User>(info.getPageNum(),info.getPageSize(),info.getPages(),(int)info.getTotal(),list);
return page;
}
}
在实现类中增加了PageHelper类行进插件翻页,同时用PageInfo类对翻页的一些必要数据进行计算封装。(在不使用翻页插件时,要手动计算一些必要的数据)。
四.Web层(Controller层)
UserController类
@Controller
public class UserController {
@Autowired
private UserServiceImpl userimpl;
@RequestMapping(value="/getPage/{pageNum}/{pageSize}",method=RequestMethod.GET)
@ResponseBody
public Page<User> selectUserLimit(@PathVariable("pageNum") Integer pageNum,@PathVariable("pageSize") Integer pageSize){
return userimpl.selectAllLimit(pageNum, pageSize);
}
}
五.通过Postman调试接口,以及数据库日志
接口调试
数据库日志
通过日志可以看出插件已经编写了两条sql语句,select count(*), select *.......limit.而在mapper文件中我们只需要编写简单的select *from tb_user,即插件会对我们编写的sql语句进行二次编写。
六.总结
当使用了插件进行翻页时,省去了mapper文件多次编写查询语句(select count(*)...........)。以及在封装翻页工具类时的烦人计算,可以通过PageInfo直接获取。
一些插件注意事项,和细节: