Mybatis3 执行insert语句后获…

本文介绍如何在MyBatis中实现插入记录后获取自增主键值的方法,适用于MySQL数据库。文中提供了两种实现方式,并详细说明了配置要求及注意事项。

摘要

hibernate中获取新插入记录的对象id非常容易,通过其持久化对象就能完成。而Mybatis中有点复杂,本文转载了一篇文章,讲述mybatis中获取插入记录的自增长id,经测试MySQL中有效,其他数据库未知。

需求

使用MyBatis往MySQL数据库中插入一条记录后,需要返回该条记录的自增主键值。


如果xml的传入参数是map,selectKey会将结果放到入参数map中。用POJO的情况一样,但是有一点需要注意的是,keyProperty对应的字段在POJO中必须有相应的setter方法,setter的参数类型还要一致,否则会报错。

 直接获取Integer类型的返回值将得到受影响的行数。

方法

下面说两种方法,MyBatis+MySQL 返回插入记录的主键ID: 
第一种:

Mybatis3 <wbr>执行insert语句后获得当前插入主键值 <wbr>5


第二种:

Mybatis3 <wbr>执行insert语句后获得当前插入主键值 <wbr>5

总结

这两种写法都可以,但有两点一定要注意: 
1)Mybatis Mapper 文件中,“useGeneratedKeys”和“keyProperty”必须添加,keyProperty=”id” ,这个id必须是实体的id,而不是数据表的主键id,否则,得不到正确的返回结果; 
2)接收返回值时候,必须用实体的get属性,而不能定义变量,否则,接收不到正确的返回结果:即必须用user.getId()来接收。

<think>好的,我现在要详细分析MyBatis中ORM的insert语句执行流程。首先,我需要回忆一下MyBatis的基本工作原理。根据用户提供的引用内容,MyBatis是一个半自动化的ORM框架,开发者需要自己编写SQL语句,而MyBatis负责处理动态SQL、结果映射等重复性工作。特别是在insert操作中,用户提到的session.insert方法以及executor.update方法可能是关键步骤。 首先,用户提到的引用[4]中的示例代码展示了如何通过SqlSession执行insert操作。代码中调用了session.insert方法,并传入了Mapper的命名空间和参数对象。随后,手动提交事务,并输出插入的行数和生成的主键。这说明在MyBatis中,insert操作需要显式提交事务,尤其是在非自动提交模式下。 接下来,分析session.insert方法的内部实现。根据引用[4],session.insert实际上调用了update方法,而update方法内部获取了对应的MappedStatement,然后通过Executor执行数据库更新。这里需要注意的是,MappedStatement包含了SQL语句的信息,比如insert语句的具体内容、参数映射等。Executor负责实际的数据库操作,包括预处理语句、参数设置、执行SQL等步骤。 然后,Executor在执行update方法时,会处理参数。引用中提到wrapCollection(parameter)在批量插入时有用,这可能涉及将参数包装成集合,以便处理批量操作。MyBatis通过动态代理生成的Mapper接口,在调用insert方法时,会将方法调用转发给SqlSession的方法,进而由Executor执行。 在参数处理阶段,MyBatis会解析Mapper XML文件中定义的insert语句,替换其中的占位符,如#{},将其转换为预编译的参数。例如,如果插入语句中有#{title}和#{content},MyBatis会从传入的Blog对象中获取对应的属性值,并设置到PreparedStatement中。 关于主键生成,用户示例中的blog.getId()返回null,因为没有配置selectKey。这说明如果数据库支持自增主键,MyBatis可以通过配置useGeneratedKeys来获取插入后生成的主键,并回填到实体对象中。这是ORM映射的重要部分,确保对象与数据库记录的一致性。 此外,事务管理也是关键环节。根据示例中的session.commit(),MyBatis默认使用手动提交,需要开发者显式提交事务。这影响了insert操作的原子性和数据一致性,开发者需根据需求配置自动提交或手动管理事务。 最后,整个流程涉及多个核心组件,如SqlSession、Executor、MappedStatement等,它们协同工作,将开发者的insert操作转换为具体的数据库执行步骤。动态SQL的支持在此过程中可能影响SQL的生成,但根据引用[1],MyBatis的动态SQL处理在insert中可能相对简单,除非涉及插入。 总结起来,MyBatisinsert执行流程主要包括:创建SqlSession、获取Mapper代理、解析Mapper配置、构造MappedStatement、Executor执行数据库操作、参数绑定、SQL执行、事务提交以及主键回填。需要验证这些步骤是否正确,以及是否有遗漏的细节,比如缓存处理或插件拦截等,但根据现有引用,这些可能不是用户关注的重点。需要确保回答覆盖主要步骤,并引用提供的资料支持分析。</think>### MyBatis ORM Insert语句执行流程解析 MyBatisInsert操作执行流程涉及**动态SQL解析、参数映射、执行器调度、事务管理**等多个核心环节。以下是详细流程解析: --- #### 一、核心组件协作流程 1. **Mapper接口调用** 通过动态代理生成的Mapper接口(如`BlogMapper`),调用`insertBlog`方法时,会触发`SqlSession`的`insert`方法[^4]。 2. **SqlSession路由操作** `SqlSession.insert(String statement, Object parameter)`方法将请求转发给`Executor`执行器: ```java // 示例代码片段[^4] public int insert(String statement, Object parameter) { return update(statement, parameter); // 实际调用update方法 } ``` 3. **MappedStatement解析** 根据Mapper XML中定义的`<insert>`标签,MyBatis会生成`MappedStatement`对象,包含SQL语句、参数映射规则、主键生成策略等信息[^3]。 4. **Executor执行数据库操作** `Executor`(默认实现为`SimpleExecutor`或`BatchExecutor`)负责: - 获取数据库连接 - 创建`PreparedStatement` - 参数绑定(通过`ParameterHandler`) - 执行SQL并返回影响行数[^4] --- #### 二、关键步骤详解 1. **参数映射与动态SQL处理** - 若使用动态SQL(如`<if>`标签),MyBatis通过`SqlSource`解析生成最终SQL。 - 参数对象(如`Blog`)的属性值通过OGNL表达式绑定到占位符`#{field}`[^2]。 2. **主键回填机制** - **自增主键**:通过配置`useGeneratedKeys="true"`,MyBatis通过`ResultSet.getGeneratedKeys()`获取主键值并回填到对象。 - **自定义主键**:通过`<selectKey>`标签定义主键生成逻辑(如序列查询)[^4]。 3. **事务提交** - 默认情况下,`SqlSession`需手动提交事务(`session.commit()`)。 - 若未提交,事务会随连接关闭回滚[^4]。 --- #### 三、流程示意图 ```plaintext Mapper接口调用 → SqlSession.insert() → Executor.update() → 解析MappedStatement → 参数绑定(ParameterHandler) → 执行PreparedStatement → 主键回填(KeyGenerator) → 事务提交(手动/自动) ``` --- #### 四、性能优化点 - **批量插入**:使用`BatchExecutor`或`<foreach>`标签拼接多值插入语句。 - **主键生成策略**:优先使用数据库自增主键,减少应用层计算开销[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值