zoukankan      html  css  js  c++  java
  • (转)MyBatis insert 返回主键的方法(oracle和mysql)

    转自: https://www.cnblogs.com/tv151579/archive/2013/03/11/2954841.html

    参考:

    1.http://liuqing9382.iteye.com/blog/1574864

    2.http://blog.csdn.net/ultrani/article/details/9351573

    3.mybatis中文文档

    作者前言:

    使用Mybatis时,对于不同数据库比如Oracle、SQL Server、Mysql,它们的主键生成策略是不同的:

    1. Oracle自增主键必须得配一个sequence;

    2. SQL Server和Mysql的自增使用自动自增设置的;

    3. 对于非自增的主键,项目也可以使用数据库函数来产生唯一主键,比如uuid()。
    插入操作: 
    1. 对于类似mysql、SQL Server这样自增主键的表,插入可以不配置插入的主键列(在sql中显式的写出该id);

    2. 类似Oracle这类使用sequence或者uuid()这种数据库函数产生唯一主键,如果不做触发器之类的设置的话,一般需要在sql中写出主键列的。

    获取主键

    mybatis针对以上的不同生成策略以及不同的sql主键配置类型,将插入数据返回主键的解决方案分为一下几个情况:

    1. 如果使用的数据库支持自动生成主键(如:MySQL 和 SQL Server),那么您就可以简单地将 useGeneratedKeys 设置为”true”,然后使用 keyProperty 设置你希望自动生成主键的字段就可以了。

    例如,如果 Author 表使用一个字段自动生成主键,那么配置语句就可以修改为:

    <insert id="insertAuthor" parameterType="domain.blog.Author" useGeneratedKeys=”true” keyProperty=”id”>
      insert into Author (username,password,email,bio) values (#{username},#{password},#{email},#{bio})
    </insert>

    对于useGeneratedKeys和keyProperty属性的说明如下图:

    2. MyBatis 还有另外一种方式为不支持自动生成主键的数据库及 JDBC 驱动来生成键值,下面展示一个能够随机生成 ID 的例子(也许你不会这么做,这仅仅是演示 MyBatis 的功能,文档的词语,意思像是说至于你做不做,反正我做了):

    复制代码
    <insert id="insertAuthor" parameterType="domain.blog.Author">
      <selectKey keyProperty="id" resultType="java.lang.integer" order="BEFORE">
        select CAST(RANDOM()*1000000 as INTEGER) a from SYSIBM.SYSDUMMY1
      </selectKey>
      insert into Author (id, username, password, email,bio, favourite_section)
        values (#{id}, #{username}, #{password}, #{email}, #{bio}, #{favouriteSection,jdbcType=VARCHAR})
    </insert>
    复制代码

    注意:上面的语句中标红的文字,添加了selectKey标签,首先解释如下图:

    正如上面的解释我们只要把握住order的设置,在sql语句执行前(BEFORE)或者执行后(AFTER),执行selectKey 语句来获得主键就可以了,如上面例子selectKey首先执行,生成随机的主键,这时候Author对象中的id首先被赋值了,然后才会调用insert 语句。这相当于在您的数据库中自动生成键值,不需要编写复杂的 java 代码。

    当然,是否需要配置<selectKey>根据情况,只要能保证记录有主键即可,一旦配置了<selectKey>,就可以在执行插入操作时获取到新增记录的主键。 
    注意:如果没有配置<selectKey>那么保存后的对象的主键依旧为null。

    小结:

    通过上面的方案:

    1. 我们针对uuid()函数的主键返回应该如下:

    复制代码
        <insert id="insertTestRole" parameterType="hashmap" >
            <selectKey resultType="java.lang.String" order="BEFORE" keyProperty="id"> 
            SELECT uuid()
            </selectKey>
            insert into
            testRole(id,name)
            values(#{id},#{name})
        </insert>
    复制代码

    2. oracle针对Sequence主键而言,隐式主键插入前必须指定一个主键值给要插入的记录: 

    <insert id="AltName.insert" parameterType="AltName">  
         <selectKey resultType="long" keyProperty="id">  
           SELECT SEQ_TEST.NEXTVAL FROM DUAL   
         </selectKey>  
         insert into altname(primaryName,alternateName,type)values(#{primaryName},#{alternateName},#{type})   
     </insert> 

    或者显式主键:

    复制代码
        <insert id="insertEnterprise" parameterType="hashmap">
            <selectKey resultType="integer" order="AFTER" keyProperty="ENTERPRISE_ID">
                select sq_enterprise.currval from dual
            </selectKey>
                insert into
                    m_enterprise
                    (ENTERPRISE_ID,ENTERPRISE_NAME,ENTERPRISE_ADDRESS,ENTERPRISE_INTRODUCTION,ENTERPRISE_ZIP,ENTERPRISE_PHONE,ENTERPRISE_NUMBER)
                values
                    (sq_enterprise.nextval,#{enterprise_name},#{address},#{introduction},#{zip},#{phone},#{enterprise_number})
        </insert>
    复制代码

    3. MySql、sql server自增主键而言,这类表在插入时不需要主键,而是在插入过程自动获取一个自增的主键: 

         <insert id="AltName.insert" parameterType="AltName">
            <selectKey resultType="long" keyProperty="id">
              SELECT LAST_INSERT_ID()
            </selectKey>
            insert into altname(primaryName,alternateName,type)values(#{primaryName},#{alternateName},#{type})
        </insert>

    根据获得自增主键的方法,我们还可以:

         <insert id="AltName.insert" parameterType="AltName">
            <selectKey resultType="long" keyProperty="id">
              SELECT @@IDENTITY
            </selectKey>
            insert into altname(primaryName,alternateName,type)values(#{primaryName},#{alternateName},#{type})
        </insert>

    但是参考http://blog.csdn.net/ultrani/article/details/9351573 中四种获得自增主键的方法利弊分析,作者推荐使用useGeneratedKeys属性设置来利用JDBC的getGeneratedKeys方法获得自增主键。

  • 相关阅读:
    电脑发朋友圈神器?不是严格意义上的
    微信公众平台投票功能升级 可多渠道发布投票
    多客服功能终于也向所有微信认证的订阅号开放了
    微信电脑版-微信for windows客户端发布
    微信朋友圈广告的赢家是他们
    微信公众平台原创声明功能公测 自媒体原创保护的福音
    微信公众平台数据接口正式对所有认证公众号开放
    壕,微信6.1版发微信红包更方便了,我们去喝杯茶吧
    微信公开课发布微信官方教程:教你用好微信JS-SDK接口
    微信公众平台开放JS-SDK(微信内网页开发工具包)
  • 原文地址:https://www.cnblogs.com/sfnz/p/14417185.html
Copyright © 2011-2022 走看看