Mybatis 批量新增 只返回第一主键ID 其他返回null

    <insert id="batchInsert" parameterType="java.util.List" useGeneratedKeys="true" keyColumn="subform_id"
            keyProperty="subformId">
        insert into t_form_subf
        (
        form_id,
        subform_no,
        subform_name,
        subform_describe,
        subform_input_type,
        subform_content,
        subform_length,
        subform_width,
        required_yn,
        dict_code,
        table_code,
        field_code,
        regi_state,
        create_by,
        create_time,
        update_by,
        update_time
        )
        values
        <foreach collection="list" item="item" separator=",">
            (
            #{item.formId,jdbcType=BIGINT},
            #{item.subformNo,jdbcType=VARCHAR},
            #{item.subformName,jdbcType=VARCHAR},
            #{item.subformDescribe,jdbcType=VARCHAR},
            #{item.subformInputType,jdbcType=VARCHAR},
            #{item.subformContent,jdbcType=VARCHAR},
            #{item.subformLength,jdbcType=FLOAT},
            #{item.subformWidth,jdbcType=FLOAT},
            #{item.requiredYn,jdbcType=VARCHAR},
            #{item.dictCode,jdbcType=VARCHAR},
            #{item.tableCode,jdbcType=VARCHAR},
            #{item.fieldCode,jdbcType=VARCHAR},
            #{item.regiState,jdbcType=VARCHAR},
            #{item.createBy,jdbcType=VARCHAR},
            #{item.createTime,jdbcType=TIMESTAMP},
            #{item.updateBy,jdbcType=VARCHAR},
            #{item.updateTime,jdbcType=TIMESTAMP}
            )
        </foreach>
        on duplicate key update form_id = values(form_id), subform_no =
        values(subform_no), subform_name =values(subform_name),
        subform_describe =values(subform_describe),
        subform_input_type =values(subform_input_type),
        required_yn =values(required_yn),
        dict_code =values(dict_code),
        table_code =values(table_code),
        field_code =values(field_code),
        regi_state =values(regi_state),
        create_by =values(create_by),
        create_time =values(create_time),
        update_by = values(update_by),
        update_time =values(update_time)

分析

出现 问题 是加 on duplicate key update 受了影响,

解决

去掉 on duplicate key update代码

ON DUPLICATE key update是根据索引字段是否重复来判断是否执行,如果重复则执行update,否则则执行insert。

优先级主键>唯一索引

当主键重复时则执行update
当主键不重复,唯一索引重复时也执行update
当主键和唯一索引值都不重复才执行insert

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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
发出的红包

打赏作者

勤快的小蚂蚁

奖励下我呗!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值