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

tk.mybatis没有带批量更新的功能,批量更新却是经常使用的,所以本文介绍了一下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 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(); } }

统一定义批量操作接口

 /** * 批量操作接口 * * @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); }); 

到此这篇关于详解扩展tk.mybatis的批量更新的功能的文章就介绍到这了,更多相关tk.mybatis 批量更新内容请搜索0133技术站以前的文章或继续浏览下面的相关文章希望大家以后多多支持0133技术站!

以上就是详解扩展tk.mybatis的批量更新的功能的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » Java