详细分析Mybatis与MybatisPlus中分页查询的差异(附Demo)

目录

  • 前言
  • [1. Mybatis](#1. Mybatis)
  • [2. MybatisPlus](#2. MybatisPlus)
  • [3. 实战](#3. 实战)

前言

更多的知识点推荐阅读:

  1. 【Java项目】实战CRUD的功能整理(持续更新)
  2. java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)

本章节主要以Demo为例,直奔主题,对于更多的基本知识可看我的框架架构

1. Mybatis

主要的逻辑从外往深走,具体如下:

  1. 创建一个Java类,实现业务逻辑,在该类中调用上述接口中的方法获取分页数据并构建PageResult对象返回
  2. 创建一个Java接口,声明两个方法,分别用于执行这两个查询语句
  3. 创建XML映射文件,定义两个查询语句,分别用于获取分页列表和总记录数

主体代码如下:

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.example.system.mapper.UserMapper">

    <select id="fetchCustomPageResults"
            resultType="com.example.system.model.UserModel" >
        SELECT * FROM users
        <where>
            <if test="criteria.name != null and criteria.name !=''">
                AND name LIKE CONCAT('%',#{criteria.name},'%')
            </if>
            <if test="criteria.createTime != null">
                AND create_time BETWEEN #{criteria.createTime[0]}, #{criteria.createTime[1]},
            </if>
            <if test="criteria.status != null">
                AND status = #{criteria.status}
            </if>
        </where>
        ORDER BY id DESC
        LIMIT #{criteria.pageNumber}, #{criteria.pageSize}
    </select>

    <select id="fetchCustomTotalCount" resultType="Long" >
        SELECT COUNT(1) FROM users
        <where>
            <if test="criteria.name != null and criteria.name !=''">
                AND name LIKE CONCAT('%',#{criteria.name},'%')
            </if>
            <if test="criteria.createTime != null">
                AND create_time BETWEEN #{criteria.createTime[0]}, #{criteria.createTime[1]},
            </if>
            <if test="criteria.status != null">
                AND status = #{criteria.status}
            </if>
        </where>
    </select>

</mapper>
java 复制代码
@Mapper
public interface CustomUserMapper extends BaseMapperX<UserModel> {

    /**
     * 获取自定义分页结果
     */
    List<UserModel> fetchCustomPageResults(@Param("criteria") UserCriteria criteria);

    /**
     * 获取自定义总记录数
     */
    Long fetchCustomTotalCount(@Param("criteria") UserCriteria criteria);

}

@Service
@Slf4j
public class CustomUserService {

    @Override
    public PageResult<UserModel> fetchCustomUserPage(UserCriteria criteria) {
        return new PageResult<>(
                userMapper.fetchCustomPageResults(criteria),
                userMapper.fetchCustomTotalCount(criteria)
        );
    }
}

对应实现类如下:

java 复制代码
@Service
@Slf4j
public class CustomUserServiceImpl implements CustomUserService{

    private final CustomUserMapper userMapper;

    @Autowired
    public CustomUserService(CustomUserMapper userMapper) {
        this.userMapper = userMapper;
    }

    @Override
    public PageResult<UserModel> fetchCustomUserPage(UserCriteria criteria) {
        return new PageResult<>(
                userMapper.fetchCustomPageResults(criteria),
                userMapper.fetchCustomTotalCount(criteria)
        );
    }
}

以上的Demo提供一个框架思路

2. MybatisPlus

具体代码如下:

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.example.system.mapper.AdminUserMapper">

    <select id="fetchCustomPageResults"
            resultType="com.example.system.model.UserModel" >
        SELECT * FROM users
        <where>
            <if test="criteria.name != null and criteria.name !=''">
                AND username LIKE CONCAT('%',#{criteria.name},'%')
            </if>
            <if test="criteria.createTime != null">
                AND create_time BETWEEN #{criteria.createTime[0]}, #{criteria.createTime[1]},
            </if>
            <if test="criteria.status != null">
                AND status = #{criteria.status}
            </if>
        </where>
        ORDER BY id DESC
    </select>

</mapper>
java 复制代码
@Mapper
public interface CustomAdminUserMapper extends BaseMapperX<UserModel> {

    IPage<UserModel> fetchCustomPageResults(IPage<UserModel> page, @Param("criteria") UserCriteria criteria);

}

其实现类如下:

java 复制代码
@Service
@Slf4j
public class CustomUserServiceImpl implements CustomUserService{

    private final CustomAdminUserMapper userMapper;

    @Autowired
    public CustomAdminUserService(CustomAdminUserMapper userMapper) {
        this.userMapper = userMapper;
    }

    @Override
    public PageResult<UserModel> fetchCustomUserPage(UserCriteria criteria) {
        // 必须使用 MyBatis Plus 的分页对象
        IPage<UserModel> page = new Page<>(criteria.getPageNo(), criteria.getPageSize());
        userMapper.fetchCustomPageResults(page, criteria);
        return new PageResult<>(page.getRecords(), page.getTotal());
    }
}

3. 实战

看Demo示例可能有些抽象,结合自身项目给一个示例

Controller类如下:

java 复制代码
@GetMapping("/listByOrderId")
@ApiOperationSupport(order = 8)
@ApiOperation(value = "分页", notes = "传入docheck")
public R<List<DoCheckVO>> list(Long orderId) {
	List<DoCheck> doChecks = docheckService.listByOrderId(orderId);
	return R.data(DocheckWrapper.build().listVO(doChecks));
}

对应的Service类如下:

java 复制代码
List<DoCheck> listByOrderId(Long orderId);

其中的实现类如下:

java 复制代码
@Override
public List<DoCheck> listByOrderId(Long orderId) {
	return docheckMapper.listByOrderId(orderId);
}

Mapper类如下:

java 复制代码
List<DoCheck> listByOrderId(Long orderId);

对应的Xml代码如下:

xml 复制代码
<select id="listByOrderId" resultType="org.springblade.equipment.entity.DoCheck">
    select * from equipment_check_order_docheck  where is_deleted = 0 and check_order_id=#{orderId}
</select>

其中xml的上文如下:

相关推荐
世间万物皆对象24 分钟前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
没书读了1 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
jokerest1231 小时前
web——sqliabs靶场——第十三关——报错注入+布尔盲注
mybatis
小二·1 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic1 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
懒洋洋大魔王1 小时前
RocketMQ的使⽤
java·rocketmq·java-rocketmq
武子康2 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神2 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
qq_327342732 小时前
Java实现离线身份证号码OCR识别
java·开发语言
阿龟在奔跑4 小时前
引用类型的局部变量线程安全问题分析——以多线程对方法局部变量List类型对象实例的add、remove操作为例
java·jvm·安全·list