MybatisPlus 项目
https://gitee.com/supervol/loong-springboot-study
(记得给个start,感谢)
MybatisPlus 概述
在 Spring Boot 3 环境中,MyBatis-Plus(简称 MP)作为 MyBatis 的增强工具,极大简化了数据库操作开发。它在保留 MyBatis 原生功能的基础上,提供了 CRUD 接口封装、条件构造、分页插件等实用特性,同时完美适配 Spring Boot 3 的特性(如 Jakarta EE 规范、Java 17 + 支持)。
MybatisPlus 核心
- 无侵入性:完全兼容 MyBatis,无需修改现有 MyBatis 代码即可平滑迁移。
- CRUD 自动化:内置通用 Mapper/Service 接口,无需手写基础 SQL。
- 丰富特性:提供条件构造器、分页插件、逻辑删除、乐观锁等功能。
- 高效开发:支持代码生成器,自动生成实体类、Mapper、Service 等代码。
MybatisPlus 对比
1. 核心定位
-
Mybatis:一款轻量级的持久层框架,专注于 SQL 映射(将 Java 方法与 SQL 语句关联),通过 XML 或注解方式配置 SQL,保留了原生 SQL 的灵活性,但基础 CRUD 操作需要手动编写 SQL。
-
MybatisPlus :基于 MyBatis 的增强工具,完全兼容 Mybatis ,核心目标是简化开发。它在 Mybatis 基础上封装了通用 CRUD 接口、条件构造器等功能,减少重复代码,同时不丢失 Mybatis 的原生能力。
2. 差异对比
对比维度 | Mybatis | MybatisPlus |
---|---|---|
CRUD 操作 | 需手动编写 SQL(XML 或注解),例如 insert 、selectById 等基础操作都要写 SQL。 |
内置 BaseMapper 和 IService 接口,继承后直接获得全套 CRUD 方法,无需手写 SQL。 |
SQL 编写方式 | 依赖 XML 或 @Select 等注解编写 SQL,动态 SQL 需用 <if> <where> 等标签。 |
提供 条件构造器 (QueryWrapper /LambdaQueryWrapper ),通过 Java 代码动态构建条件,减少 XML 配置;同时兼容 Mybatis 的 SQL 编写方式。 |
功能特性 | 仅提供基础 SQL 映射能力,无内置高级特性(如分页、逻辑删除等),需手动实现或集成第三方插件。 | 内置丰富特性:- 分页插件(无需手动写 LIMIT )- 逻辑删除(自动将删除转为更新)- 乐观锁(解决并发更新冲突)- 代码生成器(自动生成实体类、Mapper 等)- 枚举映射、字段填充等。 |
开发效率 | 基础操作代码重复度高,需手动维护 SQL 与 Java 方法的映射,开发效率较低。 | 省去 90% 以上的基础 SQL 编写工作,复杂查询可通过条件构造器快速实现,开发效率显著提升。 |
学习成本 | 需掌握 XML 配置、动态 SQL 标签、参数绑定等,初期学习成本略高。 | 完全兼容 Mybatis,学会 Mybatis 后可快速上手;新增特性(如条件构造器)简单直观,学习成本低。 |
兼容性 | 无依赖,独立使用。 | 完全依赖 Mybatis,可无缝集成到现有 Mybatis 项目中,无需修改原有代码。 |
3. 适用场景
-
优先选 Mybatis :当项目需要高度定制 SQL(如复杂多表联查、存储过程调用),且团队更习惯直接编写原生 SQL 时,MyBatis 的灵活性更有优势。
-
优先选 MybatisPlus:大部分业务场景(尤其是 CRUD 操作频繁的项目),MybatisPlus 能极大减少重复劳动,提升开发效率;同时复杂 SQL 仍可通过 XML 或注解编写,兼顾灵活性。
MybatisPlus 示例
请参考项目地址中 springboot-orm/springboot-mybatisplus 模块代码。
MybatisPlus 集成
1. 依赖配置
Spring Boot 3 使用 Jakarta EE 规范,需选择支持 Spring Boot 3 的 MyBatis-Plus 版本(建议 3.5.3.1 及以上):
XML
<!-- Spring Boot 3父工程 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.0</version>
<relativePath/>
</parent>
<!-- MyBatis-Plus Starter(自动集成MyBatis和Spring Boot 3适配) -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.5</version>
</dependency>
<!-- 数据库驱动(以MySQL为例) -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!-- 数据源(HikariCP,Spring Boot 3默认) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
2. 配置文件
配置数据源和 MyBatis-Plus 基础参数:
spring:
datasource:
url: jdbc:mysql://localhost:3306/test_db?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
# 实体类包路径(可选,用于类型别名)
type-aliases-package: com.example.entity
# XML映射文件路径(若使用XML编写SQL)
mapper-locations: classpath:mapper/*.xml
configuration:
# 日志打印SQL(开发环境启用)
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 下划线转驼峰(自动匹配数据库字段与实体类属性)
map-underscore-to-camel-case: true
3. 启动类配置
通过@MapperScan
指定 Mapper 接口扫描路径:
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.example.mapper") // 扫描Mapper接口所在包
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
MybatisPlus 功能
1. 实体类定义
使用 MybatisPlus 注解映射数据库表:
java
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data // Lombok简化get/set
@TableName("user") // 映射数据库表名(默认与类名一致,可省略)
public class User {
@TableId(type = IdType.AUTO) // 主键自增
private Long id;
private String username; // 数据库字段若为user_name,会自动通过驼峰转换匹配
private Integer age;
private String email;
}
2. Mapper 接口
无需编写 XML,直接继承BaseMapper
获得 CRUD 能力:
java
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.entity.User;
public interface UserMapper extends BaseMapper<User> {
// 继承后自动拥有:insert、deleteById、updateById、selectById、selectList等方法
}
3. Service 层
Service 层通过继承IService
和ServiceImpl
进一步简化业务代码:
java
// Service接口
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.entity.User;
public interface UserService extends IService<User> {
// 继承后拥有更丰富的方法:saveOrUpdate、list、page、count等
}
// Service实现类
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.entity.User;
import com.example.mapper.UserMapper;
import com.example.service.UserService;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
// 无需额外代码,直接使用父类方法
}
4. 条件构造器
通过QueryWrapper
/LambdaQueryWrapper
动态构建查询条件,替代手动拼接 SQL:
java
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.example.entity.User;
import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/users")
public List<User> getUsers() {
// 示例:查询年龄>18且邮箱不为空的用户,按年龄降序排序
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.gt(User::getAge, 18) // 年龄>18
.isNotNull(User::getEmail) // 邮箱不为空
.orderByDesc(User::getAge); // 按年龄降序
return userService.list(queryWrapper);
}
}
5. 分页查询
配置分页插件后,可轻松实现分页功能:
java
// 配置分页插件(Spring Boot 3配置类)
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 添加分页插件(指定数据库类型,如MySQL)
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
// 分页查询示例
@GetMapping("/users/page")
public IPage<User> getUsersByPage() {
// 第1页,每页10条数据
Page<User> page = new Page<>(1, 10);
// 条件:年龄<30
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.lt(User::getAge, 30);
return userService.page(page, queryWrapper);
}
6. 高级特性
-
逻辑删除 :通过注解标记逻辑删除字段(如
deleted
),删除操作自动转为更新:java@TableLogic // 逻辑删除注解(0-未删除,1-已删除) private Integer deleted;
-
乐观锁:解决并发更新冲突,通过版本号字段实现:
java@Version // 乐观锁注解 private Integer version;
需在分页插件中添加乐观锁插件:
javainterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
-
代码生成器 :通过 AutoGenerator 自动生成实体类、Mapper、Service 等代码(需引入
mybatis-plus-generator
依赖)。
MybatisPlus 注意
- 版本兼容性:Spring Boot 3 需使用 MyBatis-Plus 3.5.3.1 及以上版本,避免依赖冲突。
- 日志配置 :通过
mybatis-plus.configuration.log-impl
开启 SQL 日志,方便调试。 - 自定义 SQL :复杂查询可通过 XML 或
@Select
注解编写,MyBatis-Plus 完全兼容。
MybatisPlus 总结
MyBatis-Plus 在 Spring Boot 3 环境中,通过简化 CRUD 操作、提供灵活的条件构造和分页功能,显著提升了数据库开发效率。其无侵入性设计让开发者既能享受便捷,又能保留 MyBatis 的原生能力,是 Spring Boot 项目中数据库层的优选方案。