MyBatis执行器与新增返回主键问题

前提:在写需求时碰到一个问题,在新增加一条数据时需要返回主键并进行后续操作,发现当前项目并不能返回主键

正常返回主键代码(1):

<insert id="方法名" parameterType="入参完整路径" useGeneratedKeys="true" keyProperty="id">
       sql
    </insert

正常返回主键代码(2):

<insert id="方法名" parameterType="入参完整路径" >
		<selectKey keyProperty="id" resultType="int" order="AFTER">
            select last_insert_id()
        </selectKey>
       sql
    </insert

正常是在 insert 属性里面写入:useGeneratedKeys=“true” keyProperty=“id” 或者获取到id,但是我并没有获取到,返回的主键一直是null。经过研究发现这块和MyBatis执行器有关系。

MyBatis执行器

SimpleExecutor: 默认的执行器, 对每条sql进行预编译->设置参数->执行等操作
BatchExecutor : 批量执行器, 对相同sql进行一次预编译, 然后设置参数, 最后统一执行操作
ReuseExecutor: 重用执行器会重用预处理语句(prepared statements)

我发现前面负责这个项目的人在mybatisConfig里面配置全局执行器设置为*Batch *

<setting name="executorType" value="BATCH" />

然后了解到执行器的区别才明白为什么一直返回主键为null , 因为是公司项目我没选择改执行器,还是选择了新增后又查了一遍获取id(虽然会有问题出现)。如果可以改MyBatis的话可以改成默认的就可以返回主键啦~

我是努力奋斗的小猿同学,希望大家一起努力一起进步~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MyBatis可以使用批量插入来实现批量新增数据,而在Oracle数据库中,可以通过使用序列来自动生成主键,然后将主键值插入到相关的表中。 在MyBatis中,通常使用`insertBatch`语句来实现批量新增,可以通过定义一个`List`来作为参数,每个元素代表一个要新增的对象,然后使用#{属性名}来引用相应的属性值。在执行批量新增时,也可以设置`batch`元素的`size`属性来指定批处理的大小,以优化性能。 此外,为了在新增数据时返回主键值,可以使用`selectKey`语句来获取生成的主键值。在Oracle中,可以通过设置`selectKey`语句的`order`属性为`BEFORE`来让它在新增数据之前获取主键值,然后将主键值设置到相应的对象中。 例如,以下是一个使用MyBatis和Oracle批量新增返回主键的示例: ``` <insert id="insertBatch" parameterType="java.util.List"> <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.Long"> SELECT SEQ_ID.NEXTVAL FROM DUAL </selectKey> insert into USER (ID, NAME, AGE) values (#{id}, #{name}, #{age}) </insert> ``` 在上述示例中,`insertBatch`语句插入一个`List`中包含的多个`User`对象,通过`selectKey`语句获取自动生成的主键值并设置到相应的对象中。 总之,通过结合MyBatis和Oracle的相关特性,可以实现批量新增返回主键的功能,以提高数据插入的性能和效率。 ### 回答2: MyBatis是一种JAVA持久层框架,使用MyBatis可以让程序员将数据库查询语句和JAVA代码相分离,很大程度上减少了编程量和维护成本。Oracle是一种常用的关系型数据库管理系统,是企业应用的首选。 在MyBatis Oracle批量新增数据时,我们需要使用Oracle的SEQUENCE(序列)来生成主键。SEQUENCE是Oracle的一种内部对象,能够生成一个唯一的数字序列,可以用于自动分配主键。我们需要在MyBatis XML配置文件中定义一个带有“selectKey”标签的insert语句,这个标签会让MyBatis在执行insert语句之前先查询SEQUENCE,然后将取得的结果作为主键插入到数据库中。 具体操作流程如下: 1. 创建一个Sequence。 CREATE SEQUENCE seq_test MINVALUE 1 MAXVALUE 999999999999999999999999999 START WITH 1 INCREMENT BY 1 CACHE 20; 2.在MyBatis XML配置文件中定义一个insert语句,并在该语句下面用“selectKey”标签来声明取得主键的方式。其中,“order”属性表示主键生成的顺序,可以选择“before”或“after”;“keyProperty”属性表示主键生成后存储在哪一个对象属性中,一般情况下是实体类的主键属性;“resultType”属性表示主键类型。 <insert id="batchInsert" parameterType="java.util.List"> <foreach collection="list" item="item" separator=";"> insert into table_test (id, name) values(seq_test.nextval, #{item.name}) </foreach> <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Long"> SELECT seq_test.currval FROM DUAL </selectKey> </insert> 3.在Java代码中调用该insert语句,并将数据存储在List中。 List<TestEntity> testList = new ArrayList<>(); for (int i = 0; i < 10; i++) { TestEntity test = new TestEntity(); test.setName("name_" + i); testList.add(test); } testMapper.batchInsert(testList); 4.执行以上代码后,MyBatis会根据insert语句将数据批量插入到数据库中,并通过SEQUENCE生成主键。在insert语句执行完之后,MyBatis会自动查询主键并将其存储在实体类的主键属性中。我们可以通过遍历List来获取新插入数据的主键值: for (TestEntity test : testList) { System.out.println(test.getId()); } 总之,MyBatis和Oracle的配合使用可以实现批量新增返回主键的操作。使用Oracle的SEQUENCE可以保证主键值的唯一性,MyBatis的XML配置文件中使用selectKey标签可以获取新插入数据的主键值。 ### 回答3: 在 MyBatis 中,可以通过使用批量插入操作来实现在 Oracle 数据库中批量新增返回主键值。 实现步骤如下: 1. 首先需要在 mapper.xml 文件中定义一个 insertList 节点,用于批量插入数据: ``` <insert id="insertList" parameterType="java.util.List"> <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.Long"> SELECT SEQ.nextval as id FROM dual </selectKey> insert into table_name (id, col1, col2, col3) values (#{id}, #{col1}, #{col2}, #{col3}) </insert> ``` 其中,keyProperty 属性指定主键的属性名称,order 属性指定主键生成的顺序,resultType 属性指定主键的数据类型(这里使用了 Long 类型)。 2. 在 Java 代码中,通过 sqlSession 的 insert 方法来执行批量新增操作: ``` List<Data> dataList = ...; // 构造待插入的数据列表 for (Data data : dataList) { sqlSession.insert("insertList", data); } sqlSession.commit(); // 提交事务 ``` 在执行插入操作时,MyBatis 会自动调用 selectKey 节点中指定的 SQL 语句来生成主键值,并将其赋值给对应的属性。最终,主键值会被映射回 Java 对象中,以便后续使用。 需要注意的是,在 Oracle 数据库中,使用批量插入操作时,需要将 autoCommit 属性设置为 false,以确保所有插入操作都在同一事务中执行。 总结:通过 MyBatis 的批量插入操作,我们可以很方便地实现在 Oracle 数据库中批量新增返回主键值的功能。在实现过程中,需要注意正确配置 mapper.xml 文件,并将 autoCommit 属性设置为 false,以确保操作在同一事务中执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值