zoukankan      html  css  js  c++  java
  • MyBatis架构和源码分析

    MyBatis架构和源码分析

      MyBatis中步骤

      a.获取SqlSessionFactory对象

      b.获取Sqlsession对象

      c.获取XxxMapper对象(代理接口中的方法、mapper.xml中的<select>等标签)

      d.执行<select>等标签中定义的SQL语句

    a.获取SqlSessionFactory对象

    parser解析器

    D:javafile_ideaMyBatisProjectsrcmybatis-3.5.1.jar!orgapacheibatisuilderxmlXMLConfigBuilder.class

    通过parseConfiguration()在configuration标签,设置了properties、setting、environments等标签属性

      将所有的配置信息放在了configuration对象中

      解析所有的XxxMapper.xml文件(分析其中的增删改查标签)

      <select id="" resultType="">等属性通过parseStatementNode()解析的

      会将XxxMapper.xml中的select等标签解析成MappedStatement对象

      即MappedStatement对象就是select等标签

    MappedStatement->存在于Configuration中

    environment->存在于Configuration中

    所有的配置信息、增删改标签 全部存在于Configuration中==》

    Configuration又存在DefaultSqlSessionFactory对象中(SqlSessionFactory)

     SqlSessionFactory对象→DefaultSqlSessionFactory→Configuration→包含一切配置信息

     b.获取Sqlsession对象

      configuration.newExecutor(tx,execType)->SimpleExecutor

    根据不同的类型execType,产生不同的Executor,并且会对执行器进行拦截操作

    executor=(Executor)interceptorChain.pluginAll(executor);

    通过装饰模式,将刚才产生的executor包装成一个更加强大的executor

    作用:以后我们如果要给MyBatis写自己的插件,就可以通过拦截器实现。

    插件开发:1.写插件2.放入拦截器

      返回DefaultSqlSession(configuration,executor,事务)

    SqlSession->openSessionFromDataSource()->DefaultSqlSession对象

    SqlSession->DefaultSqlSession对象->执行SQL

     c/d.获取XxxMapper对象、执行

      执行增删改查->MapperProxy/invoke()->InvocationHandler:JDK动态代理接口

    用到了动态代理模式:增删改查->代理对象MapperProxy->代理对象帮我"代理执行"增删改查

    XxxMapper代理对象:MapperProxy对象

    mapperMethod.execute(sqlSession,args):实际调用增删改查的方法,依靠了sqlSession中的configuration和executor..

    处理增删改查方法的参数:method.converArgsToSqlCommandParam(args);

    如果参数是0个,return null;

    如果参数是1,返回第一个

    如果有多个参数,放入map中

    查询方法:selectOne()->selectList():configuration.getMappedStatement()即获取到用于增删改查的对象

    boundSql:将我们写的SQL和参数值进行拼接后的对象,即最终能被真正执行的SQL

    执行Sql是通过Executor

    如果缓存中没有要查询的内容,则进入数据库真实查询:queryFromDatabase()

    mybatis使用的jdbc对象是PrepareStatement

    底层执行增删改查:PrepareStatement的execute()

    Mybatis底层在执行CRUD时,可能会涉及到四个处理器:StatementHandler  parameterHandler  TypeHandler  ResultSetHandler

    XxxMapper:SQLSession(configuration,executor,事务)、代理接口的对象(MapperInterface)、methodCache(存放查询缓存、底层时CurrentHashMap)

  • 相关阅读:
    转 MySQL权限管理
    mysql 驱动问题
    mysql issue:
    (五)容器网络 -上
    idea 快速生成代码的快捷键
    (四)容器互联
    (三)将容器变成镜像
    (二)docker的部署安装,配置,基础命令
    (一)为什么要学习docker
    Centos7 安装docker ce
  • 原文地址:https://www.cnblogs.com/mayouyou/p/13274779.html
Copyright © 2011-2022 走看看