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

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


一、MyBatis-Plus 是什么?

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

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

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


二、MyBatis-Plus 的核心特性

1. 开箱即用的 CRUD

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

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

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

2. 强大的条件构造器

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

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

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

3. 分页插件

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

java 复制代码
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

XML 复制代码
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
    <version>3.5.9</version>
</dependency>

2. 配置数据源

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

XML 复制代码
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 表,我们可以创建对应的实体类:

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

4. 创建 Mapper 接口

继承 BaseMapper 即可:

java 复制代码
@Mapper
public interface UserMapper extends BaseMapper<User> {
}

5. 调用 CRUD 接口

ServiceController 中使用:

java 复制代码
@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> 接口,定义业务逻辑层的接口:

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

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

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

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

java 复制代码
@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 感兴趣,不妨动手尝试一下,亲自体验它的便捷性!之后,我会继续进一步展开来讲解开发中常用的部分,以及一些核心机制等内容,感兴趣的朋友可以关注留意一下噢!

相关推荐
ss2733 分钟前
手写MyBatis第85弹:组合模式在SqlNode设计中的精妙应用
mybatis
sniper_fandc3 分钟前
MybatisPlus和pagehelper分页冲突—关于jsqlparser、pagehelper、MybatisPlus三者的版本兼容问题
mybatis·mybatisplus
我真的是大笨蛋23 分钟前
开闭原则详解(OCP)
java·设计模式·性能优化·开闭原则·设计规范
编啊编程啊程25 分钟前
gRPC从0到1系列【19】
java·spring boot·rpc·dubbo·nio
泥嚎泥嚎32 分钟前
【Android】Android 的三种动画(帧动画、View 动画、属性动画)
java
qluka34 分钟前
Android 窗口结构(三) Home Task 添加Home ActivityRecord
android·开发语言
这儿有一堆花39 分钟前
PHP文件与本地及外部资源的深度交互指南
开发语言·php
不良人天码星44 分钟前
使用Java连接redis以及开放redis端口的问题
java·开发语言·redis
马克学长44 分钟前
SSM村务管理系统s2qnw(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·服务器·数据库
羊锦磊1 小时前
[ Spring 框架 ] 数据访问和事务管理
java·后端·spring