MyBatis 升级至 MyBatis-Plus 详细步骤
1. 升级背景与优势
-
MyBatis-Plus 核心优势:
-
内置通用 CRUD,减少重复代码。
-
强大的条件构造器(
QueryWrapper
、UpdateWrapper
)。 -
分页插件、性能分析插件、乐观锁等开箱即用功能。
-
代码生成器,快速生成 Entity、Mapper、Service。
-
-
适用场景:需要快速开发、减少样板代码的中大型项目。
2. 升级前准备
-
确认当前环境:
-
MyBatis 版本(如 3.5.x)。
-
项目框架(Spring Boot 或传统 Spring)。
-
数据库类型(MySQL、Oracle 等)。
-
-
备份项目:
-
确保代码和数据库备份,防止升级过程中数据丢失。
-
-
检查兼容性:
-
参考 MyBatis-Plus 版本兼容表,选择与当前 MyBatis 和 Spring Boot 兼容的版本。
示例:
-
- Spring Boot 2.x → MyBatis-Plus 3.4.x/3.5.x
-
Spring Boot 3.x → MyBatis-Plus 3.5.3+
3. 依赖替换
1.移除原有 MyBatis 依赖:
<!-- 删除原有依赖 -->
<!-- <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.13</version>
</dependency> -->
2.添加 MyBatis-Plus 依赖:
<!-- Spring Boot 项目 -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version>
</dependency><!-- 传统 Spring 项目 -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus</artifactId><version>3.5.3.1</version>
</dependency>
3.其他可选依赖:
<!-- 代码生成器 -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.3.1</version>
</dependency><!-- 分页插件(已包含在 starter 中) -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-extension</artifactId><version>3.5.3.1</version>
</dependency>
4. 配置调整
-
Spring Boot 配置(application.yml):
mybatis-plus:configuration:# 保持与原有 MyBatis 配置一致(如日志、驼峰转换)map-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImpl# 指定 Mapper 扫描路径mapper-locations: classpath*:mapper/**/*.xml# 全局配置global-config:db-config:id-type: auto # 主键策略(自增、UUID 等)logic-delete-field: deleted # 逻辑删除字段logic-delete-value: 1 # 删除标记值logic-not-delete-value: 0 # 未删除标记值
2.传统 Spring 配置(mybatis-config.xml):
<configuration><settings><!-- 保持原有 MyBatis 配置 --><setting name="mapUnderscoreToCamelCase" value="true"/></settings><!-- 配置 MyBatis-Plus 插件 --><plugins><plugin interceptor="com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor"/></plugins> </configuration>
5. 代码改造
-
Mapper 接口继承 BaseMapper:
// 原有 MyBatis Mapper public interface UserMapper {User selectById(Long id); }// 改造为 MyBatis-Plus Mapper public interface UserMapper extends BaseMapper<User> {// 原有自定义方法可保留User selectUserDetail(Long id); }
2.实体类添加注解:
@Data @TableName("user") // 指定表名(默认类名驼峰转下划线) public class User {@TableId(type = IdType.AUTO) // 主键策略private Long id;private String name;@TableField("user_age") // 字段映射private Integer age;@TableLogic // 逻辑删除字段private Integer deleted; }
3.Service 层优化:
// 原有 Service public class UserService {@Autowiredprivate UserMapper userMapper;public User getById(Long id) {return userMapper.selectById(id);} }// 改造为继承 ServiceImpl public interface UserService extends IService<User> {User getUserDetail(Long id); }@Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {@Overridepublic User getUserDetail(Long id) {return baseMapper.selectUserDetail(id);} }
6. 功能迁移与升级
1.分页功能:
- 原有 PageHelper:
PageHelper.startPage(1, 10);
List<User> users = userMapper.selectList();
PageInfo<User> pageInfo = new PageInfo<>(users);
- MyBatis-Plus 分页:
// 配置分页插件(已包含在 starter 中) @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor());return interceptor; }// 使用分页 Page<User> page = new Page<>(1, 10); Page<User> userPage = userMapper.selectPage(page, null);
2.条件查询:
-
原有 XML 动态 SQL:
<select id="selectByCondition" resultType="User">SELECT * FROM user WHERE name LIKE #{name} AND age > #{age} </select>
- MyBatis-Plus QueryWrapper:
QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.like("name", "张").gt("age", 18); List<User> users = userMapper.selectList(wrapper);
3.逻辑删除:
-
原有手动更新:
UPDATE user SET deleted = 1 WHERE id = 1
- MyBatis-Plus 自动处理:
userMapper.deleteById(1); // 自动更新 deleted 字段
7. 代码生成器(可选)
-
配置生成器:
public class CodeGenerator {public static void main(String[] args) {FastAutoGenerator.create("jdbc:mysql://localhost:3306/test", "root", "123456").globalConfig(builder -> builder.outputDir("src/main/java").author("YourName")).packageConfig(builder -> builder.parent("com.example")).strategyConfig(builder -> builder.addInclude("user", "order")).execute();} }
2.生成文件:
Entity、Mapper、XML、Service、Controller 自动生成。
8. 注意事项
1.兼容性问题:
-
MyBatis 原生方法(如
selectOne
)在 MyBatis-Plus 中行为可能不同,需测试验证。 -
自定义的 TypeHandler、Interceptor 需检查是否与 MyBatis-Plus 插件冲突。
2.事务管理:
-
确保
@Transactional
注解和事务管理器配置正常,与 MyBatis-Plus 无冲突。
3.性能监控:
-
使用 MyBatis-Plus 的
PerformanceInterceptor
监控 SQL 性能:@Bean public MybatisPlusInterceptor performanceInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PerformanceInnerInterceptor());return interceptor; }
9. 测试与验证
1.单元测试:
-
对 CRUD、分页、条件查询等核心功能进行单元测试。
-
示例:
@SpringBootTest class UserMapperTest {@Autowiredprivate UserMapper userMapper;@Testvoid testSelect() {User user = userMapper.selectById(1);Assertions.assertNotNull(user);} }
2.集成测试:
-
验证事务、多表操作、复杂查询是否正常。
总结
通过依赖替换、配置调整、代码改造和功能迁移,MyBatis 可平滑升级至 MyBatis-Plus,显著提升开发效率。重点在于合理利用 MyBatis-Plus 的通用 CRUD、条件构造器和代码生成器,同时确保原有业务逻辑兼容性。升级后,结合 MyBatis-Plus 的增强功能,可大幅减少样板代码,提高项目可维护性。