Java小白学习MyBatis:Mybatis如何获取自动生成的(主)键值?

2023-08-22 16:53:33 浏览数 (1)

在MyBatis这样的持久层框架中,经常需要插入一条记录并取得该记录所对应的主键值。在Java开发中,默认的JDBC方式已经较为成熟地解决了这个问题,可以通过getGeneratedKeys()方法获取自动生成的主键值,而在MyBatis中,也提供了多种方式来处理自动生成主键值的问题。

一、使用<selectKey>元素

<MyBatis 提供了<selectKey>元素来获取主键值。示例如下:

代码语言:javascript复制
<insert id="add" parameterType="com.example.User">
    <!-- 指定databaseId表示使用oracle数据库查询不同 -->
    <selectKey resultType="java.lang.Long" keyProperty="id" order="BEFORE">
        <if test="_databaseId == 'oracle'">
            select my_seq.nextval as id from dual
        </if>
        <otherwise>
            SELECT LAST_INSERT_ID()
        </otherwise>
   </selectKey>
   INSERT INTO user(username) VALUES (#{username})
</insert>

上述代码中,我们首先定义一个id为add的insert语句,并指定了它的参数类型为com.example.User。接着,在insert语句中,我们使用了<selectKey>元素来获取自动生成的主键值。其中resultType属性指定了返回值类型,keyProperty属性指定了需要设置主键值的对象属性名,order属性则指定了<selectKey>执行的时间点(before/after)。

在本例中,如果是Oracle数据库,则调用sequence进行主键的生成和获取;如果是其他数据库,则使用LAST_INSERT_ID()来获取最后插入的自增长ID。

二、使用useGeneratedKeys属性

<MyBatis 还提供了一种更加简洁的方式,在insert语句中指定useGeneratedKeys属性即可。示例如下:

代码语言:javascript复制
<insert id="add" useGeneratedKeys="true" keyProperty="id">
    INSERT INTO user(username) VALUES (#{username})
</insert>

上述代码中,我们定义了一个id为add的insert语句,并在它的定义中添加了useGeneratedKeys和keyProperty两个属性。其中,useGeneratedKeys属性指明需要生成主键值,而keyProperty属性则指定了主键值对应的Java对象属性名。

三、注意事项

在MyBatis中处理主键值时,需要注意以下几点:

1、不同的数据库对于主键自动化增长的实现方式有所区别,因此在调用<selectKey>或设置useGeneratedKeys属性时可能需要进行不同的配置或查询等操作,具体可参考官方文档。

2、在插入记录后需要立即获得其主键值时,可以使用<selectKey>方式;如果只是需要将主键值设置到Java对象中,可以使用useGeneratedKeys属性,这样可以避免一次额外的查询操作。

3、有的数据库对于SELECT LAST_INSERT_ID()仅支持由INSERT触发而产生的自增长ID,因此在使用该方式时,需先进行插入操作才能够正确获取主键值。

总之,在MyBatis中获取自动生成的主键值可以通过<selectKey>和useGeneratedKeys属性两种方式实现。使用时应注意不同数据库的主键自动化增长实现方式的区别,以及在获取主键值前已进行插入操作等问题,从而避免产生不必要的错误。

0 人点赞