Mybatis insert/update时获得insert/update的id

背景

        用mybatis insert/update 记录时,插入/更新过后想要获得更新记录的id

        如果插入/更新数据,用条件再查询一次,得到插入/更新的记录。进行了两次数据库操作,链接了两次数据库,增加了接口的处理事件,而链接数据库是很耗时的操作。

解决

insert

一、

        通过mybatis 的 selectKey 标签来解决这个问题。比如在插入/更新数据时,返回数据的纪录。如:

 
            SELECT LAST_INSERT_ID()
 
insert into  xxxx

resultType :返回的类型,为简单类型。 
order: 在insert into 语句执行后执行。 
keyProperty : 语句执行结果的 返回目标属性

SELECT LAST_INSERT_ID() 为查询主体。 
此处用法就是当 insert into 执行后 执行 selectKey 的内容将数据库的最后一个id 查询出来映射到传入数据对像的ID 属性。
二、

        在mybatis的配置文件中,有个叫keyProperty和useGeneratedKeys的属性。useGeneratedKeys 参数只针对 insert 语句生效,默认为 false。当设置为 true 时,表示如果插入的表以自增列为主键,则允许 JDBC 支持自动生成主键,并可将自动生成的主键返回。

具体用法:

useGeneratedKeys="true" keyProperty="id" keyColumn="id"

       useGeneratedKeys=true表示使用数据库自动增长的主键,keyColumn用于指定数据库table中的主键,keyProperty用于指定传入对象的成员变量。keyProperty="id"指定把获取到的主键值注入到 XXX(实体类) 的 id 属性。如:



insert into xxx

将自动生成的id(keyColumn),放到实体类Student中的id(keyProperty)

update

一、        写更新语句,并将更新的纪录的ID 返回出来。 


 
            SELECT
            (select id FROM student WHERE
             name = #{name})id
            from DUAL
  
        UPDATE student SET
      email=#{email}
        WHERE
       name =#{name}
  

        上述代码就是通过 selectKey 实现了 通过 test 的name 去更新 test 的email,并获取被更新纪录的id。

原理

 

此处的 keyProperty=’id’ 是指将查询出来的id 映射到传入updateByName 的student 的id ,类型为Long, 因为可能查到name 以后可能会修改name 所以order=’BEFORE’ 要在执行update之前进行查询,并把id返回出来。 SELECT     (select id FROM test WHERE     name = #{name})id from DUAL  此 SELECT 就是为了获取 被更新的 test的id 外边包装一个虚表查询是当 name = #{name} 查询不到纪录时不会报空纪录,会返回 null ,这个就很关键了。 当返回空记录的时候 mybatis会报错,说不能转换成 Long 型。  当返回null的时候就会转换成Long 的 0 。不会报错,代表没有查到。

如果student的id,类型为int,则此时resultType="Long",不然报类型错误

java.lang.IllegalArgumentException: argument type mismatch

 

参考:

https://blog.csdn.net/u012373815/article/details/73864866

https://blog.csdn.net/fengkungui/article/details/82772302

https://blog.csdn.net/weixin_41367523/article/details/89283099

https://blog.csdn.net/amtea/article/details/6861813

你可能感兴趣的:(Mybatis)