Java项目实战:MyBatis-Plus整合全流程详解(含最佳实践)
目录导读
为什么选择MyBatis-Plus?
在Java开发中,数据库操作框架的选择直接影响开发效率,MyBatis-Plus(简称MP)作为MyBatis的增强工具,在保留MyBatis灵活性的同时,通过自动生成CRUD方法、Lambda条件构造器、分页插件等特性,将开发效率提升30%以上,根据2024年Java生态报告,MP在Spring Boot项目中的使用率已超过65%。

核心优势:
- 无侵入式设计:不影响原生MyBatis功能
- 代码生成器:一键生成Entity、Mapper、Service
- 条件构造器:告别繁琐的XML映射文件
- 分页插件:支持多种数据库物理分页
环境准备与依赖配置
技术栈要求
| 组件 | 推荐版本 | 说明 |
|---|---|---|
| JDK | 8+ | 建议使用11或17 |
| Spring Boot | 7.x | 兼容最新MP版本 |
| MyBatis-Plus | 5.3+ | 最新稳定版 |
| MySQL | 0+ | 支持其他主流数据库 |
Maven依赖配置(pom.xml核心部分)
<!-- MyBatis-Plus 启动器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- 代码生成器(可选) -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.3</version>
</dependency>
注意: 如果使用Spring Boot 3.x,需选择MP 3.5.5+版本,并确保JDK 17以上。
核心整合步骤(附代码)
步骤1:配置数据源与MP参数
在application.yml中添加:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/demo_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: 123456
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开发环境开启SQL日志
global-config:
db-config:
logic-delete-field: deleted # 全局逻辑删除字段
table-prefix: t_ # 全局表前缀
步骤2:创建实体类与Mapper
// User实体类
@Data
@TableName("t_user") // 映射表名
public class User {
@TableId(type = IdType.AUTO) // 自增主键
private Long id;
private String name;
private Integer age;
private String email;
@TableLogic // 逻辑删除注解
private Integer deleted;
}
// Mapper接口
@Mapper
public interface UserMapper extends BaseMapper<User> {
// 无需写任何方法,继承BaseMapper即可获得CRUD
}
步骤3:编写Service层
@Service
public class UserService extends ServiceImpl<UserMapper, User> {
// 可直接使用ServiceImpl提供的方法
public User findByName(String name) {
return lambdaQuery().eq(User::getName, name).one();
}
}
步骤4:控制器测试
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/list")
public Result list() {
List<User> list = userService.list();
return Result.success(list);
}
@PostMapping("/add")
public Result add(@RequestBody User user) {
boolean save = userService.save(user);
return save ? Result.success() : Result.fail();
}
}
核心原理: BaseMapper<T>内置了insert、deleteById、updateById、selectOne等18个基础方法,无需编写任何SQL语句即可完成单表操作。
高级功能实战:分页与条件构造器
1 分页插件配置
@Configuration
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 添加分页拦截器,支持多数据库
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
分页查询示例:
// 创建分页对象(当前页,每页大小) Page<User> page = new Page<>(1, 10); // 执行分页查询 page = userMapper.selectPage(page, null); // 获取数据 List<User> records = page.getRecords(); long total = page.getTotal(); // 总记录数
2 Lambda条件构造器(复杂查询)
// 多条件组合查询
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getAge, 25) // 年龄等于25
.like(User::getName, "张") // 姓名包含"张"
.ge(User::getId, 100) // ID大于等于100
.orderByDesc(User::getAge); // 按年龄降序
List<User> users = userMapper.selectList(wrapper);
3 代码生成器自动化
// 快速生成Controller、Service、Mapper、Entity
FastAutoGenerator.create("jdbc:mysql://localhost:3306/demo_db", "root", "123456")
.globalConfig(builder -> builder.author("开发者").outputDir("src/main/java"))
.packageConfig(builder -> builder.parent("com.example.demo"))
.strategyConfig(builder -> builder.addInclude("t_user")) // 指定表名
.execute();
常见问题与Q&A
Q1:整合后出现“Invalid bound statement (not found)”错误?
答: 最常见原因是Mapper接口未被扫描,解决方式:
- 在启动类添加
@MapperScan("com.example.demo.mapper")注解 - 或在每个Mapper接口上加
@Mapper注解(推荐第一种)
Q2:如何自定义SQL(使用XML文件)?
答: MP完全兼容原生MyBatis,可在resources/mapper/目录下创建XML文件:
<mapper namespace="com.example.demo.mapper.UserMapper">
<select id="findCustomList" resultType="User">
SELECT * FROM t_user WHERE age > #{age}
</select>
</mapper>
然后在UserMapper接口中定义方法:List<User> findCustomList(@Param("age") Integer age);
Q3:逻辑删除无法自动填充时间字段?
答: 需配合MetaObjectHandler自动填充处理器:
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime.now());
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.now());
}
}
Q4:MyBatis-Plus和PageHelper哪个更好?
答: 推荐MP自带分页,原因:MP的分页是物理分页(自动拼接LIMIT),而PageHelper是基于拦截器的,在高并发场景下存在线程安全问题,MP的分页插件经过阿里巴巴内部验证,性能更稳定。
总结与性能优化建议
整合MyBatis-Plus的最佳实践流程为:配置依赖 → 扫描Mapper → 继承BaseMapper → 使用LambdaQueryWrapper → 配置分页插件,通过本文步骤,你可在10分钟内完成一个生产级的数据访问层搭建。
性能优化3点建议
- 开启懒加载: 在
application.yml中配置mybatis-plus.configuration.lazy-loading-enabled=true - 避免N+1查询: 使用MP的
selectList()时,检查是否可通过QueryWrapper的in方法合并查询 - 索引优化: 对频繁查询的字段(如
name、age)建立数据库索引,MP不会自动处理索引问题
额外提示: 生产环境建议关闭StdOutImpl日志输出(配置为org.apache.ibatis.logging.nologging),以免影响性能。
通过本教程,你已掌握从零开始整合MyBatis-Plus的全流程,后续可进一步探索动态表名解析器、多租户插件等高级特性,让你的Java应用更高效灵活。