持久层框架设计实现及Mybatis源码分析

2022-03-07  本文已影响0人  极速魔法

自定义持久层框架

本质是对JDBC代码封装

  1. 加載配置文件
  2. 创建 javaBean
    ○ Configuration 类:
    ○ MappedStatement 类
  3. 解析配置文件
  4. 创建SqlSessionFactory 接口及实现类 DefaultSqlSessionFactory
    a. openSession(): 生成 SqlSession
  5. 创建 SqlSession接口及实现类 DefaultSession
    a. 定义数据库操作
  6. 创建Executor接口及实现类 SimpleExecutor实现类

Mybatis基础

Properties标签

<properties resource="jdbc.properties"></properties>
加载外部数据源配置信息

Package标签

使用 package 标签,mapper.xml和 mapper接口 同包同名

mapper标签

mybaits缓存

一级缓存

二级缓存

跨多个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

@Intercepts({
 @Signature(
 type = Executor.class,
 method = "query",
 args={MappedStatement.class,Object.class,RowBounds.class,ResultHandler.class}
 )
}) 
public class MyPlugin implements Interceptor {
    /*
        拦截方法:只要被拦截的目标对象的目标方法被执行时,每次都会执行intercept方法
     */
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        System.out.println("对方法进行了增强....");
        return invocation.proceed(); //原方法执行
    }

    /*
       主要为了把当前的拦截器生成代理存到拦截器链中
     */
    @Override
    public Object plugin(Object target) {
        Object wrap = Plugin.wrap(target, this);
        return wrap;
    }

    /*
        获取配置文件的参数
     */
    @Override
    public void setProperties(Properties properties) {
        System.out.println("获取到的配置文件的参数是:"+properties);
    }
}

sqlMapConfig.xml

<plugins>
 <plugin interceptor="com.lagou.plugin.ExamplePlugin">
 </plugin>
</plugins>

Mybatis 源码剖析

总体流程

  1. 加载配置文件并初始化
  2. 接收调用请求
  3. 处理操作请求
  4. 返回处理结果

延迟加载

前提:多表查询满足嵌套查询

上一篇 下一篇

猜你喜欢

热点阅读