zoukankan      html  css  js  c++  java
  • 手写mybatis框架笔记

    MyBatis

    手写MyBatis流程

    架构流程图

    封装数据

    封装到Configuration中

    1、封装全局配置文件,包含数据库连接信息和mappers信息

    2、封装*mapper.xml映射文件

    封装操作:Builder类

    Builder类用来操作配置文件(全局配置文件和mapper映射文件),将配置数据封装到类中。

    XmlConfigBuilder

    提供parse方法将dataSource信息封装到Configuration

    XmlMapperBuilder

    提供parse方法将mapper.xml信息封装到Configuration

    XmlStatementBuilder

    提供parse方法封装MappedStatement信息(此处应用了创建者模式)

    XmlScriptBuilder

    提供parse方法封装SqlNode信息

    数据封装类:

    Configuration

    封装DataSource和MappedStatement

    注意:在Configuration中还提供了创建四大组件的功能!!!

    DataSource

    封装了连接数据库所需的四大属性:数据库驱动、url、username、passwrod

    MappedStatement

    每一个CRUD标签都对应一个MappedStatement,其中包含了标签类型(StatementType)、参数类型(ParameterType)、结果类型(ResultType)、Sql文本包装类(SqlSource)

    SqlSource

    此接口只是对SqlNode做了一些包装,并提供getBound方法,用来获取sql文本和参数列表

    1、StaticSqlSource

    包含已经解析过的sql文本和参数信息(名称和类型)列表

    2、RawSqlSource

    用来封装只包含#{}的SqlNode

    在其构造方法中,实现了以下操作:

    (1)调用SlqNode的apply方法,拼接sql文本

    (2)将#{}替换成?

    (3)生成StaticSqlSource

    在其getBound方法中,实现了以下操作:

    将构造参数中生成的StaticSqlSource转化成BoundSql

    2、DynamicSqlSource

    用来封装包含${}的SqlNode,在getBound方法中,实现了以下操作:

    (1)调用SlqNode的apply方法,拼接sql文本

    (2)将#{}替换成?

    (3)生成BoundSql

    注意:因为含有${},解析时需要替换成参数值,所以每次传入不同的参数,都需要调用此方法,重新生成可执行的sql。

    SqlNode

    不同的SqlNode实现封装了不同类型的Sql文本,并提供了apply方法,用来将sql文本拼接到全局变量DynamicContext中

    遍历mapper.xml文件,将不同的Node封装到不同的SqlNode实现类中。

    1、StaticSqlNode

    用来封装只包含#{}的sql文本。

    2、TextSqlNode

    用来封装包含${}的sql文本。并在其apply方法中解析了${},将${}替换成相应的参数值。

    3、IfSqlNode

    用来封装If标签的sql文本。

    4、MixSqlNode

    用来封装SqlNode集合。并在其apply方法中遍历了集合,并调用了每个元素的apply方法。(此处用到了组合模式)

    如下mapper.xml文件对应的SqlNode:

    mapper.xml映射文件:

     

    对应生成的MixedSqlNode:

    BoundSql

    封装JDBC可执行的sql文本和参数信息(参数名、参数类型)列表

     

    执行JDBC

    SqlSession

    提供CRUD方法,用户可以直接调用。

    DefaultSqlSession
    SqlSessionFactory

    SqlSession工厂

    DefaultSqlSessionFactory
    SqlSessionFactoryBuilder(构建者模式)

    用configuration创建SqlSession????

    JDBC四大组件

    Executor

    执行器,执行JDBC。其中涉及一级缓存和二级缓存。

    BaseExecutor

    实现了Executor接口,提供query方法,如果存在一级缓存,那么返回一级缓存的数据;如果不存在一级缓存,则从数据库查询

    SimpleExecutor(应用了里氏替换原则)

    继承了BaseExecutor,忽略了二级缓存的存在,直接从数据库查询数据。

    CachingExecutor

    继承了BaseExecutor,如果存在二级缓存,使用二级缓存,否则从数据库查询。

    StatementHandler

    创建statement对象,执行JDBC操作。StatementHandler的实现类有PreparedStatementHandler、CallableStatementHandler、SimpleStatementHandler。此处应用了策略模式,每个实现类提供了不同的策略。

    ParameterHandler

    参数处理器,将参数信息添加到statement中

    ResultHandler

    对结果ResultSet进行处理,转化成List<Object>

     

  • 相关阅读:
    vue-cli router的使用
    vue element new vue const
    mac terminal update management pack
    关于MAC升级后,vim更新插件报错
    flex入门----基础知识
    常用的flex知识 ,比起float position 好用不少
    npm 安装nodesass 或者包含nodesass的脚手架工具报错问题
    anglar cli的 rxjs_1.of is not a function
    npm node sass 安装报错
    axios ajax fetch 区别
  • 原文地址:https://www.cnblogs.com/BonnieWss/p/12204770.html
Copyright © 2011-2022 走看看