情感测试
情感测试

您现在的位置: 情感测试简介_情感测试玩法 > 情感测试题目 > Mybatis每天都在用,却又不知道的事

Mybatis每天都在用,却又不知道的事

发布时间:2021-5-3 19:30:20   点击数:
怎么确诊白癜风 https://m-mip.39.net/nk/mipso_4450292.html

滴~~下班卡!

一天工资到手!正当我迈着愉快的步伐准备回家的路上,边走边想起今天卡了半天的问题。事情是这样的,当接口新建数据时,前端又需要返回刚刚创建的ID,方便做后续的交互。那么数据库自增的ID,插入的时候是不需要设置,那怎么拿到刚刚插入的数据的ID呢?难道再获取下最新一条数据?这时如果有新的请求数据插入,那这ID不会获取错了吗?

经过一番思想搏斗后,于是又使用了COPY大法。

Mybatis+MySql自增ID

文章使用的是Mybatis3.4.6+MySql8.0,表设计使用自增ID实现

SelectKey与useGeneratedKeys

MyBatis提供了两种方式用于返回设置实体对象ID,

SelectKey与useGeneratedKeys。

SelectKey方式可用selectKey/标签或

SelectKey注解。

useGeneratedKeys是配置属性项,用于insert/或update标签,注解也是。

SelectKey通过配置对应的查询ID语句,返回插入的ID。例如:

selectKeyresultClass="long"keyProperty="id"SELECTLAST_INSERT_IDASID/selectKey

通过这种方式设置ID需要确保查询的语句是正确对应刚刚插入的数据的,否则就可能串id了。可以查看Mybatis中

SelectKeyGenerator类具体实现。这种方式只支持单条插入的ID返回。

useGeneratedKeys方式则使用的则是Statement的getGeneratedKeys,由JDBC实现提供的数据获取。在Mybatis中使用JdbcKeyGenerator实现ID的返回。同时这种方式支持批量插入时返回插入ID。使用如:

Options(useGeneratedKeys=true,keyProperty="id")

Insert({"insertintouser(name)values(#{name})"})#xml方式insertid="insertList"useGeneratedKeys="true"keyProperty="id"insertintocountry(countryname,countrycode)valuesforeachcollection="list"separator=","item="country"(#{country.countryname},#{country.countrycode})/foreach/insert存在即更新不存在则插入

当使用ONDUPLICATEKEYUPDATE,主键存在则更新,不存在则插入时,也支持返回ID。但是有一点需要注意,当数据已经存在时,更新时如果数据没有发生改变,这时影响行数为0,则无法返回ID。这时如果更新表有update_time字段,可以设置update_time=now(),强制更新数据,使返回影响行数不为0,而不是依赖表设置的

onupdateCURRENT_TIMESTAMP。这样已存在的数据,更新也能返回主键ID。

另外,如果使用ONDUPLICATEKEYUPDATE批量更新插入的话,不支持批量返回主键ID,这时返回的ID只有一个。如果需要

批量插入返回ID,那就不要使用ONDUPLICATEKEYUPDATE

ONEMORETHING

selectKey方式还有一个order配置属性,用于设置返回ID设置的执行时机,如果设置为AFTER,对于自增id有效,而设置为BEFORE则对自增id无效,这种方式适用非自增id场景。因为从字面意思理解,自增ID如果在插入前执行,那怎么能获取得到ID呢?

平凡打工人

点赞在看走一波COPY侠



转载请注明:http://www.zmax-alibaba.com/qgtm/137105.html

网站简介 | 发布优势 | 服务条款 | 隐私保护 | 广告合作 | 合作伙伴 | 版权申明 | 网站地图

当前时间: