赞
踩
目录
2.useGeneratedKeys属性与keyProperty属性
2021年09月22日在开发项目的时候,需要分别在oracle、mysql上运行,可问题在于数据库的逻辑设计:要求表的主键是自增序列sequence,而mysql不支持sequence,所以,我看其他人采用这种方式就解决了问题,因此,特别学习一下;
useGeneratedKeys取值范围true、false,其默认值是:false;作用就是:是否使用JDBC的getGenereatedKeys方法获取主键并把获取到的值赋值到keyProperty设置的属性中;
说白了就是:允许JDBC支持自动生成主键,需要驱动兼容;
对于支持自动生成记录主键的数据库,如:MySQL,SQL Server,此时设置useGeneratedKeys参数值为true,在执行添加记录之后可以获取到数据库自动生成的主键ID。
实际上,在settings元素中设置useGeneratedKeys是一个全局参数,但是只会对接口映射器产生影响,对xml映射器不起效;
但如果此时在接口映射器中又明确设置了useGeneratedKeys参数,那么注解映射器中的useGeneratedKeys参数值将覆盖settings元素中设置的全局useGeneratedKeys参数值;
在settings元素中设置的全局useGeneratedKeys参数对于xml映射器无效。如果希望在xml映射器中执行添加记录之后返回主键ID,则必须在xml映射器中明确设置useGeneratedKeys参数值为true;
看一些博客,好像jdk1.5以上、jdbc3.0以上才行,且sql server多少会出现兼容性问题;
针对支持自增的数据库:可以使用useGeneratedKeys + keyProperty属性来解决;
针对不支持自增的数据库:可以使用<selectKey/>标签来解决;
<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;
<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;
很简单,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()函数的返回值不变;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。