当前的tkmybatis插件,默认的批量插入功能,是需要自动生成主键的(tk.mybatis.mapper.common.special.InsertListMapper),不能通过调用者自己指派主键的形式。经过分析和改造后,在原来InsertListMapper的形式上,额外扩展了允许自己指派主键的批量插入。代码如下:

第一步:创建InsertListExtMapper接口,注意接口上要增加@RegisterMapper注解

import org.apache.ibatis.annotations.InsertProvider;
import org.apache.ibatis.annotations.Options;
import org.apache.poi.ss.formula.functions.T;
import tk.mybatis.mapper.provider.SpecialProvider;import java.util.List;@tk.mybatis.mapper.annotation.RegisterMapper
public interface InsertListExtMapper<T> {/*** 批量插入全部字段,包括主键* @param recordList 数据列表* @return*/@InsertProvider(type = SpecialSqlExtProvider.class, method = "dynamicSQL")int insertListAllFied(List<? extends T> recordList);
}

第二步:创建SpecialSqlExtProvider类,用于提供动态批量语句的生成


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.MapperTemplate;
import tk.mybatis.mapper.mapperhelper.SqlHelper;import java.util.Set;/*** 专用sql扩展提供者。扩展tk.mybatis类。*/
public class SpecialSqlExtProvider extends MapperTemplate {public SpecialSqlExtProvider(Class<?> mapperClass, MapperHelper mapperHelper) {super(mapperClass, mapperHelper);}/*** 批量插入所有字段,包括主键。** @param ms*/public String insertListAllFied(MappedStatement ms) {final Class<?> entityClass = getEntityClass(ms);//开始拼sqlStringBuilder sql = new StringBuilder();sql.append("<bind name=\"listNotEmptyCheck\" value=\"@tk.mybatis.mapper.util.OGNL@notEmptyCollectionCheck(list, '" + ms.getId() + " 方法参数为空')\"/>");sql.append(SqlHelper.insertIntoTable(entityClass, tableName(entityClass)));sql.append(SqlHelper.insertColumns(entityClass, false, false, false));sql.append(" VALUES ");sql.append("<foreach collection=\"list\" item=\"record\" separator=\",\" >");sql.append("<trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">");//获取全部列Set<EntityColumn> columnList = EntityHelper.getColumns(entityClass);for (EntityColumn column : columnList) {if (column.isInsertable()) {sql.append(column.getColumnHolder("record") + ",");}}sql.append("</trim>");sql.append("</foreach>");// 反射把MappedStatement中的设置主键名EntityHelper.setKeyProperties(EntityHelper.getPKColumns(entityClass), ms);return sql.toString();}
}

第三步:将需要使用的Mapper接口继承InsertListExtMapper接口:

import tk.mybatis.mapper.common.BaseMapper;
import tk.mybatis.mapper.common.ConditionMapper;
import tk.mybatis.mapper.common.IdsMapper;
import tk.mybatis.mapper.common.special.InsertListMapper;/*** Description: 定制版MyBatis Mapper插件接口,如需其他接口参考官方文档自行添加*/
public interface MyMapper<T> extends BaseMapper<T>, ConditionMapper<T>, IdsMapper<T>, InsertListMapper<T>, InsertListExtMapper<T> {}

然后启动,运行即可。

tk.mybatis的批量插入扩展相关推荐

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

    tk.mybatis没有带批量更新的功能,批量更新却是经常使用的,所以需要自己实现. 批量更新网上主要有2种方式:case when方式.foreach方式 但是foreachzhe这种方式效率非常低 ...

  2. mysql基础----mybatis的批量插入(一)

    这里面记录一下使用mybatis处理mysql的批量插入的问题,测试有可能不准.只愿世间风景千般万般熙攘过后,字里行间,人我两忘,相对无言. mybatis的批量插入 我们的测试主体类是springb ...

  3. java应用程序接口批量访问_spring中使用mybatis实现批量插入的示例代码

    有3种实现方式:foreach,spring事务,以及ExecutorType.BATCH. 1. foreach方式 这种方式实际是对SQL语句进行拼接,生成一个长长的SQL,对很多变量进行绑定.如 ...

  4. springmvc+mybatis+ajax 批量插入数据

    2019独角兽企业重金招聘Python工程师标准>>> 批量插入.AJAX发起请求,核心代码如下: var mids = new Array(); for (var i=0; i&l ...

  5. Mybatis foreach 批量插入

    在mybatis中可以使用foreach标签做批量插入和更新操作,以批量插入为例: <insert id="insertMsg" parameterType="xz ...

  6. Java通过Mybatis实现批量插入数据到Oracle中

    最近项目中遇到一个问题:导入数据到后台并将数据插入到数据库中,导入的数据量有上万条数据,考虑采用批量插入数据的方式: 结合网上资料,写了个小demo,文章末尾附上demo下载地址 1.新建项目:项目目 ...

  7. mybatis+oracle批量插入报不符合协议和sql未正确结束

    在Java中循环save,需要加useGeneratedKeys="false",否则报错不符合协议 mybatis批量插入,也需要在insert里加入 useGeneratedK ...

  8. Mybatis的批量插入数据库的两种方法及代码自动生成工具的使用方法

    文章目录 常规批量插入.(通过foreach,生成很长的SQL) ExecutorType.BATCH方式执行批量操作 在这里简单介绍一下,自动生成工具的使用方法 常规批量插入.(通过foreach, ...

  9. Mybatis Mysql 批量插入返回id

    1. 目标: 使用Mybatis 批量插入数据返回自增的id 2. 具体实现 注意: MyBatis版本3.3.1或者以上 <insert id="save" useGene ...

最新文章

  1. log4j每天,每小时产生一日志文件
  2. 【CyberSecurityLearning 71】DC系列之DC-2渗透测试(WordPress)
  3. Faster R-CNN论文详解
  4. Unable to install breakpoint in Modify compiler options to generate line number attributes
  5. 一句 Task.Result 就死锁, 这代码还怎么写?
  6. 安卓教程:提取APK程序里图片资源的方法
  7. 设计模式09_代理模式
  8. c语言算除法并转百分比,【转】C语言除法运算符“/”和求余运算符“%”
  9. php octet stream,为什么上传图片时,type 显示application/octet-stream 呢? 原
  10. python在遥感中的应用_Python在遥感中的应用——导言
  11. 异次元发卡系统源码荔枝发卡V3.0
  12. 关于地方美食的HTML网页设计——地方美食介绍网站 HTML顺德美食介绍 html网页制作代码大全
  13. 【连载】大学物理笔记——内力做功
  14. 开关电源雷击浪涌整改_开关电源之雷击浪涌发生器大解剖
  15. NOI2020D2T2超现实树题解
  16. 计量经济学-期末复习
  17. kali安装所有工具
  18. CocosCreator 事件阻挡和事件穿透
  19. lib库实现UI定制化
  20. 人工智能与大数据就业前景_电子信息(人工智能与大数据方向)专业介绍

热门文章

  1. Jodd-Java的瑞士军刀 demo
  2. “购物狂欢节”如何应对“羊毛党”
  3. 新浪云php与微信,开发微信公众平台--新建新浪云sae部署服务器
  4. Centos7 安装RVM
  5. 设备管理的方法与思路-设备管理软件系统-璞华大数据
  6. XIB总结(代码加载xib或xib拖xib)
  7. 网站日访问量,在线用户数,等如何统计?
  8. 华为ensp 启动ar设备失败,错误代码 :40
  9. Oracle 计算两日期间隔月数
  10. div层调整zindex属性无效原因分析及解决方法