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

news2024/11/25 14:57:25

目录

  • 前言
  • 1. Mybatis
  • 2. MybatisPlus
  • 3. 实战

前言

更多的知识点推荐阅读:

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

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

1. Mybatis

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

  1. 创建一个Java类,实现业务逻辑,在该类中调用上述接口中的方法获取分页数据并构建PageResult对象返回
  2. 创建一个Java接口,声明两个方法,分别用于执行这两个查询语句
  3. 创建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>
@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)
        );
    }
}

对应实现类如下:

@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 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>
@Mapper
public interface CustomAdminUserMapper extends BaseMapperX<UserModel> {

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

}

其实现类如下:

@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类如下:

@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类如下:

List<DoCheck> listByOrderId(Long orderId);

其中的实现类如下:

@Override
public List<DoCheck> listByOrderId(Long orderId) {
	return docheckMapper.listByOrderId(orderId);
}

Mapper类如下:

List<DoCheck> listByOrderId(Long orderId);

对应的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的上文如下:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1651303.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安卓自动化脚本制作流程详解!

在移动应用日益普及的今天&#xff0c;安卓自动化脚本制作成为了开发者提高工作效率、减少重复劳动的重要手段&#xff0c;本文将详细介绍安卓自动化脚本的制作流程&#xff0c;并通过五段源代码的实例&#xff0c;帮助读者更好地理解和掌握这一过程。 一、安卓自动化脚本制作…

407627-60-5,AF647 NHS酯一种高亮度的红色荧光试剂

一、产品概述 中文名称&#xff1a;Alexa Fluor 647活化酯&#xff0c;AF647 NHS酯&#xff0c;AF 647 琥珀酰亚胺酯 英文名称&#xff1a;AF647 NHS&#xff0c;Alexa Fluor 647 NHS ester CAS号&#xff1a;1620475-28-6&#xff0c;407627-60-5&#xff0c;1453856-34-2 …

(1day)致远M3 log 敏感信息泄露漏洞(Session)复现

前言 系统学习web漏洞挖掘以及项目实战也有一段时间了,发现在漏洞挖掘过程中难免会碰到一些历史漏洞,来帮助自己或是提高自己挖洞和及时发现漏洞效率,于是开始创建这个专栏,对第一时间发现的1day以及历史漏洞进行复现,来让自己更加熟悉漏洞类型以及历史漏洞,方便自己在后续的项…

【Linux】17. 进程间通信 --- 管道

1. 什么是进程间通信(进程间通信的目的) 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 资源共享&#xff1a;多个进程之间共享同样的资源。 通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息&#xff0c;通知它&#xff08;它们&#xff09;发生了…

上市公司财务困境模型​MertonDD、OScore、RLPM、ZScore四种模型​(1992-2022年)

01、数据介绍 上市公司财务困境模型是用于预测和评估上市公司是否可能陷入财务困境的一种模型。这个模型通常基于一系列的财务比率和其他相关变量&#xff0c;通过统计分析方法来构建。​ 数据名称&#xff1a;上市公司财务困境模型MertonDD、OScore、RLPM、ZScore五种模型 …

62-USB转JTAG or SPI电路设计

视频链接 USB转JTAG or SPI电路设计01_哔哩哔哩_bilibili USB 转 JTAG or SPI电路设计 第07课---USB转串口电路设计第 34&#xff5e;40课---USB硬件电路设计 第22课---SPI Flash电路设计 第31课---JTAG电路设计&#xff08;JLINK&XILINX&ALTERA&#xff09; 第…

CSS学习笔记之基础教程(一)

1、CSS语法 CSS 规则集&#xff08;rule-set&#xff09;由选择器和声明块组成&#xff1a; 选择器指向您需要设置样式的 HTML 元素。 声明块包含一条或多条用分号分隔的声明。 每条声明都包含一个 CSS 属性名称和一个值&#xff0c;以冒号分隔。 多条 CSS 声明用分号分隔…

工厂模式应用实例

引言 设计模式概念 设计模式&#xff08;Design Pattern&#xff09;的官方概念可以表述为&#xff1a;在软件设计中&#xff0c;设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它是针对特定问题或特定场景的解决方案&#xff0c;是一种经过…

flutter报错

