当前位置:   article > 正文

Mybatis中useGeneratedKeys与 keyProperty、以及自增主键_usegeneratedkeys keyproperty

usegeneratedkeys keyproperty

目录

1.起因

2.useGeneratedKeys属性与keyProperty属性

3.注意事项

4.jdbc版本

5.Mybatis如何解决自增主键问题?

5.1.解决思路

5.2.针对支持自增主键的数据库(例如:MySQL)

5.3.针对不支持自增主键的数据库(例如:Oracle)

6.MySQL的LAST_INSERT_ID()函数


1.起因

2021年09月22日在开发项目的时候,需要分别在oracle、mysql上运行,可问题在于数据库的逻辑设计:要求表的主键是自增序列sequence,而mysql不支持sequence,所以,我看其他人采用这种方式就解决了问题,因此,特别学习一下;

2.useGeneratedKeys属性与keyProperty属性

useGeneratedKeys取值范围true、false,其默认值是:false;作用就是:是否使用JDBC的getGenereatedKeys方法获取主键并把获取到的值赋值到keyProperty设置的属性中;

3.注意事项

说白了就是:允许JDBC支持自动生成主键,需要驱动兼容;

对于支持自动生成记录主键的数据库,如:MySQL,SQL Server,此时设置useGeneratedKeys参数值为true,在执行添加记录之后可以获取到数据库自动生成的主键ID。

实际上,在settings元素中设置useGeneratedKeys是一个全局参数,但是只会对接口映射器产生影响,对xml映射器不起效;

但如果此时在接口映射器中又明确设置了useGeneratedKeys参数,那么注解映射器中的useGeneratedKeys参数值将覆盖settings元素中设置的全局useGeneratedKeys参数值;

在settings元素中设置的全局useGeneratedKeys参数对于xml映射器无效。如果希望在xml映射器中执行添加记录之后返回主键ID,则必须在xml映射器中明确设置useGeneratedKeys参数值为true;

4.jdbc版本

看一些博客,好像jdk1.5以上、jdbc3.0以上才行,且sql server多少会出现兼容性问题;

5.Mybatis如何解决自增主键问题?

5.1.解决思路

针对支持自增的数据库:可以使用useGeneratedKeys + keyProperty属性来解决;

针对不支持自增的数据库:可以使用<selectKey/>标签来解决;

5.2.针对支持自增主键的数据库(例如:MySQL)

<insert id="XXX" parameterType="Users" databaseId="mysql">

<selectKey keyProperty="id" order="AFTER" resultType="Long">

select last_insert_id()

<selectKey>

insert into USERS

<trim prefix="(" suffix=")" suffixOverrides=",">

<if test="username != null and username != ‘’">uername,</if>

注意:这里基于<selectKey/>来实现的,这里的order为after,且在insert语句中没有列出主键ID;

5.3.针对不支持自增主键的数据库(例如:Oracle)

<insert id="XXX" parameterType="Users" databaseId="oracle">

<selectKey keyProperty="id"order="BEFORE" resultType="Long">

select SEQ_USERS_SEQ.nextval from dual

</selectKey>

insert into SECURITY_USERS

<trim prefix="(" suffix=")" suffix0verrides=",">

id,

<if test="oginid + null and loginid + .">loginid,</if>

注意:这里基于<selectKey/>来实现的,这里的order为before,且在insert语句中列出主键ID;

6.MySQL的LAST_INSERT_ID()函数

很简单,LAST_INSERT_ID()会返回最近执行的insert语句中由AUTO_INCREMENT生成的值。

①如果最近一条insert语句不涉及到AUTO_INCREMENT字段,也不会影响到LAST_INSERT_ID()的值;

②insert需要成功插入数据,如果执行失败,LAST_INSERT_ID()不会改变;

③insert语句如果指定了AUTO_INCREMENT字段的值,LAST_INSERT_ID()返回的值不会改变。;

④insert语句如果一次插入多行数据,则LAST_INSERT_ID()会返回插入的第一条数据的AUTO_INCREMENT值;

⑤LAST_INSERT_ID()返回的值,在服务器端是以每个连接为基础保存的,也就是说,对于不同的连接,返回的值是不一样的。

⑥该函数只返回自动生成的具有Auto_Increment特性的属性列的最新值,如果我自己手动插入一行,该行的Auto_Increment特性的属性列的值是人为指定的,并非数据库自动生成的,则LAST_INSERT_ID()函数的返回值不变;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/241356
推荐阅读
相关标签
  

闽ICP备14008679号