Java-15 深入浅出 MyBatis - 插件机制 PageHelper 与 通用 Mapper

news/2024/12/5 2:38:51/

点一下关注吧!!!非常感谢!!持续更新!!!

大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html

在这里插入图片描述

目前已经更新到了:

  • MyBatis(正在更新)

PageHelper

MyBatis 使用第三方插件对功能进行扩展,分页助手 PageHelper 是将分页的复杂操作进行封装,使用简单的方式即可获得分页的相关数据。PageHelper 是一个用于 MyBatis 或 MyBatis-Plus 的分页插件,它提供了简单易用的分页功能。它通过拦截 SQL 查询,在查询时自动添加分页条件,从而实现数据的分页查询。PageHelper 的主要优点是简单易用,并且可以兼容大部分的数据库和 MyBatis 版本。

基本功能

PageHelper 可以帮助我们在使用 MyBatis 时自动进行分页查询,避免手动编写复杂的分页逻辑。它通过拦截器的方式,在执行查询时动态地将分页参数传入 SQL 语句,并通过设置分页对象来获取分页结果。

工作原理

PageHelper 的核心功能是通过拦截器修改 SQL,添加分页的参数。它在查询执行前,会根据提供的分页参数修改原始的 SQL 查询,添加 LIMIT、OFFSET 等分页条件,然后返回分页结果。分页信息通过 Page 类提供,分页对象封装了总记录数、总页数等信息。

开发步骤

  • 导入通用 PageHelper 的坐标
  • 在 MyBatis 核心配置文件中配置 PageHelper 插件
  • 测试分页数据获取

导入pom

<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>3.5.1</version>
</dependency>

插件配置

<plugin interceptor="com.github.pagehelper.PageHelper"><property name="dialect" value="mysql"/>
</plugin>

对应的截图如下所示:
在这里插入图片描述

代码实现

java">public class WzkicuPage01 {public static void main(String[] args) throws Exception {InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();UserMapper userMapper = sqlSession.getMapper(UserMapper.class);PageHelper.startPage(2, 1);List<WzkUser> dataList = userMapper.findAll();for (WzkUser wzk : dataList) {System.out.println(wzk);}}
}

执行结果

对应的控制台输出结果如下:

WzkUser(id=2, username=wzk2, password=icu2, birthday=Mon Nov 11 00:00:00 CST 2024, orderList=null, roleList=null)

对应的截图如下所示:
在这里插入图片描述

配置 PageHelper

在 Spring 配置文件中配置 PageHelper 插件,通常是在 application.properties 或 application.yml 文件中:

pagehelper.helperDialect=mysql # 配置数据库方言,如 mysql、oracle、postgresql
pagehelper.reasonable=true      # 启用合理化分页
pagehelper.supportMethodsArguments=true # 支持通过方法参数传递分页参数

PageInfo类

PageInfo 是 PageHelper 用于封装分页查询结果的一个重要类。它包含了分页相关的信息:

  • getTotal():总记录数。
  • getPages():总页数。
  • getPageNum():当前页码。
  • getPageSize():每页大小。
  • getList():当前页的数据。

注意事项

  • 在使用 PageHelper 时,分页查询必须放在调用 PageHelper.startPage() 之后,执行查询之前。
  • 如果使用了 @Mapper 注解的 Mapper 接口,PageHelper 可以自动与 MyBatis 配合工作。
  • 对于需要分页的查询,返回的结果必须是一个 List 类型,如果返回的是其他类型的数据结构,PageHelper 可能无法正确分页。

通用 mapper

简单介绍

通用 mapper 就是为了解决单表的增删改查,基于 MyBatis 的插件机制,开发人员不需要编写 SQL,不需要在 DAO 中增加方法,只要写好实体类,就可以有增删改查方法。

引入依赖

<dependency><groupId>tk.mybatis</groupId><artifactId>mapper</artifactId><version>3.5.1</version>
</dependency>

设置主键

我们需要在实体类上设置主键:

java">@Table(name = "wzk_user")
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class WzkUser implements Serializable {private int id;private String username;private String password;private Date birthday;private List<WzkOrder> orderList;private List<WzkRole> roleList;
}

对应的代码如下所示:
在这里插入图片描述

修改DAO

我们需要在 Mapper 上继承 Mapper:

java">public interface UserMapper extends Mapper<WzkUser> {// 省略之前的内容
}

编写代码

我们编写代码进行测试:

java">public class WzkMapper01 {public static void main(String[] args) throws Exception {InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();MapperHelper mapperHelper = new MapperHelper();mapperHelper.registerMapper(UserMapper.class);mapperHelper.processConfiguration(sqlSession.getConfiguration());UserMapper userMapper = sqlSession.getMapper(UserMapper.class);List<WzkUser> dataList = userMapper.selectAll();for (WzkUser each : dataList) {System.out.println(each);}sqlSession.close();}
}

