HCRM博客

使用useGeneratedKeys时出现报错,该如何解决?

useGeneratedKeys报错详解

useGeneratedKeys是MyBatis中一个非常重要的参数,它用于支持数据库自动生成主键,当设置为true时,在执行插入操作后,可以获取到数据库自动生成的主键ID,在使用useGeneratedKeys时,可能会遇到各种报错,下面将详细解释useGeneratedKeys的作用、配置方法以及常见的报错原因和解决方法。

一、useGeneratedKeys的作用与配置方法

使用useGeneratedKeys时出现报错,该如何解决?-图1
(图片来源网络,侵权删除)

1、作用

allowJDBC支持自动生成主键,需要驱动兼容。

对于支持自动生成记录主键的数据库(如MySQL, SQL Server),设置useGeneratedKeys为true,可以在记录insert成功后获得数据库自动生成的主键ID。

2、配置方法

全局配置文件:在settings元素中设置useGeneratedKeys参数。

     <settings>
         <setting name="useGeneratedKeys" value="true"/>
     </settings>

注意:此设置只对接口映射器有效,对xml映射器无效。

使用useGeneratedKeys时出现报错,该如何解决?-图2
(图片来源网络,侵权删除)

xml映射器:在mapper.xml文件中配置useGeneratedKeys参数。

     <insert id="addUser" parameterType="com.model.User" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
         insert into User(name, age) values(#{name}, #{age})
     </insert>

接口映射器:在接口方法上使用@Options注解设置useGeneratedKeys参数。

     @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
     @Insert("insert into test(name,descr,url,create_time,update_time) values(#{name},#{descr},#{url},now(),now())")
     Integer insertOneTest(Test test);

二、常见报错及解决方法

1、ORA00933: SQL command not properly ended

原因:Oracle不支持自增主键列,如果把useGeneratedKeys配置为true,在插入多条数据时可能会出现此错误。

解决方法:可以将useGeneratedKeys配置为false,或者使用mybatis提供的selectKey手动提供类似自增序列的效果。

使用useGeneratedKeys时出现报错,该如何解决?-图3
(图片来源网络,侵权删除)
     <insert id="addUser" parameterType="com.model.User">
         <selectKey keyProperty="id" resultType="_long" order="BEFORE">      
             select CAST(RANDOM * 100000 as INTEGER) a FROM SYSTEM.SYSDUMMY1
         </selectKey>
         insert into User(id, name, age) values(#{id}, #{name}, #{age})
     </insert>

2、无法获取主键ID

原因:可能由于数据库驱动不支持或配置不正确。

解决方法:确保数据库驱动支持自动生成主键,并且正确配置了keyProperty和keyColumn。

三、相关问答FAQs

1、Q: useGeneratedKeys参数在什么情况下使用?

A: 当需要在插入数据后获取数据库自动生成的主键ID时使用,适用于支持自动生成主键的数据库,如MySQL和SQL Server。

2、Q: useGeneratedKeys参数如何配置?

A: 可以通过全局配置文件、xml映射器或接口映射器进行配置,在xml映射器中配置时,需要明确设置useGeneratedKeys为true,并指定keyProperty和keyColumn。

分享:
扫描分享到社交APP
上一篇
下一篇