详解扩展tk.mybatis的批量更新的功能

网友投稿 1701 2022-09-11


详解扩展tk.mybatis的批量更新的功能

tk.mybatis没有带批量更新的功能,批量更新却是经常使用的,所以需要自己实现。

批量更新网上主要有2种方式:case when方式、foreach方式

但是foreachzhe这种方式效率非常低下,不知道为何那多么帖子在流传,请看我另一个文章。

扩展tk.mybatis的批量更新,采用case when方式,源码干货如下:

首先定义下mapper接口

import org.apache.ibatis.annotations.UpdateProvider;

import java.util.List;

/**

* 批量update

*

* @param 不能为空

*/

@tk.mybatis.mapper.annotation.RegisterMapper

public interface UpdateBatchByPrimaryKeySelectiveMapper {

/**

* 根据Example条件批量更新实体`record`包含的不是null的属性值

*

* @return

*/

@UpdateProvider(type = BatchExampleProvider.class, method = "dynamicSQL")

int updateBatchByPrimaryKeySelective(List extends T> recordList);

}

实现UpdatePriUpdateProvider,使用case when方式拼写mapper动态语句,必须id为主键

import org.apache.ibatis.mapping.MappedStatement;

import tk.mybatis.mapper.entity.EntityColumn;

import tk.mybatis.mapper.mapperhelper.EntityHelper;

import tk.mybatis.mapper.mapperhelper.MapperHelper;

import tk.mybatis.mapper.mapperhelper.SqlHelper;

import tk.mybatis.mapper.provider.ExampleProvider;

import java.util.Set;

/**

* 批量更新的SqlProvider

* @author sunchangtan

*/

public class BatchExampleProvider extends ExampleProvider {

public BatchExampleProvider(Class> mapperClass, MapperHelper mapperHelper) {

super(mapperClass, mapperHelper);

}

/**

* 拼update sql, 使用case when方式,id为主键

*

* @param ms

* @return

*/

public String updateBatchByPrimaryKeySelective(MappedStatement ms) {

final Class> entityClass = getEntityClass(ms);

//开始拼sql

StringBuilder sql = new StringBuilder();

sql.append(SqlHelper.updateTable(entityClass, tableName(entityClass)));

sql.append("");

//获取全部列

Set columnList = EntityHelper.getColumns(entityClass);

for (EntityColumn column : columnList) {

if (!column.isId() && column.isUpdatable()) {

sql.append(" ");

sql.append(" ");

sql.append(" ");

sql.append(" when id=#{i.id} then #{i."+column.getEntityField().getName()+"}");

sql.append(" ");

sql.append(" ");

sql.append(" ");

}

}

sql.append("");

sql.append("WHERE");

sql.append(" id IN ");

sql.append("");

sql.append("");

sql.append("#{i.id}");

sql.append("");

sql.append("");

return sql.toString();

}

}

统一定义批量操作接口

http://

/**

* 批量操作接口

*

* @param

* @author sunchangtan

*/

@tk.mybatis.mapper.annotation.RegisterMapper

public interface BatchMapper extends

UpdateBatchByPrimaryKeySelectiveMapper {

}

使用例子:

List> splitList = ListUtils.splitList(list, 100);

splitList.forEach(data -> {

batchTestMapper.updateBatchByPrimaryKeySelective(data);

});


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:小米路由器AX3600和Redmi路由器AX5使用问题讨论(小米ax3600和小米路由器mesh组网)
下一篇:nofollow权重说明 nofollow是否传递权重?(nofollow标签属性通常有两种使用方法)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~