【MyBatis-Plus】让 MyBatis 更简单高效

news2025/1/3 14:25:42

如果你曾经使用过 MyBatis,你一定知道它的强大和灵活。然而,随着项目规模的增长,手写 SQL 成为了一件既繁琐又容易出错的事。这时,MyBatis-Plus(简称 MP)应运而生,它为 MyBatis 增强了许多功能,帮我们极大地提高开发效率。接下来,我们就来聊聊 MyBatis-Plus 的基本介绍和使用,让你轻松上手!


一、MyBatis-Plus 是什么?

MyBatis-Plus 是一款基于 MyBatis 的增强工具,它的口号是 “为简化开发而生”。简单来说,MP 在保留 MyBatis 灵活性的同时,帮我们封装了很多常用的功能,比如:

  • 自动生成单表的 CRUD 操作,再也不用手写增删改查。
  • 提供强大的 条件构造器,动态生成查询语句。
  • 内置了 分页插件,让分页查询变得超级简单。

它适合那些既想要使用 ORM 工具,又希望对 SQL 有一定掌控力的开发者。


二、MyBatis-Plus 的核心特性

1. 开箱即用的 CRUD

MP 提供了 BaseMapper 接口,只需继承它,你就能获得所有单表的增删改查方法。例如:

UserMapper userMapper = ...; // Mapper 注入
User user = userMapper.selectById(1L); // 根据主键查询

就这么简单,一行代码搞定!

2. 强大的条件构造器

还记得那些复杂的 WHERE 条件 SQL 吗?MP 的条件构造器能帮你轻松搞定:

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("age", 18).like("name", "Jack");
List<User> users = userMapper.selectList(queryWrapper);

动态查询再也不用拼接字符串了,是不是很香?

3. 分页插件

分页查询是开发中最常见的需求之一。MP 提供了内置的分页插件,只需简单配置,就可以用如下代码实现分页:

Page<User> page = new Page<>(1, 10); // 第1页,每页10条
Page<User> result = userMapper.selectPage(page, null);
System.out.println(result.getRecords()); // 当前页数据
System.out.println(result.getTotal()); // 总记录数

4. 自动代码生成器

如果你讨厌一遍遍写 EntityMapperService 的模板代码,MP 的代码生成器可以帮你一次性生成全部内容,让你专注于业务逻辑。


三、MyBatis-Plus 的快速入门

接下来,我们用一个简单的例子来说明如何使用 MyBatis-Plus。

1. 引入依赖

在你的项目中添加 MyBatis-Plus 的 Maven 依赖:

注意这里是以 Spring Boot 3 整合 MyBatis Plus,Spring Boot 2 的话要导入另一个包mybatis-plus-boot-starter

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
    <version>3.5.9</version>
</dependency>

2. 配置数据源

application.yml 中配置数据源(以操作 MySQL 为例)和 MyBatis-Plus

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test_db
    username: root
    password: 123456
  mybatis-plus:
    configuration:
      log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 把sql语句打印到控制台

3. 创建实体类

假设我们的数据库中有一个 user 表,我们可以创建对应的实体类:

@Data    // Lombok注解,生成一个JavaBean常用的方法
@TableName("user")    // 指定绑定的数据表名
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

4. 创建 Mapper 接口

继承 BaseMapper 即可:

@Mapper
public interface UserMapper extends BaseMapper<User> {
}

5. 调用 CRUD 接口

ServiceController 中使用:

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserMapper userMapper;

    @GetMapping("/list")
    public List<User> listUsers() {
        return userMapper.selectList(null); // 查询所有用户
    }
}

运行后访问 /user/list,你会发现用户数据已经成功查询出来了!

确实,IService 是 MyBatis-Plus 提供的一种更高层次的接口封装,它将常用的业务逻辑操作进一步抽象,方便我们在 Service 层使用,避免直接操作 Mapper。下面补充关于 IServiceServiceImpl 的使用方法。


6. 使用 IService 接口实现业务逻辑

MyBatis-Plus 提供了 IServiceServiceImpl,帮我们在 Service 层简化基础逻辑操作,同时保持扩展性。

① 创建 Service 接口

继承 IService<T> 接口,定义业务逻辑层的接口:

public interface UserService extends IService<User> {
    // 自定义业务方法(如果有)
}
② 实现 Service 接口

创建实现类,继承 MyBatis-Plus 提供的 ServiceImpl 基类,自动注入 Mapper:

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    // 可以在这里扩展自定义的业务逻辑方法
}
③ 使用 Service

在 Controller 或其他业务类中注入 UserService,调用封装的 CRUD 方法:

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/list")
    public List<User> listUsers() {
        return userService.list(); // 查询所有用户
    }

    @PostMapping("/add")
    public boolean addUser(@RequestBody User user) {
        return userService.save(user); // 新增用户
    }

    @DeleteMapping("/delete/{id}")
    public boolean deleteUser(@PathVariable Long id) {
        return userService.removeById(id); // 根据 ID 删除用户
    }
}

