自定义持久层框架


本质是对JDBC代码封装

  1. 加載配置文件
  2. 创建 javaBean
    • Configuration 类:
    • MappedStatement 类
  3. 解析配置文件
  4. 创建SqlSessionFactory 接口及实现类 DefaultSqlSessionFactory
    1. openSession(): 生成 SqlSession
  5. 创建 SqlSession接口及实现类 DefaultSession
    1. 定义数据库操作
  6. 创建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

  1. public Object pluginAll(Object target) {
  2. for (Interceptor interceptor : interceptors) {
  3. target = interceptor.plugin(target);
  4. }
  5. return target;
  6. }

MyPlugin.java

  • plugin⽅法,⽣成target的代理对象
  • setProperties⽅法,传递插件所需参数
  1. @Intercepts({
  2. @Signature(
  3. type = Executor.class,
  4. method = "query",
  5. args={MappedStatement.class,Object.class,RowBounds.class,ResultHandler.class}
  6. )
  7. })
  8. public class MyPlugin implements Interceptor {
  9. /*
  10. 拦截方法:只要被拦截的目标对象的目标方法被执行时,每次都会执行intercept方法
  11. */
  12. @Override
  13. public Object intercept(Invocation invocation) throws Throwable {
  14. System.out.println("对方法进行了增强....");
  15. return invocation.proceed(); //原方法执行
  16. }
  17. /*
  18. 主要为了把当前的拦截器生成代理存到拦截器链中
  19. */
  20. @Override
  21. public Object plugin(Object target) {
  22. Object wrap = Plugin.wrap(target, this);
  23. return wrap;
  24. }
  25. /*
  26. 获取配置文件的参数
  27. */
  28. @Override
  29. public void setProperties(Properties properties) {
  30. System.out.println("获取到的配置文件的参数是:"+properties);
  31. }
  32. }

sqlMapConfig.xml

  1. <plugins>
  2. <plugin interceptor="com.lagou.plugin.ExamplePlugin">
  3. </plugin>
  4. </plugins>

Mybatis 源码剖析

总体流程

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

延迟加载

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