mybatis batch 批量操作 方法封装
确保spring可以扫描到
@Component
public class MybatisBatchMethod {
@Autowired
SqlSessionTemplate sqlSessionTemplate;
/**
*
* @param mapperClass 进行增、改、删操作的mapper类
* @param list List批量数据
* @param listItem List中的对象类型
* @param methodName 调用的方法名
* @param <T1> mapper类泛型
* @param <T2> 操作对象的类泛型
* @throws NoSuchMethodException
* @throws InvocationTargetException
* @throws IllegalAccessException
*
*/
public <T1,T2> void mybatisBatch(Class<T1> mapperClass, List<T2> list, Class<T2> listItem, String methodName) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
//关闭session的自动提交
SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);
//利用反射生成mapper对象
T1 mapper = session.getMapper(mapperClass);
//获取mapper对象的类
// Class<?> mapperClass = mapperClassName.getClass();
//获取mapper对象的方法
Method mapperClassDeclaredMethod = mapperClass.getDeclaredMethod(methodName, listItem);
try {
int i=0;
for (T2 item : list) {
//对mapper对象操作
mapperClassDeclaredMethod.invoke(mapper,item);
if (i % 1000 == 0 || i == list.size()-1) {
//手动每1000个一提交,提交后无法回滚
session.commit();
session.clearCache();//注意,如果没有这个动作,可能会导致内存崩溃。
}
i++;
}
}catch (Exception e) {
//没有提交的数据可以回滚
session.rollback();
System.out.println(e);
throw e;
} finally{
//关闭连接
session.close();
}
}
}
调用举例
@Autowired
private EqparameterMapper eqparametermapper;
@Autowired
private MybatisBatchMethod mybatisBatchMethod;
public void importEqparameter() throws Exception {
//业务代码删除
List<EqparameterEntity> eqList = new ArrayList<>();
//向list中插入数据
//批量插入
mybatisBatchMethod.mybatisBatch(EqparameterMapper.class,eqList,EqparameterEntity.class,"insertEqparameter");
//参数1 要操作的mapper.class
//2 操作的list
//3 List<T> 的泛型
//4 操作mapper的方法名
}
参数3想直接从List中取的,但是泛型被擦除了取不到,如果取List元素的第一个类型又得验空,所以直接传了