mybatis注解实现对象批量更改

                 mybatis注解实现对象批量更改

一、介绍

当有多个对象需要进行更改时,批量修改对象集合List

二、代码

@Update("<script>"
			+ "<foreach collection='listUserAnswerRecord' item='item' open='' close=''  separator=';'> "
			+ " update t_qb_record_201910"
			+ " set answered = 0, progress = 1, answer_sheet = null, gmt_update = #{item.gmtUpdate}"
			+ " <where>"
			+ "<choose>"
			+ "<when test='item.unionid !=null'> unionid=#{item.unionid}</when>"
			+ "<otherwise> openid= #{item.openid} </otherwise>"
			+ "</choose>"
			+ " and goods_id = #{item.goodsId} and charpter_id = #{item.charpterId} and type = #{item.type}"
			+ "</where>"
			+ "</foreach>"
			+ "</script>")
	Integer deleteUserAnswerSheet(@Param("listUserAnswerRecord") List<UserAnswerRecordNew> listUserAnswerRecord);

 

### 使用 MyBatis 实现批量数据保存 在实际项目开发中,批量操作可以显著提高数据库交互效率。对于 MyBatis 而言,可以通过配置 `foreach` 标签来实现批量插入功能[^1]。 #### 配置 XML 映射文件中的 SQL 语句 为了执行批量插入,在映射文件中定义如下形式的 SQL 描述: ```xml <insert id="batchInsert" parameterType="java.util.List"> INSERT INTO table_name (column_1, column_2,...) VALUES <foreach collection="list" item="item" separator=","> (#{item.column1}, #{item.column2}...) </foreach> </insert> ``` 上述代码片段展示了如何利用 `<foreach>` 动态标签构建多条记录的一次性插入命令。其中 `collection` 属性指定了传入参数集合名称;`separator` 定义每组值之间的分隔符;而 `item` 则表示当前迭代项变量名。 #### Java 接口方法声明 对应的 Mapper 接口中应有相应签名的方法用于接收待处理的数据列表并调用上面所写的 insert 语句: ```java public interface UserMapper { void batchInsert(@Param("list") List<User> userList); } ``` 这里假设有一个名为 `User` 的实体类作为表结构模型,并通过 `@Param` 注解指定输入参数的名字以便于在 XML 中引用。 #### 批量提交事务控制 值得注意的是,默认情况下每次 DML 操作都会触发一次 commit 提交动作。当进行大量数据写入时可能会造成性能瓶颈甚至内存溢出等问题。因此建议开启手动管理事务模式,在适当时候统一提交更改以减少 I/O 开销。 ```java @Autowired private PlatformTransactionManager transactionManager; @Transactional(propagation = Propagation.REQUIRED) public void saveBatch(List<T> list){ DefaultTransactionDefinition def = new DefaultTransactionDefinition(); TransactionStatus status = transactionManager.getTransaction(def); try{ mapper.batchInsert(list); // 假设这是之前定义好的接口实例化对象 transactionManager.commit(status); }catch(Exception e){ transactionManager.rollback(status); throw e; } } ``` 这段逻辑确保了只有在整个批处理过程顺利完成之后才会真正更新到持久层存储介质上,如果中途发生异常则回滚所有变更保持一致性[^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值