暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mybatis插入数据后,获取主键自增id

码酱 2021-03-16
1798
首先理解标题的意思:就是在往数据库表中插入一条数据的同时,返回该条数据在数据库表中的自增主键值。

所谓的技术点都会有落地的实现,简单举个业务场景:
  1. 你编辑一条新闻,同时需要给该新闻打上标签(可以一个或者多个:比如:女性,爱,钱等等),然后存储到数据库中。

  2. 怎么存,肯定涉及到三张表,新闻表,标签表,新闻标签id关联表。

  3. 新闻表插入数据简单,标签表插入数据简单。

  4. 那新闻标签表呢,如何关联,那是不是需要新闻表和标签表插入数据的时候,返回它们的主键Id然后再存储到新闻标签表中。


一、mysql

1.xml配置文件

  <!-- 主要讲新添加的两个属性:useGeneratedKeys和keyProperty-->
  <!--useGeneratedKeys="true" 默认值是:false。 含义:设置是否使用JDBC的getGenereatedKeys方法获取主键并赋值到keyProperty设置的领域模型属性中-->
  <!--keyProperty="bindInfo.id" 就很好理解了,就是把主键值赋值给BindInfo实体的id属性中-->
    <insert id="insertBindInfo" parameterType="com.unicom.portal.bestcenter.entity.BindInfo" useGeneratedKeys="true" keyProperty="bindInfo.id" >
  
    </insert>

2.mapper接口

@Mapper
public interface BindInfoMapper {
    int insertBindInfo(@Param("bindInfo") BindInfo bindInfo);
}

3.实体

@Data
public class BindInfo {
    /**
     * 主键id
     */

    private Long id;
}

4.实际效果

5.查看数据库该条记录

 数据库中该条数据的自增主键Id果然是185,那就说明达到了插入数据的同时获得了该条数据在数据库表中的主键值的目的。

二、oracle

对于像Oracle这样的没有提供主键自增的功能的数据库而言,通常使用序列的方式获取自增主键。可以使用<selectKey>标签来获取主键的值,这种方式不仅适用于不提供主键自增功能的数据库,也适用于提供主键自增功能的数据库。

 <insert id="insertBindInfo" parameterType="com.unicom.portal.bestcenter.entity.BindInfo">
         <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.Integer">
      SELECT LAST_INSERT_ID()
    </selectKey>
        insert into ...
    </insert>

  • Oracle 数据库中的值要设置为 BEFORE ,这是因为 Oracle中需要先从序列获取值,然后将值作为主键插入到数据库中。

  • 如果Mysql 使用selectKey的方式获取主键,order :AFTER


属性
描述
keyProperty
selectKey 语句结果应该被设置的目标属性。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
keyColumn
匹配属性的返回结果集中的列名称。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
resultType结果的类型,MyBatis 通常可以推算出来。MyBatis 允许任何简单类型用作主键的类型,包括字符串。如果希望作用于多个生成的列,则可以使用一个包含期望属性的 Object 或一个 Map。
order值可为BEFORE 或 AFTER。如果是 BEFORE,那么它会先执行selectKey设置 keyProperty 然后执行插入语句。如果为AFTER则相反。


喜欢就加个关注吧,


往期精选

使用并行流(ParallelStream)避坑
shardingjdbc实现分库分表
SpringCloud配置中心的使用
SpringCloud-Eureka高可用搭建
SpringCloud-Zuul服务网关
SpringCloud-Ribbon负载均衡
SpringCloud-Feign远程调用
SpringCloud-Hystrix解决雪崩
SpringCloud-Bus消息总线


文章转载自码酱,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论