MyBatis 3 + PostgreSQL - 获取插入时的主键值

时间:2015-04-26 03:54:53

标签: java spring postgresql mybatis

我有一个Maven项目,它使用Java Spring,MyBatis和MyBatis-Spring将对象映射到PostgreSQL数据库。我希望能够在插入新记录的同时查询主键的值,并且还没有找到有效的方法。我当前的实现没有返回正确的值;它似乎总是返回1.

这是查询器的映射器XML配置:

<insert id="registerNewUser" parameterType="com.hunter.databasejar.User">
    <selectKey keyProperty="ID" resultType="int">
      SELECT currval('"Users_ID_seq"')
    </selectKey>    
    insert into "Users" ("Username", "FirstName", "LastName") values (#{username}, #{firstName}, #{lastName})
</insert>

在Java中,我写下以下内容,i的值始终为1.

int i = sqlSession.insert("UserMapper.registerNewUser", user);

我也尝试过改变XML配置来尝试&#34;返回&#34;来自SQL的语法,但总是得到i值为-1。

<insert id="registerNewUser" parameterType="com.hunter.databasejar.User">
    insert into "Users" ("Username", "FirstName", "LastName") values (#{username}, #{firstName}, #{lastName}) returning "ID"
</insert>

我的项目正在使用MyBatis 3.2.4。

2 个答案:

答案 0 :(得分:2)

我认为您需要使用合适的setter将keyProperty的大小写更改为 id

setId(int value);

AFAIK,无法为大写字段创建兼容Javabeans的setter。

但是您看到的返回值是插入的行数,而不是分配的主键值。 MyBatis似乎没有办法利用有用(但非标准)的返回子句。

要获取键值,您需要使用order=声明中的selectKey选项。这个问题为PostgreSQL Returning values from MyBatis <insert> mapped methods提供了几个选项。所描述的技术将更新提供给该方法的对象中的id字段。

我使用的是Oracle数据库,因此没有资格推荐PostgreSQL的答案。但是作为旁注,如果order="BEFORE"选项适用于PostgreSQL,它可以与Oracle兼容。

答案 1 :(得分:0)

我发现我的问题是我在其中的某个地方有两个带有“id”的列。 MyBatis试图将名为“CognitoID”的列映射到我的普通旧“ID”列,并在Cognito ID不能转换为int时将其炸毁。