美文网首页
MyBatis使用技巧,自增ID的获取

MyBatis使用技巧,自增ID的获取

作者: DoubleFooker | 来源:发表于2021-03-16 21:43 被阅读0次

    《每天学点CRUD》公众

    Mybatis+MySql自增ID

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

    SelectKey与useGeneratedKeys

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

    SelectKey与useGeneratedKeys。

    SelectKey方式可用<selectKey/>标签或@SelectKey注解。

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

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

    <selectKey resultClass="long" keyProperty="id">
    

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

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

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

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

    存在即更新不存在则插入

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

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

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

    批量插入返回ID,那就不要使用ON DUPLICATE KEY UPDATE

    ONE MORE THING

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

    相关文章

      网友评论

          本文标题:MyBatis使用技巧,自增ID的获取

          本文链接:https://www.haomeiwen.com/subject/swflqltx.html