MyBatis-Plus与Docker集成开发实践指南
1. 项目背景与技术选型这个标题看起来像是某个技术学习或项目开发日志的第四天记录主要涉及MyBatis-Plus和Docker两个技术栈的结合使用。在实际开发中这种组合非常常见——MyBatis-Plus作为ORM框架简化数据库操作Docker则用于容器化部署二者结合可以极大提升开发效率和部署便捷性。我曾在多个电商和ERP系统中采用这种技术组合。以最近的一个供应链管理系统为例使用MyBatis-Plus后基础CRUD代码量减少了约70%而Docker化部署使环境配置时间从原来的半天缩短到10分钟。这种效率提升对于需要快速迭代的项目尤为重要。2. MyBatis-Plus核心功能解析2.1 基础CRUD的简化MyBatis-Plus最显著的特点就是几乎零编码实现基础CRUD。通过继承BaseMapper接口你的DAO层立即获得18个常用方法public interface UserMapper extends BaseMapperUser { // 无需任何实现 }这样就能直接使用userMapper.selectById(1); userMapper.insert(newUser); userMapper.updateById(updatedUser);注意虽然方便但建议对复杂查询仍使用原生MyBatis的XML或注解方式保持代码可读性。2.2 条件构造器的强大功能Wrapper是MyBatis-Plus的精华所在它允许你用Java代码构建SQL条件QueryWrapperUser wrapper new QueryWrapper(); wrapper.like(name, 张) .between(age, 20, 30) .orderByDesc(create_time); ListUser users userMapper.selectList(wrapper);实际项目中我通常会封装一个WrapperBuilder工具类处理一些公共条件如租户ID过滤逻辑删除过滤数据权限控制2.3 代码生成器的正确使用mybatis-plus-generator可以快速生成Entity、Mapper、Service等代码。但有几个实用技巧自定义模板修改resources/templates下的.ftl文件调整生成风格策略配置使用StrategyConfig控制生成规则自定义注入通过InjectionConfig添加自定义属性// 典型配置示例 AutoGenerator generator new AutoGenerator(); generator.setGlobalConfig(globalConfig); generator.setDataSource(dataSourceConfig); generator.setPackageInfo(packageConfig); generator.setStrategy(strategyConfig); generator.setTemplate(templateConfig); generator.execute();3. Docker集成实践3.1 基础镜像选择对于Java应用推荐使用官方openjdk镜像而非自定义镜像。根据项目需求选择合适版本FROM openjdk:11-jre-slim # 生产环境推荐 # FROM openjdk:11-jdk # 开发环境需要编译时使用经验slim版本比alpine更稳定且只比alpine大20MB左右但避免了glibc兼容性问题。3.2 多阶段构建优化使用多阶段构建可以显著减小最终镜像大小# 第一阶段构建 FROM maven:3.6-jdk-11 as builder WORKDIR /app COPY pom.xml . RUN mvn dependency:go-offline COPY src/ /app/src/ RUN mvn package -DskipTests # 第二阶段运行 FROM openjdk:11-jre-slim COPY --frombuilder /app/target/*.jar /app/app.jar ENTRYPOINT [java,-jar,/app/app.jar]这种构建方式可以将镜像从500MB降到150MB左右。3.3 容器化MyBatis-Plus应用的特殊配置在容器中运行MyBatis-Plus应用需要注意数据库连接配置应使用环境变量spring: datasource: url: ${DB_URL} username: ${DB_USER} password: ${DB_PASSWORD}时区问题ENV TZAsia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime echo $TZ /etc/timezone健康检查HEALTHCHECK --interval30s --timeout3s \ CMD curl -f http://localhost:8080/actuator/health || exit 14. 开发环境优化4.1 本地Docker开发流程推荐使用docker-compose管理开发环境version: 3 services: app: build: . ports: - 8080:8080 environment: - DB_URLjdbc:mysql://db:3306/demo - DB_USERroot - DB_PASSWORD123456 depends_on: - db volumes: - ./:/app # 开发时挂载代码目录 db: image: mysql:5.7 environment: - MYSQL_ROOT_PASSWORD123456 - MYSQL_DATABASEdemo ports: - 3306:3306关键技巧使用volumes实现代码热更新合理配置depends_on和healthcheck确保启动顺序开发和生产使用不同的compose文件4.2 测试数据准备结合MyBatis-Plus和Docker可以方便地初始化测试数据在src/test/resources下准备SQL文件使用TestContainer运行集成测试Testcontainers class UserMapperTest { Container static MySQLContainer? mysql new MySQLContainer(mysql:5.7); BeforeAll static void setup() { // 初始化数据源 String jdbcUrl mysql.getJdbcUrl(); // ... 创建DataSource并执行初始化SQL } }5. 生产部署实践5.1 镜像优化进阶除了多阶段构建还可以使用JLink创建自定义JREJava 9启用分层构建利用Docker缓存使用jemalloc优化内存分配# 使用分层构建 FROM openjdk:11-jre-slim as builder WORKDIR /app COPY target/*.jar app.jar RUN java -Djarmodelayertools -jar app.jar extract FROM openjdk:11-jre-slim COPY --frombuilder /app/dependencies/ ./ COPY --frombuilder /app/snapshot-dependencies/ ./ COPY --frombuilder /app/application/ ./ ENTRYPOINT [java, org.springframework.boot.loader.JarLauncher]5.2 监控与日志生产环境需要完善的监控集成Prometheus指标dependency groupIdio.micrometer/groupId artifactIdmicrometer-registry-prometheus/artifactId /dependency日志收集配置# 使用json日志格式便于ELK处理 ENV LOGGING_LEVEL_ROOTinfo ENV LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_WEBwarn ENV LOGGING_PATTERN_CONSOLE{\time\:\%d{yyyy-MM-dd HH:mm:ss.SSS}\,\level\:\%5p\,\pid\:\${PID:-}\,\thread\:\%t\,\logger\:\%40.40logger{39}\,\msg\:\%m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}\}6. 常见问题排查6.1 MyBatis-Plus典型问题SQL注入风险避免直接拼接用户输入到Wrapper条件中错误示例wrapper.apply(date_format(create_time,%Y-%m-%d) date)正确做法使用参数化wrapper.apply(date_format(create_time,%Y-%m-%d) {0}, date)分页插件冲突同时使用多个分页插件会导致异常Configuration public class MybatisPlusConfig { Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return interceptor; } }6.2 Docker部署问题时区不一致容器内时间与宿主机不同解决方案前面提到的TZ环境变量设置验证在Dockerfile中添加RUN date命令验证内存限制JVM未正确识别容器内存限制解决方案使用JVM参数ENV JAVA_OPTS-XX:UseContainerSupport -XX:MaxRAMPercentage75.0 ENTRYPOINT exec java $JAVA_OPTS -jar /app.jar数据库连接失败应用启动时数据库未就绪解决方案使用wait-for-it.sh脚本COPY wait-for-it.sh /wait-for-it.sh RUN chmod x /wait-for-it.sh ENTRYPOINT [/wait-for-it.sh, db:3306, --, java, -jar, /app.jar]7. 性能优化技巧7.1 MyBatis-Plus性能优化批量操作使用Service的saveBatch方法userService.saveBatch(users, 1000); // 每批1000条逻辑删除优化默认逻辑删除会全表扫描解决方案添加索引TableLogic字段或者使用物理删除备份表方案SQL打印优化生产环境关闭SQL打印mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl7.2 Docker性能优化构建缓存利用合理排序Dockerfile指令将变化频率低的指令放前面例如先COPY pom.xml再COPY src资源限制合理配置容器资源deploy: resources: limits: cpus: 2 memory: 2GJVM调优根据容器环境调整JVM参数-XX:InitialRAMPercentage50.0 -XX:MaxRAMPercentage80.0 -XX:UseG1GC8. 安全最佳实践8.1 MyBatis-Plus安全配置防止全表更新配置阻断全表操作Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor()); return interceptor; }敏感字段加密使用FieldEncrypt注解FieldEncrypt(algorithm Algorithm.PBEWithMD5AndDES) private String password;8.2 Docker安全实践非root用户运行RUN addgroup -S appgroup adduser -S appuser -G appgroup USER appuser镜像扫描使用trivy扫描漏洞docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \ aquasec/trivy image your-image:tag网络隔离使用自定义网络networks: app-network: driver: bridge internal: true9. 扩展与进阶9.1 MyBatis-Plus插件开发自定义插件示例实现数据权限过滤Intercepts({ Signature(type Executor.class, methodquery, args{MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}) }) public class DataPermissionInterceptor implements Interceptor { Override public Object intercept(Invocation invocation) throws Throwable { // 解析当前用户权限 // 修改SQL添加条件 return invocation.proceed(); } }9.2 Kubernetes集成将Docker化的MyBatis-Plus应用部署到K8s创建DeploymentapiVersion: apps/v1 kind: Deployment metadata: name: myapp spec: replicas: 3 selector: matchLabels: app: myapp template: spec: containers: - name: app image: myapp:1.0 envFrom: - configMapRef: name: app-config resources: limits: memory: 1Gi cpu: 500m配置ConfigMap管理环境变量apiVersion: v1 kind: ConfigMap metadata: name: app-config data: DB_URL: jdbc:mysql://mysql-service:3306/demo SPRING_PROFILES_ACTIVE: prod10. 项目结构建议一个典型的MyBatis-PlusDocker项目结构src/ ├── main/ │ ├── java/ │ │ └── com/example/ │ │ ├── config/ # 配置类 │ │ ├── controller/ # 控制层 │ │ ├── entity/ # 实体类 │ │ ├── mapper/ # Mapper接口 │ │ ├── service/ # 业务层 │ │ └── Application.java │ ├── resources/ │ │ ├── application.yml # 主配置 │ │ └── application-dev.yml # 开发配置 ├── test/ # 测试代码 docker/ ├── Dockerfile # 生产镜像构建 ├── Dockerfile.dev # 开发镜像构建 ├── docker-compose.yml # 生产配置 └── docker-compose.dev.yml # 开发配置这种结构分离了不同环境的配置便于维护和扩展。在实际项目中我通常会添加一个deploy目录存放Kubernetes或Swarm的部署描述文件。

相关新闻

RLS递推最小二乘滤波算法超详细解析(原理+公式推导+无依赖C#完整源码)

RLS递推最小二乘滤波算法超详细解析(原理+公式推导+无依赖C#完整源码)

摘要 在自适应信号处理、系统辨识、传感器降噪和信道均衡等领域,LMS算法因其实现简单而广泛应用,但存在收敛速度慢和稳态误差大的固有缺陷。相比之下,RLS(递归最小二乘)算法作为自适应滤波的核心进阶算法,采…

2026/10/17 3:36:14 阅读更多 →
自托管Langfuse与Strands Agent集成实践

自托管Langfuse与Strands Agent集成实践

1. 项目背景与核心价值在AI应用开发领域,大语言模型(LLM)的可观测性一直是开发者面临的痛点。当我们需要监控和分析AI代理(Agent)的行为时,传统日志系统往往难以捕捉复杂的推理链条和决策过程。这就是为什么像langfuse这样的开源可观测性平台越来越受开发…

2026/10/17 3:36:26 阅读更多 →
LVM磁盘管理技术:原理、实战与性能优化

LVM磁盘管理技术:原理、实战与性能优化

1. 为什么需要掌握LVM磁盘管理技术在Linux服务器运维和系统管理工作中,磁盘管理是最基础也是最重要的技能之一。传统分区方案在面临存储需求变化时显得力不从心——想象一下这样的场景:你负责的线上业务数据量突然激增,原本规划的500GB存储空…

2026/10/17 3:32:51 阅读更多 →

最新新闻

SSM框架广告管理系统:架构解析、部署运行与答辩改造

SSM框架广告管理系统:架构解析、部署运行与答辩改造

简介:面向Java毕业设计或课程设计场景,这是一套基于SSM框架与Vue前后端分离的广告管理系统项目。系统按业务角色划分为管理员、广告客户、广告商、广告制作商四大端,覆盖广告投放渠道管理、广告需求与提案流转、设计预览与调整、签署管理及结…

2026/10/18 21:39:07 阅读更多 →
Java学生火车票系统:Spring Boot分层架构与并发控制实战

Java学生火车票系统:Spring Boot分层架构与并发控制实战

简介:本资源是一套完整的基于Java开发的学生火车票订票系统毕业设计项目,面向计算机专业本科生及Java初学者,聚焦课程设计、毕业设计与小型桌面应用开发实践。系统采用JavaFX构建图形界面,后端集成Hibernate框架与SQL Server 2014…

2026/10/18 21:39:07 阅读更多 →
Presenton 开源:Apache 2.0 的 AI PPT 生成器 + API,16+ LLM 提供商,ChatGPT 登录即用,MCP Server 内置,三端部署!

Presenton 开源:Apache 2.0 的 AI PPT 生成器 + API,16+ LLM 提供商,ChatGPT 登录即用,MCP Server 内置,三端部署!

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 21:39:07 阅读更多 →
Python实现车道线检测与偏离提示:从透视变换到转弯意图的完整链路

Python实现车道线检测与偏离提示:从透视变换到转弯意图的完整链路

简介:这份资源面向Python计算机视觉初学者与辅助驾驶入门开发者,围绕车道线检测与道路偏离提示展开,帮助读者理解如何用OpenCV完成从视频帧读取、图像预处理到车道线识别与转弯判断的完整流程。包内共8个文件,以4张jpg过程图、2段…

2026/10/18 21:39:07 阅读更多 →
大文件分发架构设计:P2P加速与混合分发实战解析

大文件分发架构设计:P2P加速与混合分发实战解析

接到 HagiCode Desktop 这个项目需求时,我第一反应是:这不就是一个带界面的下载器吗?后来把架构图铺开才发现,真正麻烦的从来不是界面,而是大文件怎么又快又省地发到成百上千台机器上。HagiCode Desktop 的混合分发架构…

2026/10/18 21:39:07 阅读更多 →
Windows批处理脚本从入门到实战:用bat脚本轻松搞定日常自动化

Windows批处理脚本从入门到实战:用bat脚本轻松搞定日常自动化

忘记那些图形界面里一个个点击的日子吧。我每天开机后第一件事就是手动打开几个工作软件,再整理桌面散落的文件,这套流程重复了快两年。直到某天下午,我盯着屏幕发呆,心想这种毫无技术含量的重复劳动,凭什么占据我每天…

2026/10/18 21:38:07 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →