文章目录
在MyBatis中,允许设置名称为“ useGeneratedKeys
”参数存在3个位置:
- 在
settings
元素中设置 useGeneratedKeys 参数 - 在
xml
映射器中设置 useGeneratedKeys 参数 - 在
接口
映射器中设置 useGeneratedKeys 参数
在不同位置设置的 useGeneratedKeys
参数,<mark>最终结果相同,但是影响范围不同</mark>。
# 在settings元素中设置useGeneratedKeys参数
官方的说法是该参数的作用是:
“ 允许
JDBC
支持自动生成主键,需要驱动兼容 ”
如何理解这句话的意思?
其本意是说:
对于支持自动生成记录主键的数据库
如:MySQL
,SQL Server
此时设置useGeneratedKeys
参数值为true
<mark>在执行添加记录之后可以获取到数据库自动生成的主键ID
</mark>。
.
实际上,在settings元素
中设置useGeneratedKeys是一个<mark>全局参数</mark>
但是<mark>只会对接口映射器产生影响</mark>,<mark>对xml映射器不起效</mark>。
<settings>
<!-- 允许JDBC支持自动生成主键,需要驱动兼容。 如果设置为true则这个设置强制使用自动生成主键, 尽管一些驱动不能兼容但仍可正常工作(比如 Derby)。 -->
<setting name="useGeneratedKeys" value="true" />
</settings>
<mark>此时,在接口映射中添加记录之后,更新实体类主键值,返回影响行数</mark>。
如:
自增 id = 50
user 实体类数据,插入 mysql 后,
user.id == 50 // true
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>
<mark>xml
映射器中配置的 useGeneratedKeys
参数只会对 xml
映射器产生影响
且在 settings 元素中设置的全局 useGeneratedKeys 参数值对于 xml 映射器不产生任何作用</mark>。
# 在接口映射器中设置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>元
素中设置的对应参数值。
# keyColumn 和 keyProperty
-
keyColumn
数据库 列名(or 别名) -
keyProperty
java 中要封装的 类的参数名
【参考】
-
http://blog.csdn.net/suwu150/article/details/52895855 - Mybatis中自动生成主键
-
https://www.cnblogs.com/nuccch/p/9069644.html - 深入浅出mybatis之useGeneratedKeys参数用法
-
https://www.cnblogs.com/woyujiezhen/p/11643944.html - 关于mybatis的中的keyColumn