深入浅出mybatis - useGeneratedKeys参数用法 、keyColumn 和 keyProperty

在这里插入图片描述

在MyBatis中,允许设置名称为“ useGeneratedKeys ”参数存在3个位置:

  • settings 元素中设置 useGeneratedKeys 参数
  • xml 映射器中设置 useGeneratedKeys 参数
  • 接口 映射器中设置 useGeneratedKeys 参数

在不同位置设置的 useGeneratedKeys 参数,最终结果相同,但是影响范围不同

# 在settings元素中设置useGeneratedKeys参数

官方的说法是该参数的作用是:

“ 允许 JDBC 支持自动生成主键,需要驱动兼容 ”

如何理解这句话的意思?

其本意是说:

对于支持自动生成记录主键的数据库
如: MySQLSQL Server
此时设置 useGeneratedKeys 参数值为 true
在执行添加记录之后可以获取到数据库自动生成的主键ID
.
实际上,在 settings元素 中设置useGeneratedKeys是一个全局参数
但是只会对接口映射器产生影响对xml映射器不起效

<settings>
<!-- 
允许JDBC支持自动生成主键,需要驱动兼容。 

如果设置为true则这个设置强制使用自动生成主键,

尽管一些驱动不能兼容但仍可正常工作(比如 Derby)。 
-->
<setting name="useGeneratedKeys" value="true" />
</settings>

此时,在接口映射中添加记录之后,更新实体类主键值,返回影响行数

扫描二维码关注公众号,回复: 8820085 查看本文章

如:
自增 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>

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>元 素中设置的对应参数值。

# keyColumn 和 keyProperty

  • keyColumn 数据库 列名(or 别名)

  • keyProperty java 中要封装的 类的参数名

在这里插入图片描述


【参考】

发布了296 篇原创文章 · 获赞 61 · 访问量 7118

猜你喜欢

转载自blog.csdn.net/LawssssCat/article/details/103937578
今日推荐