useGeneratedKeys 用法探究
环境:mybatis 3.4.5 mysql 5.7
useGeneratedKeys的用法
官方文档
useGeneratedKeys (仅适用于 insert 和 update)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的自动递增字段),默认值:false。
首先,如果你的数据库支持自动生成主键的字段(比如 MySQL 和 SQL Server),那么你可以设置 useGeneratedKeys=”true”,然后再把 keyProperty 设置为目标属性就 OK 了。例如,如果上面的 Author 表已经在 id 列上使用了自动生成,那么语句可以修改为:
<insert id="insertAuthor" useGeneratedKeys="true"
keyProperty="id">
insert into Author (username,password,email,bio)
values (#{username},#{password},#{email},#{bio})
</insert>
这样每次插入数据时,就可以省略掉 id 列了。
假如主键没有设置自增
<insert id="insert" parameterType="com.xxx.domain.User"
useGeneratedKeys="true"
keyProperty="id">
insert into userInfo (name)
values (#{name})
</insert>
报错: Error updating database. Cause: java.sql.SQLException: Field ‘id’ doesn’t have a default value
原因
设置 useGeneratedKeys = “true”,
MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键。
找到 JDBC 中的 getGeneratedKeys 方法,在方法描述中:
推断:useGeneratedKeys设置失效。
结论
当数据库中的字段不是自增的时,useGeneratedKeys 不起作用。
PS:四种情况:
sql语句示例:写了要插入 id。
<insert id="insert" parameterType="com.itheima.domain.User"
useGeneratedKeys="true"
keyProperty="id">
insert into userInfo (id,name)
values (#{id},#{name})
</insert>
实体类设置了ID值 | 实体类没有设置ID值 | |
---|---|---|
sql语句中写了要插入 id | 按实体类中的值插入 | 按自增插入 |
sql语句中省略 id | 按自增插入 | 按自增插入 |
更多推荐
Mybatis中的 useGeneratedKeys
发布评论