mybatis batch 批量操作 方法封装

本文介绍了如何在MyBatis中进行批量操作的方法封装,包括确保Spring扫描和调用示例。在处理批量操作时,由于泛型擦除导致无法直接从List获取类型,因此选择了特定的参数传递方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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元素的第一个类型又得验空,所以直接传了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值