mybatis批量插入问题记录

基于DB2数据库的批量插入

  • mybatis单次执行批量插入(10万条)记录报错“该语句过长或过于复杂”:将一次插入改为多次批量插入,在Java代码中分割list。
org.springframework.dao.DataAccessResourceFailureException: 
### Error updating database.  
Cause: com.ibm.db2.jcc.am.SqlException: 
[jcc][t4][10531][14103][4.25.13] 该语句过长或过于复杂。
当前 SQL 语句大小为 3,910,508。 ERRORCODE=-101, SQLSTATE=54001
  • 10万条记录多次批量插入报错“DB2数据库的事务日志已满”:加大日志文件大小,增加日志文件个数,增加辅助日志文件个数
DB2数据库的事务日志已满。. SQLCODE=-964, SQLSTATE=57011, DRIVER=3.63.108

参考链接:DB2数据库的事务日志已满。. SQLCODE=-964, SQLSTATE=57011, DRIVER=3.63.108

  • 现象:执行的每条SQL参数有20多个,大于1500左右就会报错:参数无效:参数索引超出范围。 ERRORCODE=-4461, SQLSTATE=42815
    根本原因是由于mybatis将所有记录合并成一条SQL传入,
    超过了DB2的LANGUAGE SQL的过程中的最大参数数:32767
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException:
 Could not set parameters for mapping: ParameterMapping{property='__frch_dto_2718.recBank', mode=IN, javaType=class java.lang.String, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. 
 Cause: org.apache.ibatis.type.TypeException: Error setting null for parameter #24465 with JdbcType OTHER . 
 Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. 
 Cause: com.ibm.db2.jcc.am.SqlSyntaxErrorException: [jcc][10145][10844][4.25.13] 参数 24465 无效:参数索引超出范围。 ERRORCODE=-4461, SQLSTATE=42815
  • mybatis进行批量插入并返回主键
<insert id="insertBatch_Card" useGeneratedKeys="true" keyProperty="busiId">
    INSERT INTO HD_CARD (cardNo, password, orgNo, status, operDate) VALUES
    <foreach collection ="list" item="dto" separator =",">
        (#{dto.cardNo}, #{dto.password}, #{dto.orgNo}, #{dto.status}, #{dto.operDate})
    </foreach >
</insert>
  • mybatis执行的返回值
    update、insert、delete返回值默认是int,也可以改为boolean,如果受影响记录数大于0则为true;select中也可以指定返回一条或者多条。
  • 当修改后的数据和原数据一致时,mysql可以设置不同的参数来判断是否执行修改操作。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Mybatis提供了批量插入的功能,可以大大提高插入数据的效率。 首先,在Mapper.xml文件中,需要定义一个插入语句,例如: ``` <insert id="batchInsert" parameterType="java.util.List"> INSERT INTO table_name (column1, column2, ...) VALUES <foreach collection="list" item="item" separator=","> (#{item.column1}, #{item.column2}, ...) </foreach> </insert> ``` 其中,list是传入的参数,item是list中的每个元素,separator表示每个元素之间的分隔符。 接着,在Java代码中,可以通过SqlSession的batch方法来批量插入数据,例如: ``` List<MyObject> list = new ArrayList<MyObject>(); // 添加数据到list中 ... SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH); MyMapper myMapper = sqlSession.getMapper(MyMapper.class); myMapper.batchInsert(list); sqlSession.commit(); sqlSession.close(); ``` 其中,MyObject是要插入的数据对象,MyMapper是Mapper接口,batchInsert是Mapper接口中定义的方法。需要注意的是,SqlSession要使用ExecutorType.BATCH模式,才能实现批量插入的效果。最后,需要手动提交事务和关闭SqlSession。 这样,就可以使用Mybatis进行批量插入了。 ### 回答2: MyBatis提供了批量插入的方法来优化插入大量数据的性能。以下是使用MyBatis进行批量插入的步骤: 1. 首先,在MyBatis的映射文件中定义一个批量插入的SQL语句。例如: ```xml <insert id="insertBatch" parameterType="java.util.List"> INSERT INTO my_table (column1, column2) VALUES <foreach collection="list" item="item" separator=","> (#{item.column1}, #{item.column2}) </foreach> </insert> ``` 其中,`list`是一个Java集合,包含了要插入的数据。 2. 在Java代码中,调用Mapper接口的批量插入方法。例如: ```java List<MyObject> objects = new ArrayList<>(); // 添加要插入的数据到objects集合中 mapper.insertBatch(objects); ``` 其中,`MyObject`是一个Java对象,对应插入的数据表。 3. 在配置文件中添加批量插入的设置。例如: ```xml <settings> <setting name="jdbc.batch.size" value="100"/> </settings> ``` 上述设置中的`jdbc.batch.size`表示每次批量插入记录数,可以根据实际情况进行调整。 通过以上步骤,我们可以使用MyBatis批量插入来提高插入大量数据的效率。在内部,MyBatis会将批量插入的SQL语句优化成一条带有多个参数的SQL语句,并使用JDBC的`PreparedStatement`对象来执行批量插入操作。这样可以减少与数据库的交互次数,提高性能。 ### 回答3: Mybatis批量插入是指在一次数据库操作中,同时插入多条数据。通过批量插入,可以有效地提高数据库的写入效率,减少数据库操作的次数。 在Mybatis中,我们可以使用foreach标签来实现批量插入。首先,我们需要准备一个List或数组来存储需要插入的数据,然后通过foreach标签将数据逐条插入。 具体步骤如下: 1. 在Mapper.xml文件中,编写插入语句,如INSERT INTO table_name(column1, column2...) VALUES(#{item.property1}, #{item.property2}...)。 2. 在插入语句的前面使用foreach标签,并设置collection属性为需要插入的数据集合的名称,item属性为集合元素的别名,如<foreach collection="list" item="item">。 3. 在foreach标签中,编写需要插入的数据的属性值,如#{item.property1},#{item.property2}等。 4. 在Java代码中,创建一个包含需要插入数据的List或数组。 5. 调用Mybatis的插入方法,将数据集合作为参数传入。 通过以上步骤,我们就可以实现Mybatis批量插入功能了。需要注意的是,在插入大量数据时,要根据数据库和服务器的性能,合理设置批量插入的大小,以免出现内存溢出等问题。 总之,Mybatis批量插入是一种高效的数据库写入方式,能够帮助我们快速插入大量数据,提高系统的性能和效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值