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: true log-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 { @Autowired private 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 { @Override public 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 { @Autowired private UserMapper userMapper; @Test void testSelect() { User user = userMapper.selectById(1); Assertions.assertNotNull(user); } }
2.集成测试:
-
验证事务、多表操作、复杂查询是否正常。
总结
通过依赖替换、配置调整、代码改造和功能迁移,MyBatis 可平滑升级至 MyBatis-Plus,显著提升开发效率。重点在于合理利用 MyBatis-Plus 的通用 CRUD、条件构造器和代码生成器,同时确保原有业务逻辑兼容性。升级后,结合 MyBatis-Plus 的增强功能,可大幅减少样板代码,提高项目可维护性。