跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Spring Boot 集成 MyBatis 操作数据库实战

Spring Boot 集成 MyBatis 是 Java 持久层开发的主流方案。对比了传统 JDBC 的繁琐步骤,展示了 MyBatis 在简化交互、解耦 SQL 及自动映射方面的优势。通过依赖引入、日志配置及注解与 XML 双模式的代码示例,详解了 CRUD 操作、自增主键获取及多表关联查询的实现细节。重点剖析了预编译占位符 #{} 与字符串替换 ${} 的安全差异,并提供了数据库命名规范与 Druid 连接池的企业级优化建议,帮助构建高效稳健的数据访问层。

樱花落尽发布于 2026/3/28更新于 2026/9/849 浏览
Spring Boot 集成 MyBatis 操作数据库实战

Spring Boot 集成 MyBatis 操作数据库实战

为什么要引入 MyBatis?

在纯 JDBC 开发中,我们往往要面对一堆重复且繁琐的样板代码:手动管理连接池、编写带占位符的 SQL、逐行绑定参数、处理 ResultSet 结果集映射,还得在 finally 块里确保资源关闭。这些不仅效率低,还容易引发资源泄露。

MyBatis 作为持久层框架,核心价值在于解耦和简化。它把 SQL 从 Java 代码里剥离出来,自动完成结果集到对象的映射,让开发者能更专注于业务逻辑本身。

环境搭建与核心配置

依赖引入

在 pom.xml 中加入 MyBatis Starter 和 MySQL 驱动即可。注意根据项目实际情况调整版本:

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>3.0.3</version>
</dependency>
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>

开启 SQL 日志

调试时,实时看到生成的 SQL 非常关键。在配置文件中加上这行,控制台就会打印执行语句:

mybatis:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

开发模式:注解与 XML

MyBatis 主要提供两种开发方式,实际项目中通常混合使用。

1. 注解模式(适合简单 CRUD)

对于单表查询或简单的增删改,直接在 Mapper 接口上加注解最省事。比如查单个用户,或者插入后拿回自增 ID:

@Mapper
public interface UserInfoMapper {
    // 根据 ID 查询用户
    @Select("select * from user_info where id = #{id}")
    UserInfo queryById(Integer id);

    // 插入并返回自增主键 ID
    @Insert("insert into user_info (username, password) values (#{username}, #{password})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    Integer insert(UserInfo userInfo);
}

这里用 @Options 是为了告诉 MyBatis 把数据库生成的主键回填到 userInfo 对象的 id 字段里,不然插入完你也不知道这条数据的主键是多少。

2. XML 映射模式(适合复杂业务)

一旦涉及多表关联、动态 SQL 或者复杂的映射关系,XML 就比注解灵活多了。它能更好地维护 SQL 结构,方便后续优化。

<mapper namespace="com.example.demo.mapper.UserInfoXMlMapper">
    <resultMap id="BaseMap" type="com.example.demo.model.UserInfo">
        <id column="id" property="id"></id>
        <result column="delete_flag" property="deleteFlag"></result>
    </resultMap>
    
    <select id="queryAllUser" resultMap="BaseMap">
        select * from user_info
    </select>
</mapper>

#{} 与 ${} 的本质区别

这是面试必问,也是生产安全的关键点。虽然它们都能传参,但底层机制完全不同。

特性#{} (预编译)${} (字符串替换)
工作原理使用 ? 占位符,JDBC 预编译直接拼接字符串
安全性防止 SQL 注入存在 SQL 注入风险
引号处理自动添加字符串引号不会自动添加引号
性能高,可复用执行计划较低,每次重新解析

除非万不得已(比如动态排序字段),否则请优先使用 #{}。如果用了 ${} 且参数来自用户输入,那你的系统随时可能被注入攻击。

多表关联查询进阶

MyBatis 处理联表的核心在于通过映射关系把结果集组装成对象。比如查询文章及其作者信息:

@Select("SELECT ta.id, ta.title, tb.username FROM articleinfo ta LEFT JOIN user_info tb ON ta.uid = tb.id WHERE ta.id = #{id}")
ArticleInfo queryUserByUid(Integer id);

配合好 <resultMap>,就能把分散在不同表的字段正确填充到实体类的不同属性上。

企业级规范与优化建议

1. 数据库命名规范

保持统一很重要。推荐表名和字段名全小写,单词间用下划线分隔(如 user_info)。同时,在 yml 中开启驼峰转换,这样 Java 里的 userName 就能自动对应数据库的 user_name:

mybatis:
  configuration:
    map-underscore-to-camel-case: true

2. Druid 连接池配置

生产环境别用默认的 HikariCP 凑合,建议引入阿里巴巴的 Druid 连接池。它不仅性能好,还能提供强大的监控功能,方便排查慢 SQL 问题。

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-3-starter</artifactId>
    <version>1.2.21</version>
</dependency>

总结

MyBatis 通过灵活的配置和映射机制,极大提升了 Java 持久层的开发效率。在实际工作中,建议根据业务复杂度选择注解或 XML 模式,并始终将安全性放在首位,优先使用预编译参数。

目录

  1. Spring Boot 集成 MyBatis 操作数据库实战
  2. 为什么要引入 MyBatis?
  3. 环境搭建与核心配置
  4. 依赖引入
  5. 开启 SQL 日志
  6. 开发模式:注解与 XML
  7. 1. 注解模式(适合简单 CRUD)
  8. 2. XML 映射模式(适合复杂业务)
  9. #{} 与 ${} 的本质区别
  10. 多表关联查询进阶
  11. 企业级规范与优化建议
  12. 1. 数据库命名规范
  13. 2. Druid 连接池配置
  14. 总结

更多推荐文章

查看全部
  • Docker 与 Ollama 本地部署 DeepSeek 大模型实战
  • 计算机专业女生的职业发展现状与经验探讨
  • C++ 继承进阶:友元、静态成员与菱形继承
  • Cursor Chat Browser:管理 AI 聊天历史的 Web 应用
  • Visual C++ 运行库安装与 DLL 缺失问题修复指南
  • 多无人机协同吊载高速穿越 0.8 米窄缝技术解析
  • 技术副业变现路径:Python 爬虫开发实战指南
  • C++ 开发中 <string> 与 <string.h> 的区别
  • 无人机低空智能巡飞巡检平台架构与核心能力解析
  • C++ STL 关联容器实战:set、map 与 multiset 详解
  • Vue 基础入门:核心设计思想深度拆解
  • Android 集成 WebRTC 与 VAD 的 AI 辅助开发实战:从选型到性能优化
  • AI 数据标注平台的选型与实践:效率提升背后的技术逻辑
  • 本地搭建带知识库的 AI 助手:Ollama + Open WebUI
  • AI 辅助 Python 毕业设计:选题评估与原型构建
  • AIGC视频生成成本优化:20秒与30秒模型选型与价格对比
  • 2025 年 11 月 TIOBE 排行榜:C# 能否首次超越 Java?
  • LeetCode 383. 赎金信:哈希表与数组计数法对比
  • Linux 下 C++ 线程池实现与并发安全详解
  • 现代 C++ 新特性 constexpr:从 C++11 到 C++20 的演进

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online