• mybatis insert返回主键的三种方式


    1.情景展示

    我们知道,表与表之间的关联关系,通常使用主键,所以在处理复杂业务时,比如:按顺序插入多张表;

    我们就需要在插入B表之间拿到插入A表后的主键,如何实现?

    2.具体实现

    方式一:使用selectKey

    ORCLE

    <insert id="insertJkdaUser" parameterType="hashmap">
        <selectKey keyProperty="id" resultType="Long" order="BEFORE">
            SELECT SEQ_JKDA_USER.NEXTVAL FROM DUAL
        </selectKey>
        INSERT INTO JKDA_USER (ID, USERNAME, IDCARD, TELPHONE, PASSWORD, VERCODE)
        VALUES (#{id}, #{USERNAME}, #{IDCARD}, #{TELPHONE}, #{PASSWORD}, #{VERCODE,jdbcType=VARCHAR})
    </insert>

    执行插入前:

    执行插入后:

    我们可以看到:

    执行插入后,hashmap当中增加了一个新的key"id",这个就是插入该行数据的主键。

    MYSQL

    <insert id="insertJkdaUser" parameterType="hashmap">
        INSERT INTO JKDA_USER (ID, USERNAME, IDCARD, TELPHONE, PASSWORD, VERCODE)
        VALUES (#{id}, #{USERNAME}, #{IDCARD}, #{TELPHONE}, #{PASSWORD}, #{VERCODE})
        <selectKey keyProperty="id" resultType="Long" order="AFTER">
            SELECT LAST_INSERT_ID()
        </selectKey>
    </insert>

    说明:

    <selectKey>标签的order属性默认值为:BEFORE,所以,如果不声明的话,是在执行insert语句之前,拿到主键;

    AFTER,代表的是:执行insert之后,获取主键。

    Oracle需要在插入之前,通过序列确定主键;

    因为mysql主键有自增特性,所以我们只有在插入之后,才能拿到主键。

    方式二:使用@Insert+@SelectKey

    ORACLE

    @Insert("INSERT INTO JKDA_USER (ID, USERNAME, IDCARD, TELPHONE, PASSWORD, VERCODE)" +
            "    VALUES (#{id}, #{USERNAME}, #{IDCARD}, #{TELPHONE}, #{PASSWORD}, #{VERCODE,jdbcType=VARCHAR})")
    @SelectKey(statement = "SELECT SEQ_JKDA_USER.NEXTVAL FROM DUAL",
                keyProperty = "id",
                resultType = Long.class,
                before = true
                )
    Integer insertJkdaUser(Map<String, Object> userMap);

    插入前:

    插入后:

     

    MYSQL

    @Insert("INSERT INTO JKDA_USER (ID, USERNAME, IDCARD, TELPHONE, PASSWORD, VERCODE)" +
            "    VALUES (#{id}, #{USERNAME}, #{IDCARD}, #{TELPHONE}, #{PASSWORD}, #{VERCODE})")
    @SelectKey(statement = "SELECT LAST_INSERT_ID()",
                keyProperty = "id",
                resultType = Long.class,
                before = false
                )
    Integer insertJkdaUser3(Map<String, Object> userMap);

    方式三:只适用于MYSQL

    <insert id="insertJkdaUser" parameterType="hashmap" keyProperty="id" useGeneratedKeys="true">
        INSERT INTO JKDA_USER (ID, USERNAME, IDCARD, TELPHONE, PASSWORD, VERCODE)
        VALUES (#{id}, #{USERNAME}, #{IDCARD}, #{TELPHONE}, #{PASSWORD}, #{VERCODE})
    </insert>

    说明:

    useGeneratedKeys:默认值为false;

    设置为true之后,mybatis会使用JDBC的getGeneratedKeys()方法取出来由数据库内部生成的主键;

    获得到主键后将其赋值给keyProperty配置的id属性。

    方式四:只适用于MYSQL

    @Insert("INSERT INTO JKDA_USER (ID, USERNAME, IDCARD, TELPHONE, PASSWORD, VERCODE)" +
            "    VALUES (#{id}, #{USERNAME}, #{IDCARD}, #{TELPHONE}, #{PASSWORD}, #{VERCODE})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    Integer insertJkdaUser2(Map<String, Object> userMap);

    写在最后

      哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

     相关推荐:

  • 相关阅读:
    leveldb实现类sql查询
    系统设计
    Code Complete
    工具 VSCode快捷键
    C/C++ extern
    C/C++ 宏字符串拼接
    【Java】字符串
    【Java】常用类-sysytem-math
    【Java】枚举
    【Java】内部类
  • 原文地址:https://www.cnblogs.com/Marydon20170307/p/16355065.html
Copyright © 2020-2023  润新知