一、环境搭建与基础配置
1.1 依赖管理方案
在Spring Boot项目中集成MyBatis-Plus需配置三个核心依赖:
<dependencies><!-- 核心启动器(自动配置MyBatis-Plus) --><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><scope>runtime</scope></dependency><!-- 可选:Lombok简化实体类开发 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency></dependencies>
建议通过Spring Initializr创建项目时勾选”MyBatis Framework”和”MySQL Driver”,IDE会自动生成基础依赖结构。
1.2 数据源配置优化
在application.yml中配置多环境数据源时,推荐采用YAML的Profiles特性:
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driver# 公共配置hikari:maximum-pool-size: 15connection-timeout: 30000---spring:profiles: devdatasource:url: jdbc:mysql://localhost:3306/dev_db?useSSL=falseusername: dev_userpassword: dev@123---spring:profiles: proddatasource:url: jdbc:mysql://rds-instance.example.com:3306/prod_dbusername: prod_adminpassword: ${ENCRYPTED_PASSWORD}
生产环境建议使用配置中心(如Nacos)管理敏感信息,结合Jasypt等加密工具保护数据库密码。
1.3 实体类设计规范
遵循以下原则设计实体类:
- 表映射注解:使用
@TableName指定表名,避免默认下划线转换问题 - 主键策略:推荐使用雪花算法
IdType.ASSIGN_ID替代数据库自增 - 字段类型映射:注意Java类型与数据库类型的精确对应
示例实体类:
@Data@TableName("sys_user")public class User {@TableId(type = IdType.ASSIGN_ID)private Long id;@TableField("user_name") // 字段名映射private String username;@TableField(value = "create_time", fill = FieldFill.INSERT) // 自动填充private LocalDateTime createTime;@TableLogic // 逻辑删除private Integer deleted;}
二、核心功能实现
2.1 CRUD操作进阶
基础操作示例
@Servicepublic class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;// 插入(返回影响行数)public int addUser(User user) {return userMapper.insert(user);}// 批量插入(MyBatis-Plus 3.5.0+支持)public boolean batchInsert(List<User> users) {return userMapper.insertBatchSomeColumn(users) == users.size();}}
条件构造器详解
Wrapper是MyBatis-Plus的核心组件,支持链式调用:
// 复杂查询示例public List<User> queryUsers(String name, Integer minAge) {QueryWrapper<User> wrapper = new QueryWrapper<>();wrapper.like("user_name", name).ge("age", minAge).orderByDesc("create_time").last("limit 10"); // 追加原生SQLreturn userMapper.selectList(wrapper);}// Lambda表达式写法(类型安全)public User getUserById(Long id) {LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery();wrapper.eq(User::getId, id).select(User::getId, User::getUsername);return userMapper.selectOne(wrapper);}
2.2 分页查询实现
配置分页插件后即可使用Page对象:
@Configurationpublic class MybatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor());return interceptor;}}// 服务层实现public PageResult<User> pageQuery(int pageNum, int pageSize) {Page<User> page = new Page<>(pageNum, pageSize);LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery();wrapper.eq(User::getDeleted, 0);IPage<User> result = userMapper.selectPage(page, wrapper);return new PageResult<>(result.getRecords(),result.getTotal(),pageNum,pageSize);}
三、高级特性应用
3.1 动态表名策略
实现TableNameHandler接口支持动态表名:
@Componentpublic class DynamicTableNameHandler implements TableNameHandler {@Overridepublic String dynamicTableName(String sql, String tableName) {// 根据业务逻辑返回实际表名String dateSuffix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMM"));return tableName + "_" + dateSuffix;}}// 配置动态表名解析器@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();DynamicTableNameInnerInterceptor dynamicInterceptor = new DynamicTableNameInnerInterceptor();dynamicInterceptor.setTableNameHandler(dynamicTableNameHandler);interceptor.addInnerInterceptor(dynamicInterceptor);return interceptor;}
3.2 性能优化方案
-
SQL执行分析:开启MyBatis-Plus的SQL性能分析插件
mybatis-plus:global-config:sql-parser-cache: trueconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
-
批量操作优化:使用
saveBatch方法时配置批量大小// 自定义批量大小(默认1000)@Transactional(rollbackFor = Exception.class)public void batchInsert(List<User> users) {userMapper.insertBatchSomeColumn(users);// 或使用Service层的saveBatch// userService.saveBatch(users, 500);}
-
二级缓存配置:在Mapper接口添加
@CacheNamespace注解@CacheNamespace(implementation = PerpetualCache.class,eviction = LruCache.class,flushInterval = 60000)public interface UserMapper extends BaseMapper<User> {// ...}
四、最佳实践建议
- 统一异常处理:结合
@ControllerAdvice捕获MybatisPlusException - DTO转换:使用MapStruct等工具实现Entity与DTO的自动转换
- 代码生成器:通过MyBatis-Plus Generator快速生成基础代码
- 多数据源:使用
AbstractRoutingDataSource实现动态数据源切换 - 防SQL注入:始终使用Wrapper构建查询条件,避免字符串拼接
通过系统掌握上述技术方案,开发团队可显著提升数据库操作效率,减少80%以上的CRUD代码量,同时保持代码的可读性和可维护性。建议在实际项目中结合Spring Security实现细粒度的数据权限控制,构建企业级的数据访问层解决方案。