1. 项目背景与技术选型
最近在重构一个老项目的持久层时,我决定采用MyBatis-Plus+Docker的技术组合。这个选择主要基于两个现实需求:一是需要快速实现基础CRUD功能但又要保留复杂SQL的灵活性,二是希望开发环境能够快速部署且与生产环境保持一致。MyBatis-Plus作为MyBatis的增强工具,在简化单表操作方面表现出色,而Docker则完美解决了"在我机器上能跑"的环境一致性问题。
在实际企业开发中,这种技术组合越来越常见。根据2023年Java生态调查报告显示,MyBatis-Plus在国内Java项目中的使用率已达到67%,而Docker在开发环境容器化领域的占有率更是高达89%。这两个技术的结合,既能提升开发效率,又能降低运维成本。
2. MyBatis-Plus核心功能解析
2.1 基础CRUD的简化实现
MyBatis-Plus最亮眼的功能就是内置的BaseMapper。我们只需要让Mapper接口继承BaseMapper,就能直接使用各种单表操作方法。比如:
public interface UserMapper extends BaseMapper<User> { // 无需编写基础CRUD方法 } // 使用示例 userMapper.selectById(1); userMapper.insert(newUser); userMapper.updateById(updatedUser);注意:虽然BaseMapper很强大,但复杂关联查询还是建议使用传统的XML映射文件方式,保持灵活性。
2.2 条件构造器的妙用
Wrapper是MyBatis-Plus另一个核心功能,它让我们可以用Java代码构建查询条件:
QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.like("name", "张") .between("age", 20, 30) .orderByDesc("create_time"); List<User> userList = userMapper.selectList(wrapper);实际开发中我总结了一个经验:对于固定条件查询,使用Wrapper比XML更直观;但对于动态条件特别复杂的场景,XML可能更合适。
2.3 代码生成器的效率提升
MyBatis-Plus的代码生成器可以一键生成Entity、Mapper、Service、Controller等层代码:
AutoGenerator generator = new AutoGenerator(); generator.setGlobalConfig(config) .setDataSource(dataSourceConfig) .setPackageInfo(packageConfig) .setStrategy(strategyConfig); generator.execute();建议将生成器配置单独提取到配置类中,方便团队共享。我们项目里把这个做成了Maven插件,新模块开发时运行一个命令就能生成基础代码。
3. Docker环境配置实战
3.1 开发环境容器化
传统的开发环境配置是个痛点,特别是当项目需要MySQL、Redis等多个服务时。使用Docker后,我们可以用docker-compose.yml一键启动所有依赖服务:
version: '3' services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root ports: - "3306:3306" volumes: - ./mysql/data:/var/lib/mysql - ./mysql/conf:/etc/mysql/conf.d redis: image: redis:6 ports: - "6379:6379" volumes: - ./redis/data:/data重要提示:记得把配置文件和数据目录挂载到宿主机,这样容器重启后数据不会丢失。
3.2 应用容器化部署
将Spring Boot应用打包成Docker镜像也很简单。首先在pom.xml中添加jib-maven-plugin:
<plugin> <groupId>com.google.cloud.tools</groupId> <artifactId>jib-maven-plugin</artifactId> <version>3.3.1</version> <configuration> <to> <image>myapp:${project.version}</image> </to> </configuration> </plugin>然后执行mvn compile jib:dockerBuild就能构建镜像并加载到本地Docker。
4. 整合实践与问题排查
4.1 MyBatis-Plus与Docker的整合
在容器化环境中使用MyBatis-Plus时,有几个关键配置需要注意:
- 数据库连接URL要指向容器服务名:
spring.datasource.url=jdbc:mysql://mysql:3306/my_db- 建议在应用启动时检查数据库连接,可以添加这个Bean:
@Bean public CommandLineRunner checkDataSource(DataSource dataSource) { return args -> { try (Connection conn = dataSource.getConnection()) { log.info("数据库连接测试成功"); } }; }4.2 常见问题解决方案
问题1:Docker中MySQL连接缓慢解决方法:在MySQL配置中添加:
[mysqld] skip-name-resolve问题2:MyBatis-Plus更新操作不生效检查点:
- 确保Entity类有@TableId注解
- 更新时确保id字段有值
- 检查是否有乐观锁@Version注解冲突
问题3:Docker容器时区不对解决方法:在Dockerfile中添加:
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime5. 性能优化建议
5.1 MyBatis-Plus层优化
- 批量操作使用executeBatch:
List<User> userList = ...; userService.saveBatch(userList, 1000); // 每1000条提交一次- 合理使用二级缓存,在配置类中添加:
@Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); return interceptor; }5.2 Docker层优化
- 使用多阶段构建减小镜像体积:
FROM maven:3.8-jdk-11 AS build COPY . . RUN mvn package FROM openjdk:11-jre-slim COPY --from=build /target/app.jar /app.jar ENTRYPOINT ["java","-jar","/app.jar"]- 合理设置JVM参数:
ENV JAVA_OPTS="-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0" ENTRYPOINT exec java $JAVA_OPTS -jar /app.jar6. 开发工作流改进
经过这次重构,我们团队形成了新的开发流程:
- 新成员入职时只需安装Docker,运行
docker-compose up就能获得完整开发环境 - 使用MyBatis-Plus代码生成器快速创建基础模块
- 开发完成后用Jib构建镜像,在测试环境验证
- 使用相同的镜像部署到生产环境
这种工作流使我们的开发效率提升了约40%,环境问题减少了90%。特别是在多人协作时,再也不用担心"在我机器上是好的"这种问题了。