Mybatis中的 useGeneratedKeys

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按自增插入按自增插入
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值