【IService 的优势】

  1. 抽象通用逻辑:将通用的 CRUD 方法(如 saveremoveByIdgetByIdlist 等)封装到接口中,避免每个 Service 重复实现。

  2. Mapper 解耦:在业务层调用 IService 提供的方法,无需直接操作 Mapper,增强了代码的层次性和可维护性。

  3. 可扩展性:如果有自定义业务逻辑,只需在 UserService 接口和 UserServiceImpl 类中实现,无需修改基础代码。


7. 最佳实践

  • 如果项目规模较小,直接使用 BaseMapper 实现 CRUD,简单快捷。
  • 如果项目复杂且需要 Service 层管理业务逻辑,建议使用 IServiceServiceImpl,规范代码结构。

四、为什么要用 MyBatis-Plus?

  1. 手写增删改查 SQL 的疲劳感:
    想象一下,你有 10 个表,每个表都要写四五个基础操作的 SQL,是不是一想到就想摆烂?

  2. 动态拼接 SQL 的复杂性:
    有些查询条件需要用户输入,这就意味着动态 SQL。手写拼接不仅代码冗长,而且容易出错。

  3. 分页查询的重复劳动:
    传统分页查询需要写 SQL,还要计算总数。如果有工具自动搞定,岂不是省心又省力?


五、总结

MyBatis-Plus 是一款极大提升开发效率的工具,它不仅让我们摆脱了繁琐的基础代码编写,还提供了强大的功能来满足各种场景需求,我们可以在项目开发中更加专注业务逻辑,可以说是开发行云流水。通过今天的分享,相信你已经对 MP 有了初步的了解。

如果你对 MP 感兴趣,不妨动手尝试一下,亲自体验它的便捷性!之后,我会继续进一步展开来讲解开发中常用的部分,以及一些核心机制等内容,感兴趣的朋友可以关注留意一下噢!

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

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

相关文章

Zabbix 监控平台 添加监控目标主机

Zabbix监控平台是一个企业级开源解决方案&#xff0c;用于分布式系统监视和网络监视。它由Zabbix Server和可选组件Zabbix Agent组成&#xff0c;通过C/S模式&#xff08;客户端-服务器模型&#xff09;采集数据&#xff0c;并通过B/S模式&#xff08;浏览器-服务器模型&#x…

第10章 初等数论

2024年12月27日一稿&#xff08;P341&#xff09; 2024年12月28日二稿 2024年12月29日三稿 当命运这扇大门向你打开的时候&#xff0c;不要犹豫和害怕&#xff0c;一直往前跑就是了&#xff01; 10.1 素数 这里写错了&#xff0c;不能整除应该表示为 10.2 最大公约数与最小公…

R语言6种将字符转成数字的方法,写在新年来临之际

咱们临床研究中&#xff0c;拿到数据后首先要对数据进行清洗&#xff0c;把数据变成咱们想要的格式&#xff0c;才能进行下一步分析&#xff0c;其中数据中的字符转成数字是个重要的内容&#xff0c;因为字符中常含有特殊符号&#xff0c;不利于分析&#xff0c;转成数字后才能…

微信流量主挑战:三天25用户!功能未完善?(新纪元4)

&#x1f389;【小程序上线第三天&#xff01;突破25用户大关&#xff01;】&#x1f389; 嘿&#xff0c;大家好&#xff01;今天是我们小程序上线的第三天&#xff0c;我们的用户量已经突破了25个&#xff01;昨天还是16个&#xff0c;今天一觉醒来竟然有25个&#xff01;这涨…

Ps:将数据组作为文件导出

Ps菜单&#xff1a;文件/导出/数据组作为文件 Export/Data Sets as Files “将数据组作为文件导出” Export Data Sets as Files命令是 Photoshop 数据驱动设计功能的一部分&#xff0c;用于结合可变数据和模板&#xff0c;生成多个文件。 1、自动化批量生成 适用于名片、证书、…

Java基本操作笔记

命令行快速进入指定文件夹 快速切换进入指定文件 文件夹快速切换 idea开发步骤 快捷键 修改模块 选中模块右键依次选择 选择第三个修改模块和文件夹的名称 输入修改后的名字回车 导入模块 找到要导入的模块&#xff0c;ctrc复制该文件夹 打开idea找到工程文件夹ctrv粘贴 点击o…

OpenCV-Python实战(8)——图像变换

一、缩放 cv2.resize() img cv2.resize(src*,dsize*,fx*,fy*,interpolation*) img&#xff1a;目标图像。 src&#xff1a;原始图像。 dsize&#xff1a;&#xff08;width&#xff0c;height&#xff09;图像大小。 fx、fy&#xff1a;可选参数&#xff0c;水平/垂直方向…

Spring thymeleaf 的快速默认搭建使用

Spring thymeleaf 的快速默认搭建使用 thymeleaf 的搭建Pom 文件 thymeleaf 的使用Controller返回参数String资源文件路径访问端点显示HTML页面 thymeleaf 的搭建 Pom 文件 Pom 文件引入 spring-boot-starter-thymeleaf 依赖 <dependency><groupId>org.springfra…

