• mybatis的简单执行流程-面试用


    1、Configuration

    XMLConfigBuilder调用parse()方法解析Mybatis配置文件,生成Configuration对象
    XMLConfigBuilder parser > Configuration

    SqlSessionFactory = new DefaultSqlSessionFactory ( config );
    session = factory.openSession();
    sqlSession.getMapper(UserMapper.class);

    通过Session来得到UserMapper.java类的代理对象
    每一个Mapper文件都有一个对应的MapperProxyFactory,为什么需要MapperProxyFactory

    2、因为MapperProxyFactory可以用来生成代理对象。

    MapperProxyFactory是如何产生代理对象: 内部通过目标类转成MapperProxy,在通过Proxy生成代理对象。
    MapperProxy实现了InvocationHandler接口,所以MapperProxy具有拦截功能,

    Proxy如何产生对象的

    Proxy.newProxyInstance(getClassLoader(), new Class[]{this.mapperInterface}, mapperProxy);

    注意第一个参数是类加载器,第二个是代理要实现的接口,第三个参数是InvocationHandler的实例对象。

    Proxy把MapperProxy当做InvocationHandler,Mapper当做接口来生成代理类。最终代理类会实现UserMapper接口,并且被调用时,会被InvocationHandler拦截也就是被MapperProxy拦截。

    当调用方法,会被MapperProxy的invoke方法拦截,invoke会做下面操作

    通过方法名Method查询得到MapperMethodInvoker对象,MapperMethodInvoker是做什么

    3、MapperMethod

    MapperMethod主要包含下面2个东西

    private final MapperMethod.SqlCommand command;
    private final MapperMethod.MethodSignature method;
    
    public MapperMethod(Class<?> mapperInterface, Method method, Configuration config) {
        this.command = new MapperMethod.SqlCommand(config, mapperInterface, method);
        this.method = new MapperMethod.MethodSignature(config, mapperInterface, method);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    SqlCommand和MethodSignature干嘛用的。
    1、SqlCommand一个内部类 封装了SQL标签的类型insert update delete select
    2、MethodSignature一个内部类 封装了方法的参数信息 返回类型信息等

    MapperMethod有个execute,就是开始执行sql的操作.在execute里面,通过类型找到事insert还是update,在通过返回值类型找具体方法,处理类型
    在通过类+方法名当做ID去Mapper.xml里面找对应的sql执行语句。

    关于MapperMethod可以看这个文章:《MapperMethod》

  • 相关阅读:
    Linux/Validation
    写在最后【mysql高级】【java提高】
    【COMSE 2022已检索】2023年材料科学与工程国际会议(COMSE 2023)火热征稿中!
    blender boxCutter插件
    【Linux学习笔记】基础命令2
    高防服务器给企业带来的优势有哪些?
    没有知网资源如何快速下载知网论文
    scrcpy远程投屏控制Android
    看完不信你还不懂MVCC原理详解
    Linux内存不够了?看看如何开启虚拟内存增加内存使用量
  • 原文地址:https://blog.csdn.net/weixin_37862824/article/details/133923791