Mybatis,在Oracle中插入序列id

A L*_*gro 3 oracle mybatis

我试过这个:

<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)

但不工作。谢谢

Pau*_*Pau 5

您必须将order具有BEFORE值的属性添加到 <selectKey> 元素。在您的情况下,您使用的是 Oracle 数据库,直到版本12c(查看您的案例)它没有自动生成的列类型,并且使用的序列与 rdbms 与您的列无关。

如果您查看文档参考,则有一个部分解释了您的情况:

MyBatis 有另一种方法来处理不支持自动生成列类型的数据库的键生成,或者可能还不支持自动生成键的 JDBC 驱动程序支持。

这是一个简单(愚蠢)的例子,它会生成一个随机 ID(你可能永远不会这样做,但这证明了灵活性以及 MyBatis 真正不介意的方式):

<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}) 
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,将首先运行 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)