要求不用foreach进行插入,做一个适用所有mapper的Batch Insert
Service里面mapper的batch是list类型
@Service(value = "testJobService")
public class TestJobService {
@Autowired
private DAreaMapper dAreaMapper;
public void test1() {
List<DArea> list = new ArrayList<DArea>();
for(int i = 0; i < 10000; i++) {
DArea area = new DArea();
area.setId(i);
area.setName("aa"+i);
area.setParentAreaId(i-1);
area.setLatitude((double)1);
area.setLongitude((double)1);
list.add(area);
}
long startTime = System.currentTimeMillis();
dAreaMapper.batch(list);
long endTime = System.currentTimeMillis();
System.out.println(endTime - startTime);
}
}
做了一个aop进行拦截,将List转变成为List中的泛型进行插入
@Aspect
@Component
public class BatchInsertAspect {
@Autowired
SqlSessionFactory sqlSessionFactory;
@Pointcut("execution(public * com.kg.quartz.mapper.*.*.batch*(..))")
/*@Pointcut("execution(public * com.kg.quartz.controller.HelloController.add*(..))")*/
public void addAdvice(){}
@Bean(name = "baseSqlSessionFactory")
@Primary
@Around("addAdvice()")
public void Interceptor(ProceedingJoinPoint pjp){
System.out.println("---------------加载aop");
SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH);
try {
Signature signature = pjp.getSignature();
Object obj = pjp.getTarget();
MethodSignature methodSignature = (MethodSignature)signature;
Method targetMethod = methodSignature.getMethod();
Object[] args = pjp.getArgs();
int number = 0;
for(Object arg : args) {
String typeName = arg.getClass().getTypeName();
if(typeName.equals("java.util.ArrayList")) {
List genericList = (ArrayList)arg;
for(int i = 0; i < genericList.size(); i++) {
targetMethod.invoke(obj, genericList.get(i));
}
}
if(number%1000 == 0) {
session.commit();
}
}
} catch (Exception e) {
e.printStackTrace();
//没有提交的数据可以回滚
session.rollback();
} finally {
session.close();
}
}
}
但在这个时候有一个问题,mapper层必须要这样写
public void batch(@Param(value="dArea") DArea dArea);
但这个和service层就不匹配了,要如何解决这个问题呢?
@Service(value = "testJobService")
public class TestJobService {
@Autowired
private DAreaMapper dAreaMapper;
public void test1() {
List<DArea> list = new ArrayList<DArea>();
for(int i = 0; i < 10000; i++) {
DArea area = new DArea();
area.setId(i);
area.setName("aa"+i);
area.setParentAreaId(i-1);
area.setLatitude((double)1);
area.setLongitude((double)1);
list.add(area);
}
long startTime = System.currentTimeMillis();
dAreaMapper.batch(list);
long endTime = System.currentTimeMillis();
System.out.println(endTime - startTime);
}
}
做了一个aop进行拦截,将List转变成为List中的泛型进行插入
@Aspect
@Component
public class BatchInsertAspect {
@Autowired
SqlSessionFactory sqlSessionFactory;
@Pointcut("execution(public * com.kg.quartz.mapper.*.*.batch*(..))")
/*@Pointcut("execution(public * com.kg.quartz.controller.HelloController.add*(..))")*/
public void addAdvice(){}
@Bean(name = "baseSqlSessionFactory")
@Primary
@Around("addAdvice()")
public void Interceptor(ProceedingJoinPoint pjp){
System.out.println("---------------加载aop");
SqlSession session = sqlSessionFactory.openSession(ExecutorType.BATCH);
try {
Signature signature = pjp.getSignature();
Object obj = pjp.getTarget();
MethodSignature methodSignature = (MethodSignature)signature;
Method targetMethod = methodSignature.getMethod();
Object[] args = pjp.getArgs();
int number = 0;
for(Object arg : args) {
String typeName = arg.getClass().getTypeName();
if(typeName.equals("java.util.ArrayList")) {
List genericList = (ArrayList)arg;
for(int i = 0; i < genericList.size(); i++) {
targetMethod.invoke(obj, genericList.get(i));
}
}
if(number%1000 == 0) {
session.commit();
}
}
} catch (Exception e) {
e.printStackTrace();
//没有提交的数据可以回滚
session.rollback();
} finally {
session.close();
}
}
}
但在这个时候有一个问题,mapper层必须要这样写
public void batch(@Param(value="dArea") DArea dArea);
但这个和service层就不匹配了,要如何解决这个问题呢?
...全文
相关推荐
mybatis-plus_batch_insert:mybatis_plus添加批量插入
mybatis-plus_batch_insert:mybatis_plus添加批量插入
MyBatis动态SQL foreach标签实现批量插入的方法示例
主要介绍了MyBatis动态SQL foreach标签实现批量插入的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
spring中使用mybatis实现批量插入的示例代码
主要介绍了spring中使用mybatis实现批量插入的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
mybatis中批量插入的两种方式(高效插入)
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。这篇文章主要介绍了mybatis中批量插入的两种方式(高效插入)的相关资料,非常不错,具有参考借鉴价值,感兴趣的朋友一起看看吧
基于mybatis batch实现批量提交大量数据
主要介绍了基于mybatis batch实现批量提交大量数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下


Web 开发

