1. MyBatis DML映射深度解析
作为一名长期使用MyBatis的开发者,我深刻体会到DML(数据操作语言)映射看似简单,实则暗藏玄机。很多开发者在初次接触MyBatis时,往往把注意力集中在查询映射上,却忽略了插入、更新和删除操作中的关键细节。本文将带你深入理解MyBatis DML映射的核心机制和实际应用中的各种"坑"。
1.1 基础插入操作剖析
让我们从一个最简单的insert语句开始:
xml复制<insert id="insert">
insert into user(username, age, dept_id)
values (#{username}, #{age}, #{deptId})
</insert>
这段XML映射对应的Java接口是:
java复制int insert(UserInsertDTO dto);
表面上看,这只是一个简单的参数替换,但MyBatis在背后做了大量工作:
- 通过反射解析参数对象
- 根据属性名定位对应的getter方法
- 使用JDBC的PreparedStatement进行参数绑定
重要提示:
#{}不是简单的字符串拼接,而是预编译参数绑定。这意味着SQL注入风险被极大降低,同时也要求Java属性类型必须与数据库字段类型兼容。
1.2 参数绑定机制详解
MyBatis的参数绑定过程值得深入理解:
sql复制values (#{username}, #{age}, #{deptId})
实际执行的SQL并不是直接拼接值,而是:
sql复制values (?, ?, ?)
然后通过PreparedStatement的setXxx方法进行类型安全的参数设置。这种机制带来两个重要特性:
- 自动类型转换:MyBatis会根据Java属性类型自动选择适当的set方法
- NULL值安全处理:可以正确处理各种类型的NULL值
1.3 获取自增主键的实战技巧
插入操作后获取自增主键是常见需求,MyBatis提供了两种方式:
方式一:useGeneratedKeys
xml复制<insert id="insert"
useGeneratedKeys="true"
keyProperty="id">
insert into user(username, age, dept_id)
values (#{username}, #{age}, #{deptId})
</insert>
方式二:selectKey
xml复制<insert id="insert">
<selectKey keyProperty="id" resultType="long" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
insert into user(username, age, dept_id)
values (#{u
