• 为什么建议框架源码学习从Mybatis开始?能说这么清楚的,少见了


    目录

    一、容器Configuration

    二、动态SQL模板

    1. MappedStatement(映射器)
    2. 解析过程

    三、SqlSession

    1. 基本介绍
    2. 分类
    3. Executor

    四、Mapper(殊途同归)

    1. 存在的意义
    2. 工作原理

    五、缓存

    1. 一级缓存
    2. 二级缓存

    2.1基本信息

    2.2如何工作

    六、插件

    七、结果映射

    八、总结

    看过Mybatis后,我觉得Mybatis虽然小,但是五脏俱全,而且设计精湛。

    这个黑盒背后是怎样一个设计,下面讲讲我的理解

    正文

    一、容器Configuration

    Configuration 像是Mybatis的总管,Mybatis的所有配置信息都存放在这里,此外,它还提供了设置这些配置信息的方法。Configuration可以从配置文件里获取属性值,也可以通过程序直接设置。

    用一句话概述Configuration,它类似Spring中的容器概念,而且是中央容器级别,存储的Mybatis运行所需要的大部分东西。

    二、动态SQL模板

    使用mybatis,我们大部分时间都在干嘛?在XML写SQL模板,或者在接口里写SQL模板

    1. "1.0" encoding="UTF-8" ?>
    2. mapper
    3.   PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    4.   "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    5. <mapper namespace="UserMapper">
    6.    <select id="selectUser" resultType="com.wqd.model.User">
    7.       select * from user where id= #{id}
    8.    select>
    9. mapper>

    或者

    1. @Mapper
    2. public interface UserMapper {
    3.     @Insert("insert into user( name, age) " +
    4.             "values(#{user.name}, #{user.age})")
    5.     void save(@Param("user") User user);
    6.     @Select("select * from user where id=#{id}")
    7.     User getById(@Param("id")String id);
    8. }

    这对于Mybatis框架内部意味着什么?

    1、MappedStatement(映射器)

    • 就像使用Spring,我们写的Controller类对于Spring 框架来说是在定义BeanDefinition一样。
    • 当我们在XML配置,在接口里配置SQL模板,都是在定义Mybatis的域值MappedStatement

    一个SQL模板对应MappedStatement

    mybatis 在启动时,就是把你定义的SQL模板,解析为统一的MappedStatement对象,放入到容器Configuration中。每个MappedStatement对象有一个ID属性。这个id同我们平时mysql库里的id差不多意思,都是唯一定位一条SQL模板,这个id 的命名规则:命名空间+方法名

    Spring的BeanDefinition,Mybatis的MappedStatement

    2、解析过程

    同Spring一样,我们可以在xml定义Bean,也可以java类里配置。涉及到两种加载方式。

    这里简单提一下两种方法解析的入口:

    1.xml方式的解析

    提供了XMLConfigBuilder组件,解析XML文件,这个过程既是Configuration容器创建的过程,也是MappedStatement解析过程。

    1. XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
    2. Configuration config = parser.parse()
    3. 复制代码

    2.与Spring使用时ÿ

  • 相关阅读:
    LeNet-5网络结构详解和minist手写数字识别项目实践
    C语言每日一题(1):实现库函数strlen()
    Feign实现动态URL
    漏斗分析模型
    C语言特殊函数
    聊聊docker【一】初识docker
    npm包【详解】(内含npm包的开发、发布、安装、更新、搜索、卸载、查看、版本号更新规则、package.json详解等)
    广告岗位怎么使用数字员工省时省力
    springboot+vue+elementui毕业生就业信息招聘网站java501
    题目 1056: 二级C语言-温度转换
  • 原文地址:https://blog.csdn.net/m0_74931226/article/details/128201486