Spring Boot 实战:MyBatis 操作数据库(上)


---JavaEE专栏---

Spring Boot 实战:MyBatis 操作数据库(上)

摘要

本文深度解析了 Spring Boot 环境下 MyBatis 的集成与应用。通过回顾传统 JDBC 的局限性,详细展示了 MyBatis 在日志配置、CRUD 操作、自增主键返回及多表查询中的实战用法。同时,文章深入探讨了 #{} ${} 的底层预编译差异及安全风险,并分享了企业级开发中的数据库命名规范与 Druid 连接池配置,助力开发者构建稳健的持久层架构。


### 文章目录

  • [Spring Boot 实战:MyBatis 操作数据库(上)](#{} 与 ${} 的本质区别 5. 多表关联查询进阶 6. 企业级规范与优化建议 6.1 数据库命名规范 6.2 Druid 连接池配置 7. 总结 读者互动区)
  • [摘要](#{} 与 ${} 的本质区别 5. 多表关联查询进阶 6. 企业级规范与优化建议 6.1 数据库命名规范 6.2 Druid 连接池配置 7. 总结 读者互动区)
  • [@toc](#{} 与 ${} 的本质区别 5. 多表关联查询进阶 6. 企业级规范与优化建议 6.1 数据库命名规范 6.2 Druid 连接池配置 7. 总结 读者互动区)
  • [1. 为什么持久层开发需要 MyBatis?](#{} 与 ${} 的本质区别 5. 多表关联查询进阶 6. 企业级规范与优化建议 6.1 数据库命名规范 6.2 Druid 连接池配置 7. 总结 读者互动区)
  • [1.1 传统 JDBC 的局限性](#{} 与 ${} 的本质区别 5. 多表关联查询进阶 6. 企业级规范与优化建议 6.1 数据库命名规范 6.2 Druid 连接池配置 7. 总结 读者互动区)
  • [1.2 MyBatis 的优势](#{} 与 ${} 的本质区别 5. 多表关联查询进阶 6. 企业级规范与优化建议 6.1 数据库命名规范 6.2 Druid 连接池配置 7. 总结 读者互动区)
  • [2. 环境搭建与核心配置](#{} 与 ${} 的本质区别 5. 多表关联查询进阶 6. 企业级规范与优化建议 6.1 数据库命名规范 6.2 Druid 连接池配置 7. 总结 读者互动区)
  • [2.1 依赖引入](#{} 与 ${} 的本质区别 5. 多表关联查询进阶 6. 企业级规范与优化建议 6.1 数据库命名规范 6.2 Druid 连接池配置 7. 总结 读者互动区)
  • [2.2 开启 SQL 执行日志](#{} 与 ${} 的本质区别 5. 多表关联查询进阶 6. 企业级规范与优化建议 6.1 数据库命名规范 6.2 Druid 连接池配置 7. 总结 读者互动区)
  • [3. MyBatis 开发实战(双模式详解)](#{} 与 ${} 的本质区别 5. 多表关联查询进阶 6. 企业级规范与优化建议 6.1 数据库命名规范 6.2 Druid 连接池配置 7. 总结 读者互动区)
  • [3.1 注解开发模式(适用于简单查询)](#{} 与 ${} 的本质区别 5. 多表关联查询进阶 6. 企业级规范与优化建议 6.1 数据库命名规范 6.2 Druid 连接池配置 7. 总结 读者互动区)
  • [3.2 XML 映射模式(适用于复杂业务)](#{} 与 ${} 的本质区别 5. 多表关联查询进阶 6. 企业级规范与优化建议 6.1 数据库命名规范 6.2 Druid 连接池配置 7. 总结 读者互动区)
  • [4. 核心原理:#{} 与 {} 的本质区别](#{} 与 {} 的本质区别 5. 多表关联查询进阶 6. 企业级规范与优化建议 6.1 数据库命名规范 6.2 Druid 连接池配置 7. 总结 读者互动区)
  • [5. 多表关联查询进阶](#{} 与 ${} 的本质区别 5. 多表关联查询进阶 6. 企业级规范与优化建议 6.1 数据库命名规范 6.2 Druid 连接池配置 7. 总结 读者互动区)
  • [6. 企业级规范与优化建议](#{} 与 ${} 的本质区别 5. 多表关联查询进阶 6. 企业级规范与优化建议 6.1 数据库命名规范 6.2 Druid 连接池配置 7. 总结 读者互动区)
  • [6.1 数据库命名规范](#{} 与 ${} 的本质区别 5. 多表关联查询进阶 6. 企业级规范与优化建议 6.1 数据库命名规范 6.2 Druid 连接池配置 7. 总结 读者互动区)
  • [6.2 Druid 连接池配置](#{} 与 ${} 的本质区别 5. 多表关联查询进阶 6. 企业级规范与优化建议 6.1 数据库命名规范 6.2 Druid 连接池配置 7. 总结 读者互动区)
  • [7. 总结](#{} 与 ${} 的本质区别 5. 多表关联查询进阶 6. 企业级规范与优化建议 6.1 数据库命名规范 6.2 Druid 连接池配置 7. 总结 读者互动区)
  • [读者互动区](#{} 与 ${} 的本质区别 5. 多表关联查询进阶 6. 企业级规范与优化建议 6.1 数据库命名规范 6.2 Druid 连接池配置 7. 总结 读者互动区)

1. 为什么持久层开发需要 MyBatis?

1.1 传统 JDBC 的局限性

在 JDBC 编程中,开发者需要手动完成以下繁琐步骤:

  1. 创建数据库连接池 DataSource 并获取 Connection
  2. 编写带 ? 占位符的 SQL。
  3. 手动绑定每一个参数。
  4. 处理 ResultSet 结果集并手动映射到对象。
  5. finally 块中手动关闭资源。

这些重复性的"模板代码"不仅效率低下,且容易产生资源泄露风险。

1.2 MyBatis 的优势

MyBatis 是一款优秀的持久层框架(数据访问层 DAO),它通过以下特性解决了 JDBC 的痛点:

  • 简化交互:极大缩短了程序与数据库交互的代码量。
  • 解耦 SQL:支持将 SQL 从 Java 代码中分离到 XML 配置文件中。
  • 灵活映射:自动将 SQL 结果集关联到 Java 实体类。

2. 环境搭建与核心配置

2.1 依赖引入

pom.xml 中引入 MyBatis 起步依赖与 MySQL 驱动(注意使用自己合适的版本):

xml 复制代码
<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>

2.2 开启 SQL 执行日志

为了方便调试,建议在配置文件中开启日志打印,实时查看 SQL 生成逻辑:

yaml 复制代码
mybatis:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 输出 SQL 到控制台

3. MyBatis 开发实战(双模式详解)

3.1 注解开发模式(适用于简单查询)

使用 @Mapper 接口定义数据访问逻辑:

java 复制代码
@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);
}

3.2 XML 映射模式(适用于复杂业务)

对于多表查询或动态 SQL,XML 模式是最佳选择:

xml 复制代码
<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>

4. 核心原理:#{} 与 ${} 的本质区别

这是文章的技术深度所在,面试必考:

特性 #{} (预编译 SQL) ${} (即时 SQL)
工作原理 使用 ? 占位,提前解析优化 直接进行字符替换
安全性 防止 SQL 注入 存在 SQL 注入风险
引号处理 自动拼接字符串引号 不会自动拼接引号
性能 高,编译一次后缓存执行计划 较低,每次需重新解析

5. 多表关联查询进阶

MyBatis 不分单表或多表,核心在于通过 映射关系 把联表 SQL 的运行结果关联到实体类。

java 复制代码
@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);

6. 企业级规范与优化建议

6.1 数据库命名规范

  1. 蛇形命名 :表名和字段名使用小写字母,单词间以下划线分割(如 user_info)。
  2. 开启驼峰转换 :在 yml 中配置 map-underscore-to-camel-case: true,实现 abc_xyzabcXyz 的自动映射。

6.2 Druid 连接池配置

引入阿里巴巴开源的 Druid 连接池以获得更强大的监控功能:

xml 复制代码
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-3-starter</artifactId>
    <version>1.2.21</version>
</dependency>

7. 总结

MyBatis 通过简单的配置和灵活的 SQL 映射极大提升了 Java 开发效率。在实际开发中,应根据业务复杂度灵活选择注解或 XML 模式,并始终优先使用 #{} 以规避安全风险。


读者互动区

投票:你在开发中更倾向于使用哪种 MyBatis 模式?

  • A. 纯注解开发,简单快捷
  • B. 全 XML 映射,逻辑解耦
  • C. 混合使用,视复杂度而定

相关推荐
Web Security Loop7 小时前
MAC卸载JDK环境
java·macos·jdk
NiceCloud喜云7 小时前
腾讯云国际版云数据库选型:MySQL、Redis 怎么按业务架构来判断
数据库·mysql·腾讯云
ew452187 小时前
MySQL JOIN 关联语法、差异、标准用法、经典坑点汇总
数据库·mysql
Rain的Java大神之路8 小时前
线上接口负载满了如何解决
java·数据库·redis·后端·缓存·面试·架构
Nturmoils8 小时前
给运营导个 CSV,在 ksql 里用 \copy 就够了
数据库
ciqingloveless8 小时前
Oracle打开数据库加密
数据库·oracle
counting money8 小时前
Tomcat 专题:从基础架构到性能调优与 WebSocket 实战
java·websocket·tomcat
m0_462605228 小时前
大模型week02
数据库
DBA_G9 小时前
GBase 8a数据库集群多维度资源管控策略矩阵解析
数据库·oracle
xiaohaiAIgeo9 小时前
【2026年】HG/T 20656-2024化工暖通空调设计规范:新版标准的变化与影响
java·前端·javascript·科普知识