ssm整合Mybatis之批量操作
- applicationContext-dao.xml中声明一个可执行批量操作的sqlSession
通过构造函数注入方式:将SqlSessionTemplate交予Spring进行管理,方便后面service层中引用
注意:SqlSessionTemplate的executorType属性为BATCH
<!-- 让spring管理sqlsessionfactory 使用mybatis和spring整合包中的 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 数据库连接池 -->
<property name="dataSource" ref="dataSource" />
<!-- 加载mybatis的全局配置文件 -->
<property name="configLocation" value="classpath:mybatis/mybatis-config.xml" />
<!-- 扫描mapper.xml文件 -->
<property name="mapperLocations" value="classpath:mapper/*.xml" />
</bean>
<!-- 执行批量操作的sqlsession -->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
<constructor-arg name="executorType" value="BATCH"/>
</bean>
- service中使用该sqlSession:插入10000条数据测试
这里需要注意@Transactional注解:让spring对该方法进行事务管理
spring如何进行事务管理,这里不做过多描述
@Service
public class DepartmentServiceImpl implements DepartmentService {
private final static Logger logger = LoggerFactory.getLogger(DepartmentServiceImpl.class);
//注入批量操作sqlSession
@Autowired
private SqlSessionTemplate sqlSessionTemplate;
@Transactional
public void batchSave() {
//获取Mapper
DepartmentMapper mapper = sqlSessionTemplate.getMapper(DepartmentMapper.class);
long start = System.currentTimeMillis();
//插入10000条数据测试
for(int i=0; i<10000;i++) {
Department department = new Department();
department.setDeptName(UUID.randomUUID().toString().substring(0, 4));
mapper.saveDepartment(department);
}
long end = System.currentTimeMillis();
logger.info("批量保存用时:"+(end-start));
}
}
- 对应的mapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.li.mapper.DepartmentMapper">
<insert id="saveDepartment" useGeneratedKeys="true" keyProperty="id">
insert into tbl_dept(id,dept_name) values(#{id},#{deptName})
</insert>
</mapper>
- 测试结果:
只对参数进行预编译,最后统一做保存处理