oracle及mysql+mybatis新增一条记录并获取该记录的id

本文介绍了在使用Mybatis框架时如何在Oracle和MySQL数据库中新增记录后获取新生成的ID。在MySQL中,可以利用last_insert_id()函数;而在Oracle中,需要借助序列(seq.nextval)来获取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在特定的业务需求中,我们有时需要获取刚新增记录的id,在mybatis框架下可以通过idProperty配置获取到,而对于mySQL和oracle数据库,获取方法有一点区别,mySql可以通过last_insert_id获取,oracle则通过seq.nextval获取,获取方式如下:

一:mysql获取新增记录id的例子

Mybatis映射文件中SQL语句:

<insert id="insert" parameterType="com.xxx.xxxx.User">
        insert into t_user (name) 
        values (#{name})
        <selectKey resultType="Long" order="AFTER" keyProperty="id">
            SELECT LAST_INSERT_ID() AS id
        </selectKey>
</insert>

可通过System.out.println(user.getId)检查是否获取到


二:oracle映射文件中SQL语句:

<insert id="insert" parameterType="com.xxx.xxxx.User" >
    
    //获取序列值,并赋值到对象的id字段
    <selectKey keyProperty="id" resultType="DECIMAL" order="BEFORE">  
            select seq_t_user.nextval from dual  
    </selectKey>
    
    insert into t_user(ID, NAME)
  //获取上面对象中id字段的值 values (#{id,jdbcType
=DECIMAL}, #{name,jdbcType=VARCHAR}) </insert>
也可通过System.out.println(user.getId)检查是否获取到,从SQL可以看出mysql是在插入之后获取id,而oracle是在插入数据之前从序列直接获取,

因此对于order参数,mysql对应的是AFTER,而oracle对应的是BEFORE

<think>好的,我现在需要帮助用户解决在使用MyBatis进行新增操作后如何获取生成的ID的问题。用户已经提供了一些相关的引用内容,我需要结合这些信息来构建一个详细的回答。 首先,我需要回忆一下MyBatis获取自增ID的几种常见方法。根据用户提供的引用,特别是引用[4]和[5],看起来有两种主要方式:使用`<selectKey>`标签和配置`useGeneratedKeys`属性。另外,可能还有其他方法,比如在插入后通过查询获取ID,但用户提供的引用中没有提到,可能需要确认是否适用。 引用[4]中的例子展示了在插入语句中使用`<selectKey>`来获取自增ID,这里用的是MySQL的`LAST_INSERT_ID()`函数,将结果赋给实体类的id属性。这里需要注意的是`order`属性的设置,如果是MySQL这样的数据库,自增ID是在插入之后生成的,所以`order`应该设置为`AFTER`。而如果是像Oracle这样使用序列的情况,可能需要将`order`设置为`BEFORE`,在插入之前获取序列的下一个值。 引用[5]提到了`KeyGenerator`,这可能是MyBatis内部处理生成键的机制。当使用`useGeneratedKeys`时,MyBatis会自动调用这个类来处理生成的主键,将其回填到实体对象中。所以用户需要确保他们的数据库驱动支持返回生成的ID且正确配置了`useGeneratedKeys`和`keyProperty`属性。 接下来,我需要将这两种方法详细说明,给出示例代码。对于`<selectKey>`方法,需要区分不同的数据库,比如MySQLOracle的区别。对于`useGeneratedKeys`方法,要指出适用的数据库类型,提醒用户注意驱动兼容性。 另外,用户可能在使用过程中遇到一些问题,比如ID没有正确回填到实体对象中,这时候需要检查`keyProperty`是否指定正确,或者数据库是否确实返回了生成的ID。这部分可以作为注意事项或常见问题来提醒用户。 然后,根据用户提供的引用内容,特别是引用[4]和[5],需要正确引用这些示例到回答中,确保用户能够理解每个步骤的作用。例如,在`<selectKey>`的例子中,需要解释各个属性的含义,以及为什么需要`order="AFTER"`。 最后,生成相关问题,帮助用户扩展相关知识,比如批量插入时如何获取ID,或者不同数据库的配置差异。这些问题需要基于当前主题,自然延伸出来,帮助用户深入理解。 总结一下,回答的结构应该是: 1. 引言:说明获取自增ID的需求和常见方法。 2. 方法一:使用`<selectKey>`标签,分MySQLOracle两种情况。 3. 方法二:配置`useGeneratedKeys`属性。 4. 注意事项:包括属性配置、数据库支持和对象属性匹配。 5. 相关问题:生成三个相关问题,供用户进一步学习。 在写作过程中,要确保使用正确的中文表达,行内公式用$...$,独立公式用$$...$$(不过这个问题中可能不太需要数学公式)。同时,按照用户的引用格式,在适当的位置添加引用标记,比如引用[4]和[5]。 现在需要检查是否有遗漏的细节,比如是否还有其他获取ID的方法,或者用户提到的其他引用是否相关。例如,引用[1]和[2]是关于批量插入的,而引用[3]是关于SQL片段和查询的,可能与当前问题关联不大,但用户的问题是关于插入后获取ID,所以主要关注引用[4]和[5]。 最后,确保回答清晰易懂,步骤明确,示例代码正确,且注意事项能够帮助用户避免常见错误。</think>在使用MyBatis进行数据新增操作时,可通过以下两种方式获取数据库自动生成的主键ID: --- ### 方法一:通过`<selectKey>`标签手动获取 在Mapper XML文件中定义插入语句时,使用`<selectKey>`标签显式声明如何获取生成的主键。 **示例(MySQL场景):** ```xml <insert id="insertBlog" parameterType="Blog"> <selectKey resultType="java.lang.Integer" keyProperty="id" order="AFTER"> SELECT LAST_INSERT_ID() <!-- MySQL获取最后插入的自增ID --> </selectKey> insert into blog (title, content) values (#{title}, #{content}) </insert> ``` - `keyProperty`:实体类中映射主键的属性名(如`id`)[^4]。 - `order`:若数据库为MySQL等自增ID类型,需设置为`AFTER`;若为Oracle等使用序列的场景,需设置为`BEFORE`。 --- ### 方法二:通过`useGeneratedKeys`自动映射 在插入语句中配置`useGeneratedKeys`和`keyProperty`属性,MyBatis会自动将生成的主键回填到实体对象中。 **示例:** ```xml <insert id="insertBlog" parameterType="Blog" useGeneratedKeys="true" keyProperty="id"> insert into blog (title, content) values (#{title}, #{content}) </insert> ``` - `useGeneratedKeys="true"`:启用数据库生成的主键自动映射。 - `keyProperty="id"`:将生成的主键值赋给实体类的`id`属性[^4]。 --- ### 实现原理 MyBatis通过`KeyGenerator`接口处理主键生成逻辑。执行插入操作后,会调用`processAfter`方法将主键值回填到实体对象中[^5]。 --- ### 注意事项 1. **属性一致性**:确保`keyProperty`与实体类属性名完全匹配。 2. **数据库支持**:`useGeneratedKeys`依赖于数据库驱动是否支持返回生成的主键(如MySQL支持,Oracle需额外配置)。 3. **批量插入场景**:需为每条记录单独生成ID,可通过扩展SQL语句实现(如引用[1]的批量插入语法)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值