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>