Mybatis批量操作工具类
由于最近公司平台业务的实际需要,为了弥补原本系统中没有批量操作的工具类,以及防止未来可能不引入MyBatis-plus, 于是结合网上的资料,编写了当前的工具类。对这个工具类做一个记录。
package cac.safe.utils;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.function.ToIntBiFunction;
/**
* @Description: Mybatis批量操作工具类
* @param:
* @return
* @version: 1.0
* @Author: AKA皮卡Q
* @Date: 2024/5/15
*/
@Component
@Slf4j
public class MyBatisUtils {
@Autowired
private SqlSessionFactory sqlSessionFactory;
/**
* @param list 需要插入或修改数据库的实体对象集合或列表
* @param mapperClass 用到的mapper的class文件
* @param mapperRToIntBiFunction 写法(ObjectMapper::insert) ObjectMapper是对应的mapper文件,insert是对应的方法名称,指定单条插入或修改或删除方法,必须是单条
*/
public <T, Mapper> void batchOperate(List<T> list, Class<Mapper> mapperClass, ToIntBiFunction<Mapper, T> mapperRToIntBiFunction) {
//切换batch模式
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
try {
Mapper mapper = sqlSession.getMapper(mapperClass);
for (T item : list) {
//调用方法
mapperRToIntBiFunction.applyAsInt(mapper, item);
}
sqlSession.commit();//提交事务
} catch (Exception e) {
log.error("批量操作报错", e);
} finally {
sqlSession.close();
}
}
}
对应的mapper接口中需要编写单条数据操作的方法以及对应xml文件中的处理,返回值好像不能用void,因此这里我统一使用了int作为方法的返回值。
Mapper接口
public int update(@Param("employee") Employee employee);
Mapper.xml文件
<insert id="update">
UPDATE EMPLOYEE_BASIC
SET
EMPLOYEE_ID = #{employee.employeeId},
EMPLOYEE_NAME = #{employee.employeeName}
where
ID = #{employee.id}
</insert>
工具类的使用
@Autowired
private MyBatisUtils myBatisUtils;
// 第一个参数为需要批量新增或修改的实体列表
// 第二个参数为对应需要批量操作的单条方法的mapper接口
// 第三个参数为mapper文件对应的接口方法,例如需要做批量更新的操作,就传入mapper文件的uopdate方法,名字与mapper接口定义的名字相同
myBatisUtils.batchOperate(employeeList, EmployeeMapper.class, EmployeeMapper::update);