1.Mybatis
MyBatis是第一个支持自定义SQL、存储过程和高级映射的类持久框架。
所需依赖
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- 数据驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
层次结构图
组件
SqlSession: 会话,执行命令、获取映射、管理事务。
Executor:执行器,负责维护生成SQL语句、查询缓存。
StatementHandler:负责对JDBC statement 的操作,如设置参数、将Statement结果集转换成List集合。
ParameterHandler:负责将用户传入参数转换为JDBC Statement所需的参数。
ResultSetHandler: 负责将JDBC返回的ResultSet结果集对象转换成List类型的集合
TypeHandler: 用于Java类型和jdbc类型之间的转换
MappedStatement: 动态SQL的封装
SqlSource:表示从XML文件或注释读取的映射语句的内容,它创建将从用户接收的输入参数传递给数据库的SQL。
Configuration: MyBatis所有的配置信息都维持在Configuration对象之中
2.Executor
普通Executor分类:
ExecutorType.SIMPLE: 这个执行器类型不做特殊的事情。它为每个语句的执行创建一个新的预处理语句。(默认)
ExecutorType.REUSE: 这个执行器类型会复用预处理语句。
ExecutorType.BATCH: 这个执行器会批量执行所有更新语句。
批量插入例子
@Autowired
private SqlSessionTemplate sqlSessionTemplate;
public void saveBatch(List<Entity> insertList) {
// 当前会话开启批量操作
SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH,false);
// 从会话中获取mapper
CustomMapper mapper = session.getMapper(CustomMapper.class);
try {
for (int i = 0; i < insertList.size(); i++) {
mapper.insert(insertList.get(i));
// 一千条提交一次数据(如果超过一千条,则回滚事务不统一)
if ((i % 1000 == 999) || (i == insertList.size() - 1)) {
session.commit(); // 提交数据
session.clearCache(); //清理缓存
}
}
log.info("saveBatch end >>>>>>>>>>:" + insertList.size());
} catch (Exception e) {
log.error("saveBatch fail >>>>>>>>>>:" + e);
session.rollback(); //异常回滚
} finally {
session.close(); // 关闭session
}
}
参考文章:
mybatis SqlSession,SqlSessionFactory及spring SqlSessionTemplate
mybatis执行批量操作
MyBatis(十):Mybatis 几种批量操作的对比
MyBatis架构图