Linux | 零基础Ubuntu搭建JDK

目录 软件简介 在线文档 压缩包安装 下载地址 补:传输软件 传输等待 目录结构 解压安装 配置环境 更新环境 测试JDK结果 APT安装 软件简介 Java Development Kit (JDK) 是 Sun 公司&#xff08;已被 Oracle 收购&#xff09;针对 Java 开发员的软件开发工具包。自…

揭秘 Fluss 架构组件

这是 Fluss 系列的第四篇文章了&#xff0c;我们先回顾一下前面三篇文章主要说了哪些内容。 Fluss 部署&#xff0c;带领大家部署Fluss 环境&#xff0c;体验一下 Fluss 的功能Fluss 整合数据湖的操作&#xff0c;体验Fluss 与数据湖的结合讲解了 Fluss、Kafka、Paimon 之间的…

PyQt的介绍

举例 解释 一 PyQt是什么 PyQt 是 Python 编程语言的一个库&#xff0c;它是 Qt 库的 Python 绑定。Qt 是一个跨平台的图形用户界面&#xff08;GUI&#xff09;开发框架&#xff0c;广泛应用于开发桌面应用程序。PyQt 使得 Python 开发者能够利用 Qt 框架的强大功能来创建图…

数据库高安全—openGauss安全整体架构安全认证

openGauss作为新一代自治安全数据库&#xff0c;提供了丰富的数据库基础安全能力&#xff0c;并逐步完善各类高阶安全能力。这些安全能力涵盖了访问登录认证、用户权限管理、审计与追溯及数据安全隐私保护等。本章节将围绕openGauss安全机制进行源码解读&#xff0c;以帮助数据…

计算机网络 (16)数字链路层的几个共同问题

一、封装成帧 封装成帧是数据链路层的一个基本问题。数据链路层把网络层交下来的数据构成帧发送到链路上&#xff0c;以及把接收到的帧中的数据取出并上交给网络层。封装成帧就是在一段数据的前后分别添加首部和尾部&#xff0c;构成了一个帧。接收端在收到物理层上交的比特流后…

SAP SD信贷管理信用管理手册(下)

1、项目类别的信贷激活 图1-12-1.项目类别的信贷设置路径 图1-12-2.项目类别的信贷参数激活 说明&#xff1a;项目类别是否进行信贷管理设置。 2、定义信贷组 图1-13-1.定义信贷组路径 图1-13-2.信贷组定义 说明&#xff1a;信贷组参与后续信贷控制的组合分配。 3、销售凭证及…

【linux学习指南】可重入函数与volatile

文章目录 &#x1f4dd;可重⼊函数&#x1f320; volatile&#x1f6a9;总结 &#x1f4dd;可重⼊函数 main函数调⽤insert函数向⼀个链表head中插⼊节点node1,插⼊操作分为两步,刚做完第⼀步的时候,因为硬件中断使进程切换到内核,再次回⽤⼾态之前检查到有信号待处理,于是切换…

Web安全 - “Referrer Policy“ Security 头值不安全

文章目录 概述原因分析风险说明Referrer-Policy 头配置选项1. 不安全的策略no-referrer-when-downgradeunsafe-url 2. 安全的策略no-referreroriginorigin-when-cross-originsame-originstrict-originstrict-origin-when-cross-origin 推荐配置Nginx 配置示例 在 Nginx 中配置 …

FFmpeg:详细安装教程与环境配置指南

FFmpeg 部署完整教程 在本篇博客中&#xff0c;我们将详细介绍如何下载并安装 FFmpeg&#xff0c;并将其添加到系统的环境变量中&#xff0c;以便在终端或命令行工具中直接调用。无论你是新手还是有一定基础的用户&#xff0c;这篇教程都能帮助你轻松完成 FFmpeg 的部署。 一、…

AcWing练习题:平均数1

读取两个浮点数 AA 和 BB 的值&#xff0c;对应于两个学生的成绩。 请你计算学生的平均分&#xff0c;其中 AA 的成绩的权重为 3.53.5&#xff0c;BB 的成绩的权重为 7.57.5。 成绩的取值范围在 00 到 1010 之间&#xff0c;且均保留一位小数。 输入格式 输入占两行&#x…

Unity学习笔记(四)如何实现角色攻击、组合攻击

前言 本文为Udemy课程The Ultimate Guide to Creating an RPG Game in Unity学习笔记 实现动画 首先实现角色移动的动画&#xff0c;动画的实现过程在第二篇&#xff0c;这里仅展示效果 attack1 触发攻击动画 实现脚本 接下来我们通过 Animator 编辑动画之间的过渡&#…

如何使用MySQL的group_concat函数快速做关联查询?

当我们需要做一对多的关联查询时&#xff0c;会很容易想到用left join来实现。例如&#xff0c;现有country表和city表之间建立了一对多的关联关系。如果要展示各国家以及城市列表&#xff0c;会很容易想到以下SQL&#xff1a; SELECT country, city FROM country LEFT JOI…