MyBatis和Hibernate的区别
MyBatis是一个半自动映射的框架,配置java对象与sql语句执行结果的对应关系,多表关联配置简单
Hibernate是一个全表映射的框架,配置java对象与数据库表的对应关系,多表关联关系配置复杂
MyBatis原理
- 读取MyBatis配置文件:mybatis-config.xml为MyBatis的全局配置文件,配置了MyBatis的运行环境等信息,例如数据库的信息
- 加载映射文件:即SQL映射文件,配置了操作数据库的SQL语句
- 构造会话工厂:由MyBatis的环境配置信息构建会话工厂SqlSessionFactory
- 创建会话对象:由会话工厂创建SqlSession对象,改对象中包含了执行SQL语句的所有方法
- Executor执行器:操作数据库
- MappedStatement对象:该参数是对映射信息的封装
- 输入参数映射:输入参数可以是Map,List集合类型,也可以是基本数据类型和POJO类
- 输出参数映射:输出结果可以是Map,List集合类型,也可以是基本数据类型和POJO类
MyBatis的缓存
- 一级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Session flush或close后,Session中的所有Cache都会清空
- 二级缓存:默认也是采用PapetualCache,HashMap存储,默认不打开二级缓存
对于缓存数据的更新,当一个作用域进行了CUD之后,默认改作用域下所有select中的缓存都将被clear
MyBatis进行批量操作
使用foreach操作
使用ExectorType.BATC批处理执行
batch模式重复使用预处理的语句,并且批量执行所有更新语句,不需要反反复复的获取Connection和释放Connection而耗费大量的时间,效率低下
但是在insert操作时,在事务提交之前,是没有办法获取到自增id的,在某些情形下不符合业务需求