[架构之美]Spring Boot集成MyBatis-Plus高效开发(十七)
摘要:本文通过图文+代码实战,详细讲解Spring Boot整合MyBatis-Plus全流程,涵盖代码生成器、条件构造器、分页插件等核心功能,助你减少90%的SQL编写量,提升企业级开发效率。
一、MyBatis-Plus核心优势
1.1 功能对比(MyBatis vs MyBatis-Plus)
功能 | MyBatis | MyBatis-Plus |
---|---|---|
通用CRUD操作 | 需手写 | 内置实现 |
分页插件 | 需配置 | 开箱即用 |
代码生成器 | 无 | 可视化生成 |
逻辑删除 | 手动处理 | 注解支持 |
性能分析插件 | 无 | 内置拦截器 |
1.2 核心功能架构图
二、环境准备
2.1 必需依赖
<dependencies>
<!-- Spring Boot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MyBatis-Plus Starter -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
</dependencies>
2.2 数据库准备
CREATE TABLE `user` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`age` int DEFAULT NULL,
`email` varchar(100) DEFAULT NULL,
`is_deleted` tinyint(1) DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
三、四步完成基础整合
步骤1:配置数据源
# application.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mp_demo?useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启SQL日志
步骤2:创建实体类
@Data
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
@TableLogic
private Integer isDeleted;
}
步骤3:创建Mapper接口
public interface UserMapper extends BaseMapper<User> {
// 继承基础CRUD方法
}
步骤4:添加Mapper扫描
@SpringBootApplication
@MapperScan("com.example.mapper")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
四、五大核心功能实战
4.1 基础CRUD操作
// 插入
User user = new User();
user.setName("CSDN");
userMapper.insert(user);
// 查询
User result = userMapper.selectById(1L);
// 分页查询
Page<User> page = new Page<>(1, 10);
userMapper.selectPage(page, null);
4.2 条件构造器(QueryWrapper)
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.like("name", "CSDN")
.between("age", 20, 30)
.orderByDesc("id");
List<User> users = userMapper.selectList(wrapper);
4.3 逻辑删除配置
mybatis-plus:
global-config:
db-config:
logic-delete-field: isDeleted # 逻辑删除字段
logic-delete-value: 1 # 删除标识值
logic-not-delete-value: 0 # 未删除标识值
4.4 自动填充功能
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
// 实现MetaObjectHandler
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
}
}
4.5 性能分析插件
@Bean
public PerformanceInterceptor performanceInterceptor() {
PerformanceInterceptor interceptor = new PerformanceInterceptor();
interceptor.setMaxTime(1000); // SQL执行最大时长(ms)
interceptor.setFormat(true); // 格式化SQL
return interceptor;
}
五、企业级代码生成器
5.1 代码生成器配置
FastAutoGenerator.create("jdbc:mysql://localhost:3306/mp_demo", "root", "123456")
.globalConfig(builder -> builder.author("CSDN"))
.packageConfig(builder -> builder.parent("com.example"))
.strategyConfig(builder -> builder.addInclude("user"))
.templateEngine(new FreemarkerTemplateEngine())
.execute();
5.2 生成文件结构
src/main/java/com/example
├── entity
│ └── User.java
├── mapper
│ └── UserMapper.java
└── service
├── UserService.java
└── impl
└── UserServiceImpl.java
六、高频问题解决方案
Q1:分页插件不生效?
- 确认已配置分页插件Bean
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
Q2:字段映射不一致?
- 使用
@TableField
注解指定数据库字段名
@TableField("user_name")
private String name;
Q3:SQL日志不显示?
- 检查配置项
mybatis-plus.configuration.log-impl
- 确保日志级别为DEBUG
七、性能优化建议
- 索引优化:为查询条件字段添加索引
- 批量操作:使用
saveBatch
替代循环插入 - SQL监控:集成Druid数据源监控
- 缓存策略:整合Redis二级缓存
@Bean
public MybatisRedisCacheFactory redisCacheFactory() {
return new MybatisRedisCacheFactory(redisTemplate);
}
八、最佳实践总结
- 代码规范:
- 实体类字段使用包装类型(避免NPE)
- Service层继承
IService
接口
- 安全建议:
- 禁用MP的DELETE全表操作
mybatis-plus: global-config: db-config: block-attack: true
- 版本管理:锁定MyBatis-Plus版本
希望本教程对您有帮助,请点赞❤️收藏⭐关注支持!欢迎在评论区留言交流技术细节!