`

MyBatis insert 返回主键的方法(oracle和mysql)

 
阅读更多

 

参考:

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方法获得自增主键。

 

 
 
 
分享到:
评论

相关推荐

    mybatis insert返回主键代码实例

    本文将详细介绍 MyBatis 中插入返回主键代码实例的实现方法。 在使用 MyBatis 进行数据插入时,需要使用 `selectKey` 元素来获取插入后的主键值。`selectKey` 元素可以在插入语句之前或之后执行,具体的实现方法取...

    mybatis反向生成工具-oracle,mysql版

    该工具提供了针对Oracle和MySQL两大常用数据库的版本,满足不同项目需求。 在Oracle和MySQL版中,用户可以根据自己的数据库类型选择合适的版本进行反向生成。Oracle版适用于使用Oracle数据库的项目,而MySQL版则...

    MyBatis在insert插入操作时返回主键ID的配置(推荐)

    本文将详细介绍 MyBatis 在 insert 插入操作时返回主键 ID 的配置,包括 MySQL 和 Oracle 两个数据库的用法。 MySQL 用法 在 MySQL 中,MyBatis 提供了一个简单的配置来返回插入的主键 ID。我们可以在 insert 语句...

    mybatis自增主键文档

    在MyBatis中,处理自增主键是一个常见的需求,特别是在Oracle和MySQL这两个数据库中。Oracle通常使用Sequence来生成自增主键,而MySQL则直接通过表定义的自增属性来处理。以下将详细讲解这两种数据库在MyBatis中的...

    MyBatis+MySQL 返回插入的主键ID的方法

    首先,我们需要在MyBatis的Mapper接口中定义一个插入并返回主键ID的方法。这里我们以一个`UserDao`接口为例,定义一个`insertAndGetId`方法: ```java public interface UserDao { public int insertAndGetId(User...

    Oracle主键自增的办法

    在 Oracle 数据库中,与许多其他关系型数据库系统不同,它并没有内置的自动自增字段类型,例如 MySQL 的 `AUTO_INCREMENT` 或 SQL Server 的 `IDENTITY`。但是,Oracle 提供了序列(Sequences)和触发器(Triggers)...

    MyBatis insert操作插入数据之后返回插入记录的id

    在MyBatis的insert元素中,我们可以设置keyProperty="id"用来指定要返回的主键id,而useGeneratedKeys="true"则用于获取自增长的ID。 在上面的示例中,我们可以看到insert元素中设置了keyProperty="id"和...

    MyBatis中insert操作返回主键的实现方法

    在MyBatis中,当你执行一个插入(insert)操作时,通常默认情况下,MyBatis不会返回新插入记录的主键值,而是返回插入的记录条数。然而,在某些业务场景下,我们可能需要获取到新插入记录的主键,以便进行后续的操作...

    详解Java MyBatis 插入数据库返回主键

    在处理插入数据到数据库并返回主键的场景时,MyBatis提供了两种主要的方法。这两种方法都是在映射文件(Mapper.xml)中配置,允许你在插入记录后获取自动生成的主键值。 **方式一:使用`useGeneratedKeys`和`...

    MyBatis主键自动生成方法.pdf

    在MyBatis中,主键自动生成是一种常见且实用的功能,尤其在与支持自动增加主键的数据库(如MySQL)配合使用时。当我们在插入数据时,有时希望数据库能够自动为新记录生成唯一的主键值,而不是手动指定。MyBatis提供...

    MyBatis插入数据返回主键的介绍

    在本文中,我们将详细介绍MyBatis插入数据返回主键的实现方法。 Service层实现 在Service层中,我们可以使用MyBatis提供的Mapper接口来实现插入数据的功能。例如,我们可以定义一个`addUser`方法,用于插入用户...

    Oracle+Mybatis的foreach insert批量插入报错的快速解决办法

    总之,当在Oracle数据库中使用MyBatis进行批量插入时,务必注意适应Oracle的特定语法,如使用`INSERT ALL`,避免使用MySQL等其他数据库系统适用的语法,如逗号分隔的`VALUES`列表。同时,确保正确处理主键生成逻辑,...

    MyBatis批量插入(insert)数据操作

    `&lt;selectKey&gt;`标签用于获取自增主键的值,通常在MySQL中,当`useGeneratedKeys`设为`true`时,可以获取到自增ID。这里设置为`AFTER`,意味着在插入语句执行后获取新生成的ID。 4. **foreach标签的使用**: `...

    springmybatis

    其实还有更简单的方法,而且是更好的方法,使用合理描述参数和SQL语句返回值的接口(比如IUserOperation.class),这样现在就可以至此那个更简单,更安全的代码,没有容易发生的字符串文字和转换的错误.下面是详细...

    MyBatis Oracle 自增序列的实现方法

    在MyBatis的配置文件中,你可能已经为其他支持自增主键的数据库(如MySQL)设置了`useGeneratedKeys="true"`,但对Oracle来说,因为自增机制不同,需要在插入语句中显式调用序列。所以,对于Oracle,你需要按照上述...

    Mybatis 插入一条或批量插入 返回带有自增长主键记录的实例

    在 Mybatis 中,要实现插入一条或批量插入,需要使用 `&lt;insert&gt;` element,并在其中使用 `useGeneratedKeys` 和 `keyProperty` 属性来获取自增长主键。 MySQL 在 MySQL 中,需要使用 `useGeneratedKeys="true"` 和...

    mybatis+Oracle做批量导入时的坑

    总的来说,Java开发中使用MyBatis与Oracle配合进行批量导入时,关键在于如何构造正确的SQL语句以适应Oracle的特性,如使用序列生成主键,以及正确处理并发和事务。通过DAO、Service和Controller层的合理分工,可以...

    mybatis返回插入的id1

    对于大多数支持自增主键的数据库系统(如 MySQL、PostgreSQL),`useGeneratedKeys` 和 `keyProperty` 配置都可以正常工作。但在某些数据库(如 Oracle)中,可能需要额外的配置或使用特定的数据库特性来获取自增...

    尚硅谷Mybatis视频教程11-20

    《尚硅谷Mybatis视频教程11-20》是一系列深入讲解Mybatis框架的视频教程,涵盖了Mybatis的多个核心概念和技术。Mybatis是Java开发中的一个持久层框架,它简化了数据库操作,使得开发者能够更加专注于SQL和业务逻辑。...

Global site tag (gtag.js) - Google Analytics