MyBatis
JPA:时ORM规范,不是ORM产品,面向JPA编程,就可以在各种ORM框架之间切换
Hibernate:Jboss持久层解决方案
MyBatis:不支持纯粹的面向对象操作,允许开发人员直接编写SQL语句,更加灵活
MyBatis进行持久化操作步骤:
1.开发持久化类PO和编写持久化操作的Mapper.xml,在xml中定义要执行的SQL语句
2.获取SqlSessionFactory
3.获取SqlSession
4.用面向对象的方式操作数据库
5.关闭事务,关闭SqlSession
注意:
每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心,其也是线程安全的,SqlSessionFactory一旦被创建,在运行期间不要重复创建,应该使用单例模式
可以用SqlSession实例来直接执行已映射的SQL语句,每个线程都应该有他自己的SqlSession实例,SqlSession实例不能被共享,也是线程不安全的,绝对不能讲SqlSession实现的引用放在类的静态字段甚至是实例字段中,也不能方法任何类型的管理范围中
初始化过程:
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); //读取mybatis-config.xml文件
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//初始化mybatis,创建SqlSessionFactory类的实例
SqlSession session = sqlSessionFactory.openSession();//创建Session实例
初始化步骤:
1.调用SqlSessionFactoryBuilder对象的build(inputStream)方法
2.SqlSessionFactoryBuilder根据输入流inputStream等信息创建XMLConfigBuilder对象
3.SqlSessionFactoryBuilder调用XMLConfigBuilder对象的parse()方法
4.XMLConfigBuilder对象解析XML配置文件返回Configuration对象
5.SqlSessionFactoryBuilder根据Configuration对象创建一个DefaultSessoinFactory对象
6.SqlSessionFactoryBuilder返回DefaultSessionFactory对象给客户端,供客户端使用
推荐使用mapper接口的代理对象访问mybatis:
mapper接口的类名必须和xml文件中对应的mapper的namespace一致,方法名和参数也必须与<select.../>标签中的一致
public interface PersonMapper{Persoin selectPersionById(Integer id);}
通过SqlSession实例的getMapper(PersoinMapper.class)或者PersionMapper实例进行数据库操作
关联:
1对1:<association ... />
1对多和多对多:<collection ... />
动态SQL:
常用的动态SQL元素:if, choose(when、otherwise),where,set,foreach,bind
<if test="boolean语句">sql语句</if>
MyBatis事务管理
两种形式:
使用JDBC的事务管理机制,即利用java.sql.Connection对象完成对事务的提交、回滚和关闭等操作
使用MANGED的事务管理机制,MyBatis不会去实现事务管理,而是让容器如WebLogic、JBOSS等来实现对事务的管理
通过<transactionMannager type = "JDBC/MANAGED"/>来配置
通过TransactionFactory事务工厂来创建事务
MyBatis的缓存机制:
提供查询缓存,分为一级缓存-SqlSession级别的缓存,二级缓存-mapper级别的缓存,二级缓存是多个SqlSession共享的
一级缓存(SqlSession级别):
在SqlSession对象中有一个HashMap用于存储缓存数据,不同SqlSession之间的缓存区域(HashMap)互相不影响
作用于是SqlSession范围,在同一个SqlSession中执行两次相同的sql语句时,第一次执行完毕会将数据库中查询的数据写入缓存(内存),第二次会从缓存中获取
如果执行了DML操作(insert,update,delete),并提交到数据库,MyBatis会晴空一级缓存
一级缓存默认开启,不需配置
二级缓存(mapper级别):
多个SqlSession使用同一个Mapper的sql语句去操作数据库,得到的数据会存在二级缓存区域,也是使用HashMap进行数据存储。
相比一级缓存SqlSession,二级缓存范围更大,多个SqlSession可以共用二级缓存,是跨SqlSession的
二级缓存默认未开启,需要在setting全局参数中配置
映射的java对象必须实现序列化和反序列化接口
eviction:回收策略,有4个:
LRU:最近最少使用策略,移除最长时间不被使用的对象
FIFO:先进先出策略
SOFT:软引用策略
WEAK:弱引用策略