useGeneratedKeys报错详解
useGeneratedKeys是MyBatis中一个非常重要的参数,它用于支持数据库自动生成主键,当设置为true时,在执行插入操作后,可以获取到数据库自动生成的主键ID,在使用useGeneratedKeys时,可能会遇到各种报错,下面将详细解释useGeneratedKeys的作用、配置方法以及常见的报错原因和解决方法。
一、useGeneratedKeys的作用与配置方法
1、作用:
allowJDBC支持自动生成主键,需要驱动兼容。
对于支持自动生成记录主键的数据库(如MySQL, SQL Server),设置useGeneratedKeys为true,可以在记录insert成功后获得数据库自动生成的主键ID。
2、配置方法:
全局配置文件:在settings元素中设置useGeneratedKeys参数。
<settings> <setting name="useGeneratedKeys" value="true"/> </settings>
注意:此设置只对接口映射器有效,对xml映射器无效。
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手动提供类似自增序列的效果。
<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。