Mybatis,在序列号中插入Oracle

时间:2017-01-24 17:18:15

标签: 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})

用这个:

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

但不行。感谢

2 个答案:

答案 0 :(得分:3)

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

如果你看看documentation reference,有一个部分可以解释你的情况:

  

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

     

在上面的示例中, selectKey语句将首先运行,即   将设置作者ID属性,然后插入语句将   叫做。这为您提供了与自动生成的密钥类似的行为   在您的数据库中,而不会使您的Java代码复杂化。

因此,为了确保selectKey语句首先运行,您需要使用带有BEFORE值的Order属性,在参考文档中的此示例之后,该属性的解释非常好:

  

订单这可以设置为BEFORE或AFTER。如果设置为BEFORE,那么它   将首先选择键,设置keyProperty然后执行   插入声明。如果设置为AFTER,则运行insert语句和   然后是selectKey语句 - 这与数据库一样常见   可能在insert内嵌入序列调用的Oracle   语句。

因此,您必须将keyProperty值与插入参数匹配(keyProperty="id"将是插入语句中的参数:#{id}),并指定{{1因为它是一个数字序列。

否则,您必须使用序列ID名称进行选择,在您的情况下,请确保您的序列称为id(因为您使用的是resultType):

id.NEXTVAL

答案 1 :(得分:0)

<insert id="insertAuthor">   
    <selectKey keyProperty="id" resultType="int" order="BEFORE">
        select MYSEQUENCE.nextval from dual  
   </selectKey>   

   insert into Author
    (id, username, password, email,bio, favourite_section)   
     values
    (#{id}, #{username}, #{password}, #{email}, #{bio}, #{favouriteSection,jdbcType=VARCHAR}