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

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

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

# 在settings元素中设置useGeneratedKeys参数

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

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

如何理解这句话的意思?

其本意是说:

对于支持自动生成记录主键的数据库
如: MySQLSQL 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 中要封装的 类的参数名


【参考】