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:弱引用策略

posted on 2017-08-07 20:49  zawjdbb  阅读(131)  评论(0编辑  收藏  举报

导航