背景:项目中会有很多地方用到批量插入,如果数据量大的话需要通过分批的形式来批量插入,但师不同的表会调用不同的dao的方法,而分批插入的代码又是相似的,每次都要写一边这个相似的代码,势必会造成代码的冗余,所以需要把分批插入的部分封装成一个共同的方法来调用,我想到的是通过反射机制,代码如下。
1.interface
public interface CommonService {
/**
* 分批批量插入
*
* @param obj 实例对象
* @param methodName 方法名
* @param list 方法的参数
* @return
*/
<T> int batchInsert(Object obj, String methodName, List<T> list);
}
2.实现class
@Service("commonService")
public class CommonServiceImpl implements CommonService {
@Override
public <T> int batchInsert(Object obj, String methodName, List<T> list) {
if (list == null || list.size() == 0) {
return 0;
}
try {
// 获取类
Class<? extends Object> clazz = obj.getClass();
// 获取方法
Method method = clazz.getDeclaredMethod(methodName, List.class);
// 计数器
int count = 1;
// 临时List
List<T> tempList = new ArrayList<T>();
for (T o : list) {
tempList.add(o);
if (count == 100) {
// 批量插入
method.invoke(obj, list);
// 重新计数
count = 1;
// 清空list,重新塞数据
tempList.clear();
} else {
count++;
}
}
// 扫尾
if (count > 1) {
// 批量插入
method.invoke(obj, list);
}
} catch (Exception e) {
e.printStackTrace();
}
return list.size();
}
}
3.调用
commonService.batchInsert(testDao, "batchInsert", testList);