组件相关 type ‘List’ is not a subtype of type ‘List’ children: CardList.map((item) > Container( 加上 *** < Widget>*** 正常 type ‘(dynamic, dynamic) > Container’ is not a subtype of type ‘(CardType) > Widget’ of ‘f’ children: CardL…

OpenCV使用 Kinect 和其他兼容 OpenNI 的深度传感器(75)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇:使用 OpenCV 创建视频(74) 下一篇 :OpenCV系列文章目录&#xff08;持续更新中......&#xff09; ​ 目的&#xff1a;​ 通过 VideoCapture 类支持与 OpenNI 兼容的深度传感器&#xff08;Kinect…

Ps 滤镜:纤维

Ps菜单&#xff1a;滤镜/渲染/纤维 Filter/Render/Fibers 纤维 Fibers滤镜可以创建类似于纤维或织物的纹理效果&#xff0c;用于模拟自然或合成材料的质感和外观。 “纤维”滤镜使用前景色和背景色来生成纤维效果&#xff0c;通过算法模拟纤维束的编织或交织。“差异”滑块允许…

uniapp离线在Xcode上打包后提交审核时提示NSUserTrackingUsageDescription的解决方法

uniapp离线在Xcode上打包后提交审核时提示NSUserTrackingUsageDescription的解决方法 问题截图&#xff1a; 亲测有效的方法 方法一&#xff1a; 选择通过uniapp的开发工具Hbuilder来进行在线打包&#xff0c;取消默认勾选的以下选项。 然后进行在线打包就不会存在提交审…

怎么在家访问公司内网?

在当前的疫情情况下&#xff0c;越来越多的公司开始允许员工在家办公&#xff0c;这就需要解决一个问题&#xff1a;如何在家访问公司的内网资源呢&#xff1f;今天我将介绍一种解决方案——使用【天联】组网&#xff0c;它具有许多优势。 【天联】组网的优势 无网络限制&#…

Unity 性能优化之UI和模型优化(九)

提示&#xff1a;仅供参考&#xff0c;有误之处&#xff0c;麻烦大佬指出&#xff0c;不胜感激&#xff01; 文章目录 前言一、选择UI二、UGUI的优化1.Raycast Target2.UI控件的重叠3.TextMeshPro 二、模型优化1.Model选项卡Mesh CompressionRead/Write Enabled设置Optimize Ga…

「Dasha and Photos」Solution

简述题意 给定一个 n m n \times m nm 的方格&#xff0c;每个格子里有一个小写英文字母。 现在你有 k k k 个 n m n \times m nm 的方格&#xff0c;这些方格都是给定方格的基础上将左上角为 ( a i , b i ) (a_i,b_i) (ai​,bi​)&#xff0c;右下角为 ( c i , d i ) …

AI原生实践:测试用例创作探索

测试用例作为质量保障的核心&#xff0c;影响着研发-测试-发布-上线的全过程&#xff0c;如单元测试用例、手工测试用例、接口自动化用例、UI 自动化用例等&#xff0c;但用例撰写的高成本尤其是自动化用例&#xff0c;导致了用例的可持续积累、更新和迭代受到非常大制约。长久…

深入理解Java虚拟机(JVM)

引言&#xff1a; Java虚拟机&#xff08;JVM&#xff09;是Java平台的核心组件&#xff0c;它负责将Java字节码转换成平台特定的机器指令&#xff0c;并在相应的硬件和操作系统上执行。JVM的引入使得Java语言具有“一次编写&#xff0c;到处运行”的跨平台特性。本文将深入探…

安装nginx-1.25.5与ngx_http_headers_more_filter_module模块

#下载nginx的代码 curl -O http://nginx.org/download/nginx-1.25.5.tar.gz #下载headers-more-nginx-module代码 git clone https://github.com/openresty/headers-more-nginx-module#解压 tar -xzf nginx-1.25.5.tar.gzcd nginx-1.25.5#--add-dynamic-module 下载下来的目录 …

简单两步将Lllama、Qwen等开源大模型安装到自己的电脑上

现在已经有非常多优秀的开源大语言模型了&#xff0c;比如Command R、Mistral、Qwen、MiniMax、Baichuan、Phi3等&#xff0c;其中Lllama3和Qwen等已经和GPT4的性能比较接近了。 如果能把这些免费的开源大模型部署到本地电脑或手机上&#xff0c;可以完全自由的使用&#xff0…

前后端分离项目中的一些疑惑

1、前后端分离项目&#xff0c;浏览器发起请求后&#xff0c;请求的是前端服务器还是后端服务器&#xff1f; 在前后端分离的项目中&#xff0c;当浏览器发起请求时&#xff0c;它首先会请求的是前端服务器。 前后端分离的工作流程大致如下&#xff1a; 用户在浏览器中输入网…