zoukankan      html  css  js  c++  java
  • Mybatis 分页查询


    该篇博客记录采用pagehelper分页插件实现Mybatis分页功能
    一、依赖
    • pom.xml
    <!-- pagehelper -->
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper-spring-boot-starter</artifactId>
        <version>1.2.5</version>
    </dependency>
    
    二、配置
    • application.yml
    # pagehelper
    pagehelper:
       helperDialect: mysql
       reasonable: true
       supportMethodsArguments: true
    params: count=countSql
    
    • CURD通用接口封装
    public interface CurdService<T> {
        /**
         * 分页查询
    	 * 这里统一封装了分页请求和结果,避免直接引入具体框架的分页对象, 如MyBatis或JPA的分页对象
    	 * 从而避免因为替换ORM框架而导致服务层、控制层的分页接口也需要变动的情况,替换ORM框架也不会
    	 * 影响服务层以上的分页接口,起到了解耦的作用
    	 * @param pageRequest 自定义,统一分页查询请求
    	 * @return PageResult 自定义,统一分页查询结果
         */
    	PageResult findPage(PageRequest pageRequest);
    }
    
    • 分页请求封装
    public class PageRequest {
    	/**
    	 * 当前页码
    	 */
    	private int pageNum = 1;
    	/**
    	 * 每页数量
    	 */
    	private int pageSize = 10;
    	/**
    	 * 查询参数
    	 */
    	private Map<String, Object> params = new HashMap<>();
    	
    	public int getPageNum() {
    		return pageNum;
    	}
    	public void setPageNum(int pageNum) {
    		this.pageNum = pageNum;
    	}
    	public int getPageSize() {
    		return pageSize;
    	}
    	public void setPageSize(int pageSize) {
    		this.pageSize = pageSize;
    	}
    	public Map<String, Object> getParams() {
    		return params;
    	}
    	public void setParams(Map<String, Object> params) {
    		this.params = params;
    	}
    	public Object getParam(String key) {
    		return getParams().get(key);
    	}
    }
    
    • 分页结果封装
    public class PageResult {
    	/**
    	 * 当前页码
    	 */
    	private int pageNum;
    	/**
    	 * 每页数量
    	 */
    	private int pageSize;
    	/**
    	 * 记录总数
    	 */
    	private long totalSize;
    	/**
    	 * 页码总数
    	 */
    	private int totalPages;
    	/**
    	 * 分页数据
    	 */
    	private List<?> content;
    	public int getPageNum() {
    		return pageNum;
    	}
    	public void setPageNum(int pageNum) {
    		this.pageNum = pageNum;
    	}
    	public int getPageSize() {
    		return pageSize;
    	}
    	public void setPageSize(int pageSize) {
    		this.pageSize = pageSize;
    	}
    	public long getTotalSize() {
    		return totalSize;
    	}
    	public void setTotalSize(long totalSize) {
    		this.totalSize = totalSize;
    	}
    	public int getTotalPages() {
    		return totalPages;
    	}
    	public void setTotalPages(int totalPages) {
    		this.totalPages = totalPages;
    	}
    	public List<?> getContent() {
    		return content;
    	}
    	public void setContent(List<?> content) {
    		this.content = content;
    	}
    }
    
    • 分页助手封装
    public class MybatisPageHelper {
    
    	public static final String findPage = "findPage";
    	
    	/**
    	 * 分页查询, 约定查询方法名为 “findPage” 
    	 * @param pageRequest 分页请求
    	 * @param mapper Dao对象,MyBatis的 Mapper	
    	 * @param args 方法参数
    	 * @return
    	 */
    	public static PageResult findPage(PageRequest pageRequest, Object mapper) {
    		return findPage(pageRequest, mapper, findPage);
    	}
    	
    	/**
    	 * 调用分页插件进行分页查询
    	 * @param pageRequest 分页请求
    	 * @param mapper Dao对象,MyBatis的 Mapper	
    	 * @param queryMethodName 要分页的查询方法名
    	 * @param args 方法参数
    	 * @return
    	 */
    	@SuppressWarnings({ "unchecked", "rawtypes" })
    	public static PageResult findPage(PageRequest pageRequest, Object mapper, String queryMethodName, Object... args) {
    		// 设置分页参数
    		int pageNum = pageRequest.getPageNum();
    		int pageSize = pageRequest.getPageSize();
    		PageHelper.startPage(pageNum, pageSize);
    		// 利用反射调用查询方法
    		Object result = ReflectionUtils.invoke(mapper, queryMethodName, args);
    		return getPageResult(pageRequest, new PageInfo((List) result));
    	}
    
    	/**
    	 * 将分页信息封装到统一的接口
    	 * @param pageRequest 
    	 * @param page
    	 * @return
    	 */
    	private static PageResult getPageResult(PageRequest pageRequest, PageInfo<?> pageInfo) {
    		PageResult pageResult = new PageResult();
            pageResult.setPageNum(pageInfo.getPageNum());
            pageResult.setPageSize(pageInfo.getPageSize());
            pageResult.setTotalSize(pageInfo.getTotal());
            pageResult.setTotalPages(pageInfo.getPages());
            pageResult.setContent(pageInfo.getList());
    		return pageResult;
    	}
    }
    
    • HTTP返回结果封装
    public class HttpResult {
    	private int code = 200;
    	private String msg;
    	private Object data;
    	
    	public static HttpResult error() {
    		return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, "未知异常,请联系管理员");
    	}
    	public static HttpResult error(String msg) {
    		return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, msg);
    	}
    	public static HttpResult error(int code, String msg) {
    		HttpResult r = new HttpResult();
    		r.setCode(code);
    		r.setMsg(msg);
    		return r;
    	}
    	public static HttpResult ok(String msg) {
    		HttpResult r = new HttpResult();
    		r.setMsg(msg);
    		return r;
    	}
    	public static HttpResult ok(Object data) {
    		HttpResult r = new HttpResult();
    		r.setData(data);
    		return r;
    	}
    	public static HttpResult ok() {
    		return new HttpResult();
    	}
    	public int getCode() {
    		return code;
    	}
    	public void setCode(int code) {
    		this.code = code;
    	}
    	public String getMsg() {
    		return msg;
    	}
    	public void setMsg(String msg) {
    		this.msg = msg;
    	}
    	public Object getData() {
    		return data;
    	}
    	public void setData(Object data) {
    		this.data = data;
    	}
    }
    
    三、实现
    • SysUserController.java
    @RestController
    @RequestMapping("/user")
    public class SysUserController {
    
    	@Autowired
    	private SysUserService sysUserService;
    	
    	@PostMapping(value="/findPage")
    	public HttpResult findPage(@RequestBody PageRequest pageRequest) {
    		return HttpResult.ok(sysUserService.findPage(pageRequest));
    	}
    }
    
    • SysUserService.java
    public interface SysUserService extends CurdService<SysUser> {
    
    }
    
    • SysUserMapper.java
    public interface SysUserMapper {
        List<SysUser> findPage();
    }
    
    • SysUserServiceImpl.java
    //经过对分页查询业务的封装,只需调用MybatisPageHelper.findPage(pageRequest, sysUserMapper)即可实现分页查询功能
    @Service
    public class SysUserServiceImpl implements SysUserService {
    
    	@Autowired
    	private SysUserMapper sysUserMapper;
    	
    	@Override
    	public PageResult findPage(PageRequest pageRequest) {
    		return MybatisPageHelper.findPage(pageRequest, sysUserMapper);
    	}
    }
    
    • SysUserMapper.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="com.coisini.admin.mapper.SysUserMapper">
      <resultMap id="BaseResultMap" type="com.coisini.admin.entity.SysUser">
        <id column="id" jdbcType="BIGINT" property="id" />
        <result column="name" jdbcType="VARCHAR" property="name" />
        <result column="nick_name" jdbcType="VARCHAR" property="nickName" />
        <result column="avatar" jdbcType="VARCHAR" property="avatar" />
        <result column="password" jdbcType="VARCHAR" property="password" />
        <result column="salt" jdbcType="VARCHAR" property="salt" />
        <result column="email" jdbcType="VARCHAR" property="email" />
        <result column="mobile" jdbcType="VARCHAR" property="mobile" />
        <result column="status" jdbcType="TINYINT" property="status" />
        <result column="dept_id" jdbcType="BIGINT" property="deptId" />
        <result column="create_by" jdbcType="VARCHAR" property="createBy" />
        <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
        <result column="last_update_by" jdbcType="VARCHAR" property="lastUpdateBy" />
        <result column="last_update_time" jdbcType="TIMESTAMP" property="lastUpdateTime" />
        <result column="del_flag" jdbcType="TINYINT" property="delFlag" />
      </resultMap>
      <sql id="Base_Column_List">
        id, name, nick_name, avatar, password, salt, email, mobile, status, dept_id, create_by, 
        create_time, last_update_by, last_update_time, del_flag
      </sql>
      <select id="findPage" resultMap="BaseResultMap">
        select u.*, (select d.name from sys_dept d where d.id = u.dept_id) deptName from sys_user u
      </select>
    </mapper>
    
    四、测试

    在这里插入图片描述

  • 相关阅读:
    CentOS6.7 mysql5.6.33修改数据文件位置
    win8 win10 安装msi 提示2502、2503的错误代码
    2016年国内开源镜像站点汇总
    eclipse创建本地maven
    maven添加sqlserver的jdbc驱动包
    CentOS6.5下RPM方式安装mysql5.6.33
    linux中~和/的区别
    Linux命令学习(22):ss命令
    Linux命令学习(21):netstat命令
    Linux命令学习(20):traceroute命令
  • 原文地址:https://www.cnblogs.com/maggieq8324/p/11414538.html
Copyright © 2011-2022 走看看