【Mybatis】Mybatis常见的分页实现方法 |
您所在的位置:网站首页 › 分页前端需要做什么工作 › 【Mybatis】Mybatis常见的分页实现方法 |
本文目录
引言关键字limit实现分页第一步:增加分页实体类第二步:增加分页方法第三步:测试代码
Interceptor Plugin实现分页PageHelper实现分页
引言
后台查询数据的时如果数据量较多需要对数据进行分页处理,Mybatis有多种方法能够实现数据分页, 最简单的就是利用原生的sql关键字limit来实现分页,也可以利用interceptor来拼接sql实现分页功能,还可以利用PageHelper开源框架来实现分页。 关键字limit实现分页首先创建一个Mybatis工程 【Spring】Spring整合Mybatis案例 工程结构如下: 第一步:增加分页实体类 public class Pager { private int page;//分页起始页 private int size;//每页记录数 private List data;//返回的记录集合 private long total;//总记录条数 public int getPage() { return page; } public void setPage(int page) { this.page = page; } public int getSize() { return size; } public void setSize(int size) { this.size = size; } public List getData() { return data; } public void setData(List data) { this.data = data; } public long getTotal() { return total; } public void setTotal(long total) { this.total = total; } @Override public String toString() { return "Pager{" + "page=" + page + ", size=" + size + ", data=" + data + ", total=" + total + '}'; } } 第二步:增加分页方法UserMapper中添加两个方法 @Repository("userMapper") @Mapper public interface UserMapper { List findUserByPage(Map map); long findUserCount(); }UserControl @Controller("userControl") public class UserControl { @Autowired UserMapper userMapper; public Pager findByUserPager(int page, int size){ Map params = new HashMap(); params.put("page", (page-1)*size); params.put("size", size); List list = userMapper.findUserByPage(params); Pager pager = new Pager(); pager.setData(list); pager.setTotal(userMapper.findUserCount()); return pager; } }UserMapper.xml select * from user limit #{page},#{size} select count(1) from user 第三步:测试代码 public class App { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); UserControl userControl = (UserControl) applicationContext.getBean("userControl"); Pager userPager = userControl.findByUserPager(1,10); userPager.setPage(1); userPager.setSize(10); System.out.println(userPager); } }结果如下: Interceptor Plugin实现分页首先定一个拦截器,拦截器会拦截所有以ByPage结尾的方法,然后拼接sql 语句的limit关键字实现分页 @Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})}) public class MyPageInterceptor implements Interceptor { private int page; private int size; @SuppressWarnings("unused") private String dbType; @SuppressWarnings("unchecked") @Override public Object intercept(Invocation invocation) throws Throwable { StatementHandler statementHandler = (StatementHandler) invocation.getTarget(); MetaObject metaObject = SystemMetaObject.forObject(statementHandler); while (metaObject.hasGetter("h")) { Object object = metaObject.getValue("h"); metaObject = SystemMetaObject.forObject(object); } while (metaObject.hasGetter("target")) { Object object = metaObject.getValue("target"); metaObject = SystemMetaObject.forObject(object); } MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement"); String mapId = mappedStatement.getId(); if (mapId.matches(".+ByPage$")) { ParameterHandler parameterHandler = (ParameterHandler) metaObject.getValue("delegate.parameterHandler"); Map params = (Map) parameterHandler.getParameterObject(); page = (int) params.get("page"); size = (int) params.get("size"); String sql = (String) metaObject.getValue("delegate.boundSql.sql"); sql += " limit " + (page - 1) * size + "," + size; metaObject.setValue("delegate.boundSql.sql", sql); } return invocation.proceed(); } @Override public Object plugin(Object target) { return Plugin.wrap(target, this); } @Override public void setProperties(Properties properties) { String limit = properties.getProperty("limit", "10"); this.page = Integer.parseInt(limit); this.dbType = properties.getProperty("dbType", "mysql"); } }修改controller的findByUserPager方法,拦截器已经自动帮我们算好了page和size的值 public Pager findByUserPager(int page, int size){ Map params = new HashMap(); params.put("page", page); params.put("size", size); List list = userMapper.findUserByPage(params); Pager pager = new Pager(); pager.setData(list); pager.setTotal(userMapper.findUserCount()); return pager; }UserMapper.xml select * from user select count(1) from userSpring配置文件中添加拦截器 运行结果同上 PageHelper实现分页还可以利用知名的Mybatis开源分页框架 PageHelper来实现分页,该方法无须自己实现拦截器 官网:https://github.com/pagehelper/Mybatis-PageHelper 首先pom.xml文件中引入依赖 com.github.pagehelper pagehelper 5.2.0修改Spring配置文件 params=value1修改UserControl的findByUserPager方法 @Controller("userControl") public class UserControl { @Autowired UserMapper userMapper; public Pager findByUserPager(int page, int size){ PageHelper.startPage(page,size); List list = userMapper.findUserByPage(); Pager pager = new Pager(); pager.setData(list); pager.setTotal(userMapper.findUserCount()); return pager; } }运行结果同上 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |