一、Mybaits基础
MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手工设置参数以及抽取结果集。MyBatis 使用简单的 XML 或注解来配置和映射基本体,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
1.MyBatis的框架架构
API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
2.原理详解:
MyBatis应用程序根据XML配置文件创建SqlSessionFactory,SqlSessionFactory在根据配置,配置来源于两个地方,一处是配置文件,一处是Java代码的注解,获取一个SqlSession。SqlSession包含了执行sql所需要的所有方法,可以通过SqlSession实例直接运行映射的sql语句,完成对数据的增删改查和事务提交等,用完之后关闭SqlSession。
二、 Mybaits源码结构
源代码主要在org.apache.ibatis目录下,18个包,其中在应用中主要的包有:builder、session、cache、type、transaction、datasource、jdbc、mapping,提供支撑服务的包有annotation、binding、io、logging、plugin、reflection、scripting、exception、executor、parsing.
1.注解
org.apache.ibatis.annotations
2.绑定
org.apache.ibatis.binding
3.构建
org.apache.ibatis.builder
org.apache.ibatis.builder.annotation
org.apache.ibatis.builder.xml
4.缓存
org.apache.ibatis.cache
org.apache.ibatis.cache.decorators
org.apache.ibatis.cache.impl
5.数据源
org.apache.ibatis.datasource
org.apache.ibatis.datasource.jndi
org.apache.ibatis.datasource.pooled
org.apache.ibatis.datasource.unpooled
6.异常
org.apache.ibatis.exceptions
7.执行器
org.apache.ibatis.executor
org.apache.ibatis.executor.keygen
org.apache.ibatis.executor.loader
org.apache.ibatis.executor.loader.cglib
org.apache.ibatis.executor.loader.javassist
org.apache.ibatis.executor.parameter
org.apache.ibatis.executor.result
org.apache.ibatis.executor.resultset
org.apache.ibatis.executor.statement
8.IO
org.apache.ibatis.io
通过类加载器在jar包中寻找一个package下满足条件(比如某个接口的子类)的所有类
9.jdbc单元测试工具
org.apache.ibatis.jdbc
10.日志
org.apache.ibatis.logging
org.apache.ibatis.logging.commons
org.apache.ibatis.logging.jdbc
org.apache.ibatis.logging.jdk14
org.apache.ibatis.logging.log4j
org.apache.ibatis.logging.log4j2
org.apache.ibatis.logging.nologging
org.apache.ibatis.logging.slf4j
org.apache.ibatis.logging.stdout
11.映射
org.apache.ibatis.mapping
12.解析
org.apache.ibatis.parsing
xml解析,${} 格式的字符串解析
13.插件
org.apache.ibatis.plugin
14.反射
org.apache.ibatis.reflection
org.apache.ibatis.reflection.factory
org.apache.ibatis.reflection.invoker
org.apache.ibatis.reflection.property
org.apache.ibatis.reflection.wrapper
15.脚本
org.apache.ibatis.scripting
org.apache.ibatis.scripting.defaults
org.apache.ibatis.scripting.xmltags
16.会话
org.apache.ibatis.session
org.apache.ibatis.session.defaults
17.事务
org.apache.ibatis.transaction
org.apache.ibatis.transaction.jdbc
org.apache.ibatis.transaction.managed
18.类型处理器
org.apache.ibatis.type
实现java和jdbc中的类型之间转换
整体框架理解:
初始化Mybatis,所有的配置都在Configuration对象中使用Mybatis,从SqlSessionFactory工厂中获取SqlSession,从Configuration对象中获取mapper对象,并返回结果Mybatis在加载mapper的时候对mapper接口的注解进行解析重要的几个包:io、session、builder、mapper(annotations、binding)、executor。
MyBatis sqlSession的产生过程
(1)、SqlSessionFactoryBuilder:build方法创建SqlSessionFactory实例。是用过即丢,其生命周期只存在于方法体内。
(2)、SqlSessionFactory:openSession创建SqlSession实例的工厂。单例,存在于整合应用运行时。
(3)、SqlSession:用于执行持久化操作的对象,类似于jdbc中的Connection。
|
|
(1)SqlSessionFactoryBuilder:支持9种构造方法,其实最主要的是包含Configuration对象的构造方法,目的是为了通过加载配置文件创造SqlSessionFactory对象,真实最终返回的是DefaultSqlSessionFactory对象:
从中我们看到了有一段很核心的代码,下面那段,这应该是去解析XML配置文件去了,解析完得出了一个Configuration对象,可以先猜测下这个Configuration对象和我们配置文件都是一一对应的:
再看看Configuration对象的一些核心属性:
(2)、返回的DefaultSqlSessionFactory ,可进行Sqlsession的创建,Sqlsession对应着一次数据库会话。由于数据库回话不是永久的,因此Sqlsession的生命周期也不应该是永久的,相反,在你每次访问数据库时都需要创建它(当然并不是说在Sqlsession里只能执行一次sql,你可以执行多次,当一旦关闭了Sqlsession就需要重新创建它)。创建Sqlsession的地方只有一个,那就是SqlsessionFactory的openSession方法。
SqlSessionFactory:SqlSession工厂类,以工厂形式创建SqlSession对象,采用了Factory工厂设计模式
从DefaultSessionFactory中的private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {}方法可以看出,创建sqlsession经过了以下几个主要步骤:
1) 从配置中获取Environment;
2) 从Environment中取得DataSource;
3) 从Environment中取得TransactionFactory;
4) 从DataSource里获取数据库连接对象Connection;
5) 在取得的数据库连接上创建事务对象Transaction;
6) 创建Executor对象(该对象非常重要,事实上sqlsession的所有操作都是通过它完成的);
7) 创建sqlsession对象。
时序图:
设计模式:
工厂模式SqlSessionFactory
建造模式SqlSessionFactoryBuilder
单例模式LogFactory
装饰模式Cache:采用装饰模式,一个个包装起来,形成一个链,典型的就是SynchronizedCache->LoggingCache->SerializedCache->LruCache->PerpetualCache,通过链起来达到功能增加
(1)、 SynchronizedCache 同步缓存,防止多线程问题。核心: 加读写锁,
ReadWriteLock.readLock().lock()/unlock()
ReadWriteLock.writeLock().lock()/unlock()
(2)、LoggingCache 日志缓存,添加功能:取缓存时打印命中率
(3)、SerializedCache 序列化缓存 用途是先将对象序列化成2进制,再缓存
(4)、LruCache 最近最少使用缓存,核心就是覆盖 LinkedHashMap.removeEldestEntry方法,返回true或false告诉 LinkedHashMap要不要删除此最老键值。LinkedHashMap内部其实就是每次访问或者插入一个元素都会把元素放到链表末尾,这样不经常访问的键值肯定就在链表开头啦。
(5)、PerpetualCache 永久缓存,一旦存入就一直保持,内部就是一个HashMap,所有方法基本就是直接调用HashMap的方法
(6)、FifoCache 先进先出缓存,内部就是一个链表,将链表开头元素(最老)移除
(7)、ScheduledCache 定时调度缓存, 目的是每一小时清空一下缓存
(8)、SoftCache 软引用缓存,核心是SoftReference
(9)、 WeakCache 弱引用缓存,核心是WeakReference
(10)、TransactionalCache 事务缓存,一次性存入多个缓存,移除多个缓存