`

mybatis自增主键配置

 
阅读更多
http://leeyee.github.io/blog/2013/08/22/mybatis-auto-increment-primary-key/

mybatis进行插入操作时,如果表的主键是自增的,针对不同的数据库相应的操作也不同。基本上经常会遇到的就是 Oracle Sequece 和 Mysql 自增主键,至于其他的手动生成唯一主键的问题在这里就不讨论了,这里主要说明下在mybatis中对于自增主键的配置。

不返回自增主键值
如果考虑到插入数据的主键不作为其他表插入数据的外键使用,那么可以考虑使用这种方式。

Oracle Sequence 配置
 <sql id='TABLE_NAME'>TEST_USER</sql>
 <sql id='TABLE_SEQUENCE'>SEQ_TEST_USER_ID.nextval</sql>
 <!-- 注意这里直接调用sequence的nextval函数 -->
 <insert id="insert" parameterType="User">
     insert into <include refid="TABLE_NAME" /> (ID,NAME,AGE)
         values ( <include refid="TABLE_SEQUENCE" /> ,#{name}, #{age} )
 </insert>

当插入语句如上配置时,那么针对如下语句
 User user = new User();
 user.setName("test");
 user.setAge(24);
 userMapper.insert(user);
 System.out.println(user.id); // user.id 为空

user.id为空,也就是说如上的配置并不能在完成插入操作后将插入时的主键值存放到保存的对象中。

Mysql自增主键配置

由于mysql数据库中,可以设置表的主键为自增,所以对于Mysql数据库在mybatis配置插入语句时,不指定插入ID字段即可。主键的自增交由Mysql来管理。
 <sql id='TABLE_NAME'>TEST_USER</sql>
 <!-- 注意这里的插入SQL中是没有指明ID字段的! -->
 <insert id="insert" parameterType="User">
     insert into <include refid="TABLE_NAME" /> (NAME,AGE)
         values (#{name}, #{age} )
 </insert>

同样,针对Mysql如此配置mybaits,插入完成后user.id为空。

插入后获取自增主键值
上述的情况能满足大部分情况,但有时候我们会遇到类似一对多的那种表结构,在插入多端数据时,需要获取刚刚保存了的一段的主键。那么这个时候,上述的配置就无法满足需要了。为此我们需要使用mybatis提供的<selectKey />来单独配置针对自增逐渐的处理。

Oracle Sequence 配置
 <sql id='TABLE_NAME'>TEST_USER</sql>
 <sql id='TABLE_SEQUENCE'>SEQ_TEST_USER_ID.nextval</sql>
 <!-- 注意这里需要先查询自增主键值 -->
 <insert id="insert" parameterType="User">
     <selectKey keyProperty="id" resultType="int" order="BEFORE">
         select <include refid="TABLE_SEQUENCE" /> from dual
     </selectKey>
     insert into <include refid="TABLE_NAME" /> (ID,NAME,AGE)
         values ( #{id}, #{name}, #{age} )
 </insert>

当使用了<selectKey />后,在实际的插入操作时,mybatis会执行以下两句SQL:

select SEQ_TEST_USER_ID.nextval from dual; // 语句1
insert into (ID,NAME,AGE) values ( ?, ?, ? ); // 语句2
在执行插入 语句2 之前,会先执行 语句1 以获取当前的ID值,然后mybatis使用反射调用User对象的setId方法,将 语句1 查询出的值保存在User对象中,然后才执行 语句2 这样就保证了执行完插入后
 User user = new User();
 user.setName("test");
 user.setAge(24);
 userMapper.insert(user);
 System.out.println(user.id); // user.id 不为空

user.id是有值的。

Mysql自增主键配置

针对于Mysql这种自己维护主键的数据库,可以直接使用以下配置在插入后获取插入主键,
 <sql id='TABLE_NAME'>TEST_USER</sql>
 <insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="User">
     insert into <include refid="TABLE_NAME" /> ( NAME, AGE )
         values ( #{name}, #{age} )
 </insert>

当然,由于Mysql的自增主键可以通过SQL语句
 select LAST_INSERT_ID();

来获取的。因此针对Mysql,Mybatis也可配置如下:
 <sql id='TABLE_NAME'>TEST_USER</sql>
 <!-- 注意这里需要先查询自增主键值 -->
 <insert id="insert" parameterType="User">
     <selectKey keyProperty="id" resultType="int" order="BEFORE">
         SELECT LAST_INSERT_ID()
     </selectKey>
     insert into <include refid="TABLE_NAME" /> (ID,NAME,AGE)
         values ( #{id}, #{name}, #{age} )
 </insert>

只不过该中配置需要额外的一条查询SQL!

小结
当数据插入操作不关心插入后数据的主键(唯一标识),那么建议使用 不返回自增主键值 的方式来配置插入语句,这样可以避免额外的SQL开销.

当执行插入操作后需要立即获取插入的自增主键值,比如一次操作中保存一对多这种关系的数据,那么就要使用 插入后获取自增主键值 的方式配置.
分享到:
评论

相关推荐

    mybatis自增主键文档

    以下将详细讲解这两种数据库在MyBatis中的自增主键配置。 1. **Oracle Sequence 配置** 在Oracle中,你可以创建一个Sequence来生成唯一的序列号。在MyBatis中,你需要定义一个SQL片段来引用这个Sequence。以下是...

    mybatis获取自增主键的值

    在MyBatis这个流行的Java持久层框架中,处理自增主键的值通常涉及到插入数据后如何获取新生成的ID。下面将详细阐述MyBatis如何实现这一功能。 1. **自增主键的原理**: 自增主键通常在关系型数据库如MySQL、...

    最新Mybatis插入数据返回自增主键详细配置

    Mybatis插入数据返回自增主键 Mybatis插入数据以后只会返回影响的数据库行数,如果是插入一条数据成功则返回1,失败返回零,插入多条返回插入成功的数量。 通过注解或者xml配置无法直接返回自增的主键。Mybatis插入...

    mybatis自定义生成代码策略示例

    1. **配置文件**:在 MyBatis Generator(MBG)中,我们首先需要创建一个 XML 配置文件,用于定义生成代码的基本设置,如数据库连接信息、目标输出目录、生成的文件类型等。配置文件中的 `&lt;generatorConfiguration&gt;`...

    Mybatis使用useGeneratedKeys获取自增主键的方法

    当在Mybatis的XML映射文件中配置一个插入语句时,设置`useGeneratedKeys="true"`指示Mybatis在执行插入操作后,调用JDBC的`getGeneratedKeys`方法来获取由数据库生成的自增主键。例如: ```xml INSERT INTO ...

    mybatis获取自增ID

    MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。 #### 二、获取自增ID的意义 在数据库操作中,经常需要插入数据到表中,...

    MyBatis Oracle 自增序列的实现方法

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

    利用Java的MyBatis框架获取MySQL中插入记录时的自增主键

    在MyBatis中,我们可以通过配置来获取这个自增主键的值。 步骤一:在Mapper XML文件中配置插入语句。在`&lt;insert&gt;`标签内,我们需要添加两个属性:`useGeneratedKeys="true"` 和 `keyProperty="id"`。`...

    详解mybatis plus使用insert没有返回主键的处理

    在使用MyBatis Plus (MP) 进行数据操作时,有时可能会遇到插入数据后无法获取自增主键的情况。本文将深入分析这个问题,并提供解决方案。 首先,MyBatis Plus 是 MyBatis 的一个扩展库,它提供了很多方便的数据操作...

    mybatis-plus主键生成策略

    其次,全局主键策略是在`application.yml`配置文件中设定,通过`mybatis-plus`的`global-config`下的`db-config`配置项指定默认的主键类型。例如: ```yaml mybatis-plus: mapper-locations: com/mp/mapper/* ...

    支持主键自增的数据库获取主键值.zip

    总的来说,当使用MyBatis操作支持主键自增的数据库时,正确配置映射文件并利用`useGeneratedKeys`和`keyProperty`属性,可以方便地获取并利用自增主键。这样不仅可以简化开发工作,还能确保数据的一致性和完整性。在...

    Mybatis-plus实现主键自增和自动注入时间的示例代码

    Mybatis-plus 实现主键自增和自动注入时间的示例代码 Mybatis-plus 是一个基于 Mybatis 的增强型 ORM 框架,它提供了许多实用的功能来简化数据库操作。在本文中,我们将通过示例代码,介绍如何使用 Mybatis-plus ...

    MyBatis关于注解的配置

    - `@Options`: 提供一些额外的选项,如`useGeneratedKeys`和`keyProperty`,用于处理自增主键。 4. **自动扫描与注册** 在Spring集成MyBatis时,可以通过`@MapperScan`注解在配置类上指定包名,让Spring自动扫描...

    尚硅谷Mybatis视频教程11-20

    第17、18集则关注于自增主键的处理,17集展示了如何获取插入后自动生成的主键,通常在MySQL等支持自动增长主键的数据库中使用。而在18集中,针对Oracle数据库,讲解了如何利用序列来生成主键,这是Oracle数据库特有...

    mybatis笔记

    2. @Insert:插入数据的方法,可以返回自增主键。 3. @Update:更新数据的方法。 4. @Delete:删除数据的方法。 5. @Result:定义字段映射关系。 6. @Results:一组@Result的集合,常用于复杂的一对多或多对一映射。...

    mybatis.generator配置文件

    MyBatis Generator支持多种主键生成策略,如Identity(自动增长)、Sequence(序列号)和AutoIncrement(数据库自增)等。 4. **commentGenerator**:用于设置代码注释生成器。你可以自定义注释内容,比如添加作者...

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

    在使用MyBatis进行数据库操作时,有时我们需要在插入数据后获取自动生成的主键ID,这在处理自增主键的场景下尤其常见。在MySQL数据库中,自增主键通常用于标识每条记录的独特性,而在插入新记录后,数据库会自动为这...

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

    在Java开发中,MyBatis是一个非常...总结来说,MyBatis提供两种方式来处理插入数据并返回自增主键的逻辑。理解这两种方式的差异和适用场景,以及避免常见的编程陷阱,对于高效地使用MyBatis进行数据库操作至关重要。

    MyBatis 工作原理和详解

    - 插入用户,可以选择返回主键值,如果是自增主键,MyBatis可以自动获取;对于非自增主键,如UUID或Oracle序列,也需要特殊处理。 - 更新用户信息,MyBatis允许开发者根据需要更新特定字段。 - 删除用户,可以通过ID...

Global site tag (gtag.js) - Google Analytics