为什么持久层开发需要 MyBatis?
在传统的 JDBC 编程中,开发者往往要面对大量重复且繁琐的样板代码。比如手动创建连接池、编写带占位符的 SQL、逐行绑定参数、处理结果集映射,以及在 finally 块里确保资源关闭。这些工作不仅效率低下,还容易引发资源泄露。
MyBatis 作为优秀的持久层框架,很好地解决了这些问题。它通过简化交互逻辑、将 SQL 从 Java 代码中解耦到 XML 配置,以及自动映射结果集,让数据访问变得轻盈且灵活。
环境搭建与核心配置
依赖引入
在 pom.xml 中加入 MyBatis Spring Boot 启动器及 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
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);
}
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>
核心原理:#{} 与 ${} 的本质区别
这是面试中的高频考点,也是安全红线。两者的底层机制完全不同:
| 特性 | #{} (预编译 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 通过灵活的配置和强大的映射能力,极大提升了 Java 持久层的开发效率。在实际项目中,应根据业务复杂度灵活选择注解或 XML 模式,并始终遵循安全规范,优先使用预编译参数来规避潜在风险。

