我试过这个:
<insert id="insertPersonalizacionUsuario" useGeneratedKeys="true" keyProperty="param1.id" keyColumn="id">
INSERT INTO dsk_prop_personali (idpersonalizacion, idusuario, valor, centro)
VALUES (#{param1.idPersonalizacion}, #{param1.idUsuario}, #{param1.valor}, #{param2})
Run Code Online (Sandbox Code Playgroud)
有了这个:
<insert id="insertPersonalizacionUsuario" useGeneratedKeys="true" keyProperty="param1.id" keyColumn="id">
<selectKey keyProperty="id" resultType="int">
SELECT id.nextVal from dual
</selectKey>
INSERT INTO dsk_prop_personali (id, idpersonalizacion, idusuario, valor, centro)
VALUES (#{id}, #{param1.idPersonalizacion}, #{param1.idUsuario}, #{param1.valor}, #{param2})
Run Code Online (Sandbox Code Playgroud)
但不工作。谢谢
您必须将order具有BEFORE值的属性添加到 <selectKey> 元素。在您的情况下,您使用的是 Oracle 数据库,直到版本12c(查看您的案例)它没有自动生成的列类型,并且使用的序列与 rdbms 与您的列无关。
如果您查看文档参考,则有一个部分解释了您的情况:
MyBatis 有另一种方法来处理不支持自动生成列类型的数据库的键生成,或者可能还不支持自动生成键的 JDBC 驱动程序支持。
这是一个简单(愚蠢)的例子,它会生成一个随机 ID(你可能永远不会这样做,但这证明了灵活性以及 MyBatis 真正不介意的方式):
Run Code Online (Sandbox Code Playgroud)<insert id="insertAuthor"> <selectKey keyProperty="id" resultType="int" order="BEFORE"> select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1 </selectKey> insert into Author (id, username, password, email,bio, favourite_section) values (#{id}, #{username}, #{password}, #{email}, #{bio}, #{favouriteSection,jdbcType=VARCHAR})在上面的示例中,将首先运行 selectKey 语句,设置 Author id 属性,然后调用插入语句。这为您提供了与数据库中自动生成的键类似的行为,而不会使您的 Java 代码复杂化。
因此,为了确保 selectKey 语句首先运行,您需要使用带BEFORE值的 Order 属性,在参考文档中的此示例之后对该属性进行了很好的解释:
order这可以设置为 BEFORE 或 AFTER。如果设置为BEFORE,那么它会先选择key,设置keyProperty,然后执行insert语句。如果设置为 AFTER,它将运行 insert 语句,然后运行 selectKey 语句——这在像 Oracle 这样的数据库中很常见,这些数据库可能在 insert 语句中嵌入了序列调用。
因此,您必须keyProperty像您所做的那样keyProperty="id"将您的值与插入参数匹配(将是插入语句中的参数:)#{id},并指定resultTypeas int 因此它是一个数字序列。
否则,您必须使用序列 id 名称进行选择,在您的情况下,请确保您的序列名为 id (因为您正在使用id.NEXTVAL):
SELECT YOUR_SEQ.NEXTVAL FROM DUAL
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8419 次 |
| 最近记录: |