深入浅出mybatis之useGeneratedKeys参数用法
目录
在 MyBatis 中,允许设置名称为“useGeneratedKeys”参数存在 3 个位置:
- 在 settings 元素中设置 useGeneratedKeys 参数
- 在 xml 映射器中设置 useGeneratedKeys 参数
- 在接口映射器中设置 useGeneratedKeys 参数
在不同位置设置的 useGeneratedKeys 参数,最终结果相同,但是影响范围不同。
在 settings 元素中设置 useGeneratedKeys 参数
官方的说法是该参数的作用是:“允许 JDBC 支持自动生成主键,需要驱动兼容”,如何理解这句话的意思?
其本意是说:对于支持自动生成记录主键的数据库,如:MySQL,SQL Server,此时设置 useGeneratedKeys 参数值为 true,在执行添加记录之后可以获取到数据库自动生成的主键 ID。
实际上,在 settings 元素中设置 useGeneratedKeys 是一个全局参数,但是只会对接口映射器产生影响,对 xml 映射器不起效。
<settings>
<!--
允许 JDBC 支持自动生成主键,需要驱动兼容。
如果设置为 true 则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby)。
-->
<setting name="useGeneratedKeys" value="true" />
</settings>
此时,在接口映射中添加记录之后将返回主键 ID。
public interface TestMapper {
// 受全局 useGeneratedKeys 参数控制,添加记录之后将返回主键 id
@Insert("insert into test(name,descr,url,create_time,update_time) values(#{name},#{descr},#{url},now(),now())")
Integer insertOneTest(Test test);
}
但是,请注意如果此时在接口映射器中又明确设置了 useGeneratedKeys 参数,那么注解映射器中的 useGeneratedKeys 参数值将覆盖 settings 元素中设置的全局 useGeneratedKeys 参数值。
举个例子:先在 settings 元素中设置全局 useGeneratedKeys 参数值为 true,再在接口映射器中设置 useGeneratedKeys 参数值为 false,添加记录之后将不能返回注解 ID。
// 在接口映射器中设置的 useGeneratedKeys 参数值将会覆盖在 settings 元素中设置全局 useGeneratedKeys 参数值
@Options(useGeneratedKeys = false, keyProperty = "id", keyColumn = "id")
@Insert("insert into test(name,descr,url,create_time,update_time) values(#{name},#{descr},#{url},now(),now())")
Integer insertOneTest(Test test);
另外,在 settings 元素中设置的全局 useGeneratedKeys 参数对于 xml 映射器无效。如果希望在 xml 映射器中执行添加记录之后返回主键 ID,则必须在 xml 映射器中明确设置 useGeneratedKeys 参数值为 true。
在 xml 映射器中配置 useGeneratedKeys 参数
<!-- 插入数据: 返回记录的 id 值 -->
<insert id="insertOneTest" parameterType="org.chench.test.mybatis.model.Test" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert into test(name,descr,url,create_time,update_time)
values(#{name},#{descr},#{url},now(),now())
</insert>
xml 映射器中配置的 useGeneratedKeys 参数只会对 xml 映射器产生影响,且在 settings 元素中设置的全局 useGeneratedKeys 参数值对于 xml 映射器不产生任何作用。
在接口映射器中设置 useGeneratedKeys 参数
// 设置 useGeneratedKeys 为 true,返回数据库自动生成的记录主键 id
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
@Insert("insert into test(name,descr,url,create_time,update_time) values(#{name},#{descr},#{url},now(),now())")
Integer insertOneTest(Test test);
注意: 在接口映射器中设置的 useGeneratedKeys 参数会覆盖在<settings>
元素中设置的对应参数值。
【参考】
[1] http://blog.csdn.net/suwu150/article/details/52895855 Mybatis 中自动生成主键