Spring Boot 集成 MyBatis 操作数据库指南
为什么持久层开发需要 MyBatis?
写 JDBC 的时候,大家最头疼的就是那些重复的样板代码:手动创建连接池、获取 Connection、编写带占位符的 SQL、一个个绑定参数、处理 ResultSet 结果集映射到对象,最后还得在 finally 块里确保资源关闭。这些不仅效率低,还容易埋下资源泄露的隐患。
MyBatis 作为优秀的持久层框架,很好地解决了这些问题。它极大缩短了程序与数据库交互的代码量,支持将 SQL 从 Java 代码中分离到 XML 配置文件里,还能自动把结果集关联到 Java 实体类,让开发者更专注于业务逻辑。
环境搭建与核心配置
依赖引入
先在 pom.xml 里把 MyBatis 起步依赖和 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 很有必要。在配置文件中开启日志实现,能实时看到生成的 SQL 语句:
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
MyBatis 开发实战(双模式详解)
注解开发模式
对于简单的查询或插入,注解模式非常轻量。直接在 Mapper 接口上加 @Mapper,配合 @Select、@Insert 等注解即可。
比如查询用户和插入并返回自增 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 里的 useGeneratedKeys,这是告诉 MyBatis 去拿数据库生成的主键值回传给对象。
XML 映射模式
当涉及多表查询或动态 SQL 时,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>
这里定义了 resultMap 来处理字段名和属性名的映射,比如数据库的 delete_flag 对应 Java 的 deleteFlag。
核心原理:#{} 与 ${} 的本质区别
这是面试常考点,也是安全红线。两者虽然都能传参,但底层机制完全不同。
| 特性 | #{} (预编译 SQL) | ${} (即时 SQL) |
|---|---|---|
| 工作原理 | 使用 ? 占位,提前解析优化 | 直接进行字符串替换 |
| 安全性 | 防止 SQL 注入 | 存在 SQL 注入风险 |
| 引号处理 | 自动拼接字符串引号 | 不会自动拼接引号 |
| 性能 | 高,编译一次后缓存执行计划 | 较低,每次需重新解析 |
实际开发中,除非万不得已(比如动态表名),否则一律优先使用 #{}。
多表关联查询进阶
MyBatis 处理单表或多表的核心逻辑是一致的,关键在于通过映射关系把联表 SQL 的运行结果关联到实体类。
@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);
企业级规范与优化建议
数据库命名规范
- 蛇形命名:表名和字段名统一用小写字母,单词间用下划线分割,例如
user_info。 - 开启驼峰转换:在 yml 配置中开启
map-underscore-to-camel-case: true,这样数据库的abc_xyz就能自动映射到 Java 的abcXyz,省去大量手动配置。
Druid 连接池配置
为了获得更强大的监控功能,推荐引入阿里巴巴开源的 Druid 连接池:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-3-starter</artifactId>
<version>1.2.21</version>
</dependency>
总结
MyBatis 通过灵活的配置和 SQL 映射,显著提升了 Java 开发效率。在实际项目中,应根据业务复杂度灵活选择注解或 XML 模式,并始终优先使用 #{} 规避安全风险。配合规范的命名和连接池管理,就能构建出稳健的持久层架构。


