怎么才能实现真正的批量插入呢?
这里是mybatisplus官方的演示仓库,可以先去了解一下。
本文基于mybatis-plus3.5.0进行讲解,不同的版本写法稍微有点不同。
com.baomidou mybatis-plus-boot-starter 3.5.0 1.新建一个InsertListMapper文件,提供insertList方法,后续需要用到批量插入的dao继承该Mapper即可拥有批量插入接口。
import org.apache.ibatis.annotations.Param; import java.util.List; /** * 通用Mapper接口,特殊方法,批量插入,支持批量插入的数据库都可以使用,例如mysql,h2等 * * @param 不能为空 * @author */ public interface InsertListMapper { /** * 批量插入,支持批量插入的数据库可以使用,例如MySQL,H2等 * * 注意: * 1.若实体类中设置了@TableId注解,则需要设置value值 如:@TableId(value = "id") * 2.若建表语句中设置了default, 需要在插入时手动设置默认值,否则存储的是null。 * 如:delete_flag tinyint default 0 comment '删除标志 0-未删除 1-已删除',这种需要在insert的时候设置实体类改字段值。setDeleteFlag(0) *
* * @param recordList * @return */ int insertList(@Param("list") List recordList); }
import com.baomidou.mybatisplus.core.injector.AbstractMethod; import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; import com.baomidou.mybatisplus.core.metadata.TableInfo; import org.springframework.stereotype.Component; import java.util.List; /** * 添加Sql注入方法,支持空字段更新 */ @Component public class CustomerSqlInjector extends DefaultSqlInjector { @Override public List getMethodList(Class> mapperClass, TableInfo tableInfo){ List methodList=super.getMethodList(mapperClass, tableInfo); //注册自定义方法 //注意:InsertList中的name需要与xxxMapper中的方法名一致,即insertList methodList.add(new InsertList("insertList")); return methodList; } } 关键的一句在于methodList.add(new InsertList("insertList"));,意为注册一个新的方法叫insertList,具体实现在InsertList类。
import com.baomidou.mybatisplus.core.injector.AbstractMethod; import com.baomidou.mybatisplus.core.metadata.TableInfo; import org.apache.ibatis.executor.keygen.KeyGenerator; import org.apache.ibatis.executor.keygen.NoKeyGenerator; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.mapping.SqlSource; import java.util.Collections; public class InsertList extends AbstractMethod { public InsertList(String name) { super(name); } @Override public MappedStatement injectMappedStatement(Class> mapperClass, Class> modelClass, TableInfo tableInfo) { KeyGenerator keyGenerator = new NoKeyGenerator(); SqlSource sqlSource = languageDriver.createSqlSource(configuration, getBatchInsertSql(tableInfo,modelClass), Collections.class); return this.addInsertMappedStatement(mapperClass,modelClass,"insertList",sqlSource,keyGenerator,null,null); } private String getBatchInsertSql(TableInfo tableInfo, Class> modelClass){ String batchInsertSql=""; //要插入的字段 即insert into table(要插入的字段) values StringBuilder insertColumnSql=new StringBuilder(); insertColumnSql.append(tableInfo.getKeyColumn()).append(","); StringBuilder valueSql=new StringBuilder(); valueSql.append("\n"); valueSql.append("#{item."+tableInfo.getKeyProperty()+"},"); tableInfo.getFieldList().forEach(x->{ insertColumnSql.append(x.getColumn()).append(","); valueSql.append("#{item."+x.getProperty()+"},"); }); insertColumnSql.delete(insertColumnSql.length()-1,insertColumnSql.length()); valueSql.delete(valueSql.length()-1,valueSql.length()); valueSql.append(" "); return String.format(batchInsertSql,tableInfo.getTableName(),insertColumnSql,valueSql); } } import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.demo.common.mapper.InsertListMapper; import com.demo.entity.User; /** * @Entity generator.domain.User */ public interface UserMapper extends BaseMapper, InsertListMapper { } 以上代码全都放在gitee仓库,详情见:
代码仓库地址
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.demo.mapper.User1Mapper.insertList at org.apache.ibatis.binding.MapperMethod$SqlCommand.(MapperMethod.java:235) at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.(MybatisMapperMethod.java:50) at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.lambda$cachedInvoker$0(MybatisMapperProxy.java:111) at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660) at com.baomidou.mybatisplus.core.toolkit.CollectionUtils.computeIfAbsent(CollectionUtils.java:115) at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.cachedInvoker(MybatisMapperProxy.java:98) at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) at com.sun.proxy.$Proxy70.insertList(Unknown Source) at com.demo.User1Test.test1(User1Test.java:50) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 解决方法: :https://blog.csdn.net/weixin_49114503/article/details/140645048
参考文章:https://blog.csdn.net/m0_51390969/article/details/134730527
https://blog.csdn.net/m0_63297646/article/details/131843517