自动返回自增Id到入参对象
【笔记搬迁计划】
Mybatis 配置文件 useGeneratedKeys和keyProperty 参数
https://blog.csdn.net/nininininiabc222/article/details/79990570
Mybatis 配置文件 useGeneratedKeys 参数只针对 insert 语句生效,默认为 false。当设置为 true 时,表示如果插入的表以自增列为主键,则允许 JDBC 支持自动生成主键,并可将自动生成的主键返回。
/* * 配置 useGeneratedKeys = true * */ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <setting name="useGeneratedKeys" value="true" /> </settings> <typeAliases> <!-- ... --> </typeAliases> <environments default="development"> <environment id="development"> <dataSource> <!-- ... --> </dataSource> </environment> </environments> <mappers> <mapper resource="mappers/*.xml" /> </mappers> </configuration>
/* * 使用示例:表对应的 POJO * */ public class User { private int id; private String name; private Integer age; public int getId() { return id; } public void setId(int id) { this.id= id; } //... 省略其它 getter 和 setter } /* * 使用示例:mapper * keyProperty 指明表的自增主键列 * */ <insert id="addUser" parameterType="com.model.User" keyProperty="id"> insert into User(name, age) values(#{name}, #{age}) </insert>
DAO 调用 addUser 后,User 对象参数中就保存了新增的 user 的 id 属性了。
但是,如果是 Oracle 这样不支持自增主键列的数据库,如果把useGeneratedKeys 参数配置为 true,在插入多条数据时则可能会出现 ORA-00933: SQL command not properly ended
这样的错误。这时,可以将 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> eg1: <insert id="xxx" parameterType="yyy"> <selectKey keyProperty="id" resultType="long" order="BEFORE"> select my_seq.nextval from dual </selectKey> ... </insert> eg2: <insert id="xxx" parameterType="yyy" useGeneratedKeys="true"> insert into table(...) values (...) <selectKey resultType="long" order="AFTER" keyProperty="id"> SELECT LAST_INSERT_ID() AS id </selectKey> </insert>