执行结果

测试运行之后,控制台输出的内容如下所示:

WzkUser(id=0, username=wzk2, password=icu2, birthday=Mon Nov 11 00:00:00 CST 2024, orderList=null, roleList=null)

对应的截图如下所示:
在这里插入图片描述

编写代码

这里简单说一下 Example 的用法:

java">public class WzkMapper02 {public static void main(String[] args) throws Exception {InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();MapperHelper mapperHelper = new MapperHelper();mapperHelper.registerMapper(UserMapper.class);mapperHelper.processConfiguration(sqlSession.getConfiguration());UserMapper userMapper = sqlSession.getMapper(UserMapper.class);Example example = new Example(WzkUser.class);example.createCriteria().andEqualTo("username", "wzk2");List<WzkUser> dataList = userMapper.selectByExample(example);for (WzkUser each : dataList) {System.out.println(each);}sqlSession.close();}
}

执行结果

运行结果之后,控制台的输出结果如下所示:

WzkUser(id=0, username=wzk2, password=icu2, birthday=Mon Nov 11 00:00:00 CST 2024, orderList=null, roleList=null)

对应的截图如下所示:
在这里插入图片描述


http://www.ppmy.cn/news/1552128.html

相关文章

Java 基础之 List 深度探秘

List 是什么&#xff1f; List 集合是 Java 集合框架中的一种有序、可重复的数据结构&#xff0c;它继承自 Collection 接口&#xff0c;允许存储多个元素。与数组不同&#xff0c;List 集合的大小是动态可变的&#xff0c;可以根据需要动态地添加或删除元素。 List 集合中的…

【Leetcode 每日一题】52. N 皇后 II

问题背景 n n n 皇后问题 研究的是如何将 n n n 个皇后放置在 n n n \times n nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n n n&#xff0c;返回 n n n 皇后问题 不同的解决方案的数量。 数据约束 1 ≤ n ≤ 9 1 \le n \le 9 1≤n≤9 解题…

【鸿蒙】鸿蒙开发过程中this指向问题

文章目录 什么是 this&#xff1f;常见 this 指向问题案例分析&#xff1a;HarmonyOS 组件中的 this 指向问题问题描述问题分析原因 解决方案&#xff1a;绑定 this 的正确方法方法一&#xff1a;使用箭头函数方法二&#xff1a;手动绑定 this 完整代码示例使用箭头函数使用 bi…

三格电子—单通道串口服务器

型号&#xff1a;SG-TCP232-110 一、产品介绍 1.1 功能简介 SG-TCP232-110 是一款用来进行串口数据和网口数据转换的设备。解决普通 串口设备在 Internet 上的联网问题。 设备的串口部分提供一个 232 接口和一个 485 接口&#xff0c;两个接口内部连接&#xff0c;…

深度学习案例:ResNet50模型+SE-Net

本文为为&#x1f517;365天深度学习训练营内部文章 原作者&#xff1a;K同学啊 一 回顾ResNet模型 ResNet&#xff0c;即残差网络&#xff0c;是由微软研究院的Kaiming He及其合作者于2015年提出的一种深度卷积神经网络架构。该网络架构的核心创新在于引入了“残差连接”&…

使用 Docker 部署 Spring Boot 项目流程

文章目录 使用 Docker 部署 Spring Boot 项目流程1. 构建 Spring Boot 项目使用 Maven 构建项目&#xff1a;使用 Gradle 构建项目&#xff1a; 2. 创建 Dockerfile示例 Dockerfile&#xff1a;解释&#xff1a; 3. 构建 Docker 镜像4. 运行 Docker 容器5. 查看容器日志6. 管理…

[每周一更]-(第125期):模拟面试|NoSQL面试思路解析

文章目录 39|Elasticsearch 高可用:怎么保证 Elasticsearch 的高可用?1. Elasticsearch 的节点有什么角色?一个节点可以扮演多个角色吗?2. 在实践中,怎么合理安排不同节点扮演的角色?3. 什么是候选主节点和投票节点?投票节点可以被选为主节点吗?为什么要引入投票节点?…

C#tabcontrol如何指定某个tabItem为默认页

// Selects tabPage2 using SelectedTab.this.tabControl1.SelectedTab tabPage2; 参考链接 TabControl.SelectedTab 属性 (System.Windows.Forms) | Microsoft Learnhttps://learn.microsoft.com/zh-cn/dotnet/api/system.windows.forms.tabcontrol.selectedtab?viewnetfr…