自定义持久层框架
本质是对JDBC代码封装
- 加載配置文件
- 创建 javaBean
- Configuration 类:
- MappedStatement 类
- 解析配置文件
- 创建SqlSessionFactory 接口及实现类 DefaultSqlSessionFactory
- openSession(): 生成 SqlSession
- 创建 SqlSession接口及实现类 DefaultSession
- 定义数据库操作
- 创建Executor接口及实现类 SimpleExecutor实现类
Mybatis基础
Properties标签
<properties resource="jdbc.properties"></properties>
加载外部数据源配置信息
Package标签
使用 package 标签,mapper.xml和 mapper接口 同包同名
mapper标签
- 使⽤相对于类路径的资源引⽤,例如:
- 使⽤完全限定资源定位符(URL),例如:
- 使⽤映射器接⼝实现类的完全限定类名,例如:
- 将包内的映射器接⼝实现全部注册为映射器(常用):
mybaits缓存
一级缓存
- 做增删改操作,提交事务,会刷新一级缓存,原有缓存失效。
- sqlSession.clearCache() 手动刷新缓存。
二级缓存
跨多个SqlSession缓存,mapper级别
开启二级缓存 mapper接口 @CacheNamespace
禁用二级缓存,方法加@Options(useCache=false)
二级缓存缓存数据,不缓存对象,会返回一个新的对象
查询顺序:二级缓存 —》 一级缓存 —》 数据库
mybatis插件
本质是底层的动态代理
Mybatis 插件接⼝-Interceptor
调用顺序 plugin —> intercept. Plugin方法内部调用 Proxy.newProxyInstance(…)
InterceptorChain 类中保存插件调用链,pluginAll(Object target)内部调用interceptor.plugin(target)方法
InterceptorChain.java
public Object pluginAll(Object target) {for (Interceptor interceptor : interceptors) {target = interceptor.plugin(target);}return target;}
MyPlugin.java
- plugin⽅法,⽣成target的代理对象
- setProperties⽅法,传递插件所需参数
@Intercepts({@Signature(type = Executor.class,method = "query",args={MappedStatement.class,Object.class,RowBounds.class,ResultHandler.class})})public class MyPlugin implements Interceptor {/*拦截方法:只要被拦截的目标对象的目标方法被执行时,每次都会执行intercept方法*/@Overridepublic Object intercept(Invocation invocation) throws Throwable {System.out.println("对方法进行了增强....");return invocation.proceed(); //原方法执行}/*主要为了把当前的拦截器生成代理存到拦截器链中*/@Overridepublic Object plugin(Object target) {Object wrap = Plugin.wrap(target, this);return wrap;}/*获取配置文件的参数*/@Overridepublic void setProperties(Properties properties) {System.out.println("获取到的配置文件的参数是:"+properties);}}
sqlMapConfig.xml
<plugins><plugin interceptor="com.lagou.plugin.ExamplePlugin"></plugin></plugins>
Mybatis 源码剖析
总体流程
- 加载配置文件并初始化
- 接收调用请求
- 处理操作请求
- 返回处理结果
延迟加载
前提:多表查询满足嵌套查询
