参考:
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 中插入返回主键代码实例的实现方法。 在使用 MyBatis 进行数据插入时,需要使用 `selectKey` 元素来获取插入后的主键值。`selectKey` 元素可以在插入语句之前或之后执行,具体的实现方法取...
该工具提供了针对Oracle和MySQL两大常用数据库的版本,满足不同项目需求。 在Oracle和MySQL版中,用户可以根据自己的数据库类型选择合适的版本进行反向生成。Oracle版适用于使用Oracle数据库的项目,而MySQL版则...
本文将详细介绍 MyBatis 在 insert 插入操作时返回主键 ID 的配置,包括 MySQL 和 Oracle 两个数据库的用法。 MySQL 用法 在 MySQL 中,MyBatis 提供了一个简单的配置来返回插入的主键 ID。我们可以在 insert 语句...
在MyBatis中,处理自增主键是一个常见的需求,特别是在Oracle和MySQL这两个数据库中。Oracle通常使用Sequence来生成自增主键,而MySQL则直接通过表定义的自增属性来处理。以下将详细讲解这两种数据库在MyBatis中的...
首先,我们需要在MyBatis的Mapper接口中定义一个插入并返回主键ID的方法。这里我们以一个`UserDao`接口为例,定义一个`insertAndGetId`方法: ```java public interface UserDao { public int insertAndGetId(User...
在 Oracle 数据库中,与许多其他关系型数据库系统不同,它并没有内置的自动自增字段类型,例如 MySQL 的 `AUTO_INCREMENT` 或 SQL Server 的 `IDENTITY`。但是,Oracle 提供了序列(Sequences)和触发器(Triggers)...
在MyBatis的insert元素中,我们可以设置keyProperty="id"用来指定要返回的主键id,而useGeneratedKeys="true"则用于获取自增长的ID。 在上面的示例中,我们可以看到insert元素中设置了keyProperty="id"和...
在MyBatis中,当你执行一个插入(insert)操作时,通常默认情况下,MyBatis不会返回新插入记录的主键值,而是返回插入的记录条数。然而,在某些业务场景下,我们可能需要获取到新插入记录的主键,以便进行后续的操作...
在处理插入数据到数据库并返回主键的场景时,MyBatis提供了两种主要的方法。这两种方法都是在映射文件(Mapper.xml)中配置,允许你在插入记录后获取自动生成的主键值。 **方式一:使用`useGeneratedKeys`和`...
在MyBatis中,主键自动生成是一种常见且实用的功能,尤其在与支持自动增加主键的数据库(如MySQL)配合使用时。当我们在插入数据时,有时希望数据库能够自动为新记录生成唯一的主键值,而不是手动指定。MyBatis提供...
在本文中,我们将详细介绍MyBatis插入数据返回主键的实现方法。 Service层实现 在Service层中,我们可以使用MyBatis提供的Mapper接口来实现插入数据的功能。例如,我们可以定义一个`addUser`方法,用于插入用户...
总之,当在Oracle数据库中使用MyBatis进行批量插入时,务必注意适应Oracle的特定语法,如使用`INSERT ALL`,避免使用MySQL等其他数据库系统适用的语法,如逗号分隔的`VALUES`列表。同时,确保正确处理主键生成逻辑,...
`<selectKey>`标签用于获取自增主键的值,通常在MySQL中,当`useGeneratedKeys`设为`true`时,可以获取到自增ID。这里设置为`AFTER`,意味着在插入语句执行后获取新生成的ID。 4. **foreach标签的使用**: `...
其实还有更简单的方法,而且是更好的方法,使用合理描述参数和SQL语句返回值的接口(比如IUserOperation.class),这样现在就可以至此那个更简单,更安全的代码,没有容易发生的字符串文字和转换的错误.下面是详细...
在MyBatis的配置文件中,你可能已经为其他支持自增主键的数据库(如MySQL)设置了`useGeneratedKeys="true"`,但对Oracle来说,因为自增机制不同,需要在插入语句中显式调用序列。所以,对于Oracle,你需要按照上述...
在 Mybatis 中,要实现插入一条或批量插入,需要使用 `<insert>` element,并在其中使用 `useGeneratedKeys` 和 `keyProperty` 属性来获取自增长主键。 MySQL 在 MySQL 中,需要使用 `useGeneratedKeys="true"` 和...
总的来说,Java开发中使用MyBatis与Oracle配合进行批量导入时,关键在于如何构造正确的SQL语句以适应Oracle的特性,如使用序列生成主键,以及正确处理并发和事务。通过DAO、Service和Controller层的合理分工,可以...
对于大多数支持自增主键的数据库系统(如 MySQL、PostgreSQL),`useGeneratedKeys` 和 `keyProperty` 配置都可以正常工作。但在某些数据库(如 Oracle)中,可能需要额外的配置或使用特定的数据库特性来获取自增...
《尚硅谷Mybatis视频教程11-20》是一系列深入讲解Mybatis框架的视频教程,涵盖了Mybatis的多个核心概念和技术。Mybatis是Java开发中的一个持久层框架,它简化了数据库操作,使得开发者能够更加专注于SQL和业务逻辑。...