美文网首页
持久层框架设计实现及Mybatis源码分析

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

作者: 极速魔法 | 来源:发表于2022-03-07 21:14 被阅读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标签

  • 使⽤相对于类路径的资源引⽤,例如:
    <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>

  • 使⽤完全限定资源定位符(URL),例如:
    <mapper url="file:///var/mappers/AuthorMapper.xml"/>

  • 使⽤映射器接⼝实现类的完全限定类名,例如:
    <mapper class="org.mybatis.builder.AuthorMapper"/>

  • 将包内的映射器接⼝实现全部注册为映射器(常用):
    <package name="org.mybatis.builder"/>

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方法
     */
    @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. 返回处理结果

延迟加载

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

相关文章

网友评论

      本文标题:持久层框架设计实现及Mybatis源码分析

      本文链接:https://www.haomeiwen.com/subject/kmznrrtx.html