我试过这个:
<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})
但不行。感谢
答案 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}