Mybatis 配置文件 useGeneratedKeys 参数只针对 insert 语句生效,默认为 false。当设置为 true 时,表示如果插入的表以自增列为主键,则允许 JDBC 支持自动生成主键,并可将自动生成的主键返回。
配置mybatis的配置文件,设置useGeneratedKeys属性值为true:
<insert id="insert" parameterType="com.FactoryAuditHistory"
useGeneratedKeys="true" keyProperty="id">
insert into factory_audit_history (start_date, end_date,
retailer, site_name, factory_code,
factory_name,factory_own_ship_from, licensee_vendor_no,
ts_engineer, product_category, audit_type,
status, total_score, scale, grade, last_mod, operator,
factory_address)
values (#{startDate,jdbcType=TIMESTAMP}, #{endDate,jdbcType=TIMESTAMP},
#{retailer,jdbcType=VARCHAR}, #{siteName,jdbcType=VARCHAR}, #{factoryCode,jdbcType=VARCHAR},
#{factoryName,jdbcType=VARCHAR}, #{factoryOwnShipFrom,jdbcType=VARCHAR}, #{licenseeVendorNo,jdbcType=VARCHAR},
#{tsEngineer,jdbcType=VARCHAR}, #{productCategory,jdbcType=VARCHAR}, #{auditType,jdbcType=VARCHAR},
#{status,jdbcType=VARCHAR}, #{totalScore,jdbcType=DOUBLE}, #{scale,jdbcType=INTEGER}, #{grade,jdbcType=VARCHAR},
#{lastMod,jdbcType=TIMESTAMP}, #{operator,jdbcType=VARCHAR},#{factoryAddress,jdbcType=LONGVARCHAR})
</insert>
keyProperty 标记了一个属性, MyBatis会通过 getGeneratedKeys 设置这个属性的值,DAO 调用 addUser 后,User 对象参数中就保存了新增的 user 的 id 属性了。
这个时候你是否能够感觉到useGeneratedKeys配置与selectKey的作用是那么的类似?那么它俩又有什么关系呢?
这样的场景,当你使用的关系型数据库时Oracle 这样不支持自增主键列的数据库时,如果把useGeneratedKeys 参数配置为 true,在插入数据时则可能会出现 ORA-00933: SQL command not properly ended 这样的错误。这时,可以将 useGeneratedKeys 配置为 false,那怎么实现获取上次生成id的功能呢?可以使用 mybatis 提供的 selectKey 手动提供类似自增序列的效果。
总结:
如果数据库支持自增长主键字段(比如mysql、sql server)设置useGeneratedKeys=”true”和keyProperty,这样就可以获得插入的主键id值,并赋值给返回的pojo对象(或者单纯的id值);
oracle则不支持自增长id,需要设置useGeneratedKey=”false”,如果设置true则会有报错信息。然后通过nextval函数,如SEQ_table.Nextval生成id,插入更新一条数据时,可以使用selectKey获取id操作。