Git Product home page Git Product logo

mybatiscn's Introduction

MyBatisCN

最新Mybatis的源码注解版,源码来自mybatis-3 稳定版 3.5.2

MybatisCN项目对MyBatis中的20包中300多个类进行了注释。注释包括核心方法与核心语句,如下图所示。

注释效果示意图


本项目是《通用源码阅读指导书——MyBatis源码详解》的配套开源项目。

《通用源码阅读指导书——MyBatis源码详解》以MyBatis源码中的包为单位,详细和透彻地介绍每个类的源码,包括其背景知识、组织方式、逻辑结构、实现细节。在本书的讲解中,不漏过每一个类,不跳过每一个难点,做到深浅一致。在阅读MyBatis源码的过程中,本书使用了运行初探、模块归类、合理猜测、类比阅读、网格阅读等许多源码阅读方法,并对这些源码阅读方法进行了进一步的总结整理。

本书适合架构师、程序员提升自己的源码阅读能力、系统架构能力、软件开发能力,也有助于产品经理、测试人员、运维人员等从业者了解软件架构细节。

书籍购买地址: 京东 | 淘宝

书籍介绍

书籍购买地址: 京东 | 淘宝

书籍目录:

  • 前言
  • 【模块 一】背景介绍
  • 1 源码阅读
    • 1.1 源码阅读的意义
    • 1.2 源码阅读的方法
    • 1.3 开源软件
    • 1.4 MyBatis源码
    • 1.5 本书结构
      • 1.5.1 背景知识
      • 1.5.2 文件的指代
      • 1.5.3 方法的指代
  • 2 MyBatis概述
    • 2.1 背景介绍
      • 2.1.1 传统数据库连接
      • 2.1.2 ORM框架
      • 2.1.3 MyBatis特点
    • 2.2 快速上手
      • 2.2.1 MyBatis包的引入
      • 2.2.2 MyBatis的简单配置
      • 2.2.3 基于MyBatis的数据库操作
    • 2.3 MyBatis的核心功能分析
  • 3 MyBatis运行初探
    • 3.1 初始化阶段追踪
      • 3.1.1 静态代码块的执行
      • 3.1.2 获取InputStream
      • 3.1.3 配置信息读取
      • 3.1.4 总结
    • 3.2 数据读写阶段追踪
      • 3.2.1 获得SqlSession
      • 3.2.2 映射接口文件与映射文件的绑定
      • 3.2.3 映射接口的代理
      • 3.2.4 SQL语句的查找
      • 3.2.5 查询结果缓存
      • 3.2.6 数据库查询
      • 3.2.7 处理结果集
      • 3.2.8 总结
  • 4 MyBatis源码结构概述
    • 4.1 包结构
    • 4.2 分组结构
  • 【模块 二】基础功能包源码阅读
  • 5 exceptions包
    • 5.1 背景知识
      • 5.1.1 Java的异常
      • 5.1.2 序列化与反序列化
    • 5.2 Exception类
    • 5.3 ExceptionFactory类
  • 6 reflection包
    • 6.1 背景知识
      • 6.1.1 装饰器模式
      • 6.1.2 反射
      • 6.1.3 Type接口及其子类
    • 6.2 对象工厂子包
    • 6.3 执行器子包
    • 6.4 属性子包
    • 6.5 对象包装器子包
    • 6.6 反射核心类
    • 6.7 反射包装类
    • 6.8 异常拆包工具
    • 6.9 参数名解析器
    • 6.10 泛型解析器
  • 7 annotations包与lang包
    • 7.1 背景知识
      • 7.1.1 Java注解详解
    • 7.2 Param注解分析
  • 8 type包
    • 8.1 背景知识
      • 8.1.1 模板模式
    • 8.2 类型处理器
      • 8.2.1 类型处理器基类与实现类
      • 8.2.2 TypeReference类
    • 8.3 类型注册表
  • 9 io包
    • 9.1 背景知识
      • 9.1.1 单例模式
      • 9.1.2 代理模式
      • 9.1.3 静态代理
      • 9.1.4 VFS
    • 9.2 VFS实现
      • 9.2.1 DefaultVFS
      • 9.2.2 JBoss6VFS
    • 9.3 类文件的加载
    • 9.4 ResolverUtil类
  • 10 logging包
    • 10.1 背景知识
      • 10.1.1 适配器模式
      • 10.1.2 日志框架与日志级别
      • 10.1.3 基于反射的动态代理
    • 10.2 Log接口
    • 10.3 Log接口的实现类
    • 10.4 LogFactory
    • 10.5 JDBC日志打印
  • 11 parsing包
    • 11.1 背景知识
      • 11.1.1 XML文件
      • 11.1.2 XPath
    • 11.2 XML解析
    • 11.3 文档解析中的变量替换
  • 【模块 三】配置解析包源码阅读
  • 12 配置解析概述
  • 13 binding包
    • 13.1 数据库操作的接入
      • 13.1.1 数据库操作的方法化
      • 13.1.2 数据库操作方法的接入
    • 13.2 抽象方法与数据库操作节点的关联
    • 13.3 数据库操作接入总结
      • 13.3.1 初始化阶段
      • 13.3.2 数据读写阶段
    • 13.4 MyBatis与Spring、Spring Boot的整合
  • 14 builder包
    • 14.1 背景知识
    • 14.1.1 建造者模式
    • 14.2 建造者基类与工具类
    • 14.3 SqlSourceBuilder与StaticSqlSource
    • 14.4 CacheRefResolver和ResultMapResolver
      • 14.4.1 CacheRefResolver类
      • 14.4.2 ResultMapResolver类
    • 14.5 ParameterExpression类
    • 14.6 XML文件解析
      • 14.6.1 XML文件的声明解析
      • 14.6.2 配置文件解析
      • 14.6.3 数据库操作语句解析
      • 14.6.4 Statement解析
      • 14.6.5 引用解析
    • 14.7 注解映射的解析
      • 14.7.1 注解映射的使用
      • 14.7.2 注解映射解析的触发
      • 14.7.3 直接注解映射的解析
      • 14.7.4 间接注解映射的解析
  • 15 mapping包
    • 15.1 SQL语句处理功能
      • 15.1.1 MappedStatement类
      • 15.1.2 SqlSource类
      • 15.1.3 BoundSql
    • 15.2 输出结果处理功能
      • 15.2.1 ResultMap
      • 15.2.2 ResultMapping
      • 15.2.3 Discriminator
    • 15.3 输入参数处理功能
    • 15.4 多数据库种类处理功能
    • 15.5 其他功能类
  • 16 scripting包
    • 16.1 背景知识
      • 16.1.1 OGNL
    • 16.2 语言驱动接口及语言驱动注册表
    • 16.3 SQL节点树的组建
    • 16.4 SQL节点树的解析
      • 16.4.1 OGNL辅助类
      • 16.4.2 表达式求值器
      • 16.4.3 动态上下文
      • 16.4.4 SQL节点及其解析
    • 16.5 再论SqlSource
      • 16.5.1 SqlSource的生成
      • 16.5.2 DynamicSqlSource的转化
      • 16.5.3 RawSqlSource的转化
      • 16.5.4 SqlSource接口的实现类总结
  • 17 datasource包
    • 17.1 背景知识
      • 17.1.1 java.sql包和javax.sql包
      • 17.1.2 DriverManager
      • 17.1.3 DataSource
      • 17.1.4 Connection
      • 17.1.5 Statement
    • 17.2 数据源工厂接口
    • 17.3 JNDI数据源工厂
    • 17.4 非池化数据源及工厂
      • 17.4.1 非池化数据源工厂
      • 17.4.2 非池化数据源
    • 17.5 池化数据源
      • 17.5.1 池化数据源类的属性
      • 17.5.2 池化连接的给出与收回
      • 17.5.3 池化连接
    • 17.6 论数据源工厂
  • 【模块 四】核心操作包源码阅读
  • 18 jdbc包
    • 18.1 AbstractSQL类与SQL类
      • 18.1.1 SafeAppendable内部类
      • 18.1.2 SQLStatement内部类
      • 18.1.3 AbstractSQL类
      • 18.1.4 SQL类
    • 18.2 SqlRunner
    • 18.3 ScriptRunner
    • 18.4 jdbc包的独立性
  • 19 cache包
    • 19.1 背景知识
      • 19.1.1 Java对象的引用级别
      • 19.1.2 ReferenceQueue
    • 19.2 cache包结构与Cache接口
    • 19.3 缓存键
      • 19.3.1 缓存键的原理
      • 19.3.2 缓存键的生成
    • 19.4 缓存的实现类
    • 19.5 缓存装饰器
      • 19.5.1 同步装饰器
      • 19.5.2 日志装饰器
      • 19.5.3 清理装饰器
      • 19.5.4 阻塞装饰器
      • 19.5.5 定时清理装饰器
      • 19.5.6 序列化装饰器
    • 19.6 缓存的组建
    • 19.7 事务缓存
    • 19.8 MyBatis缓存机制
      • 19.8.1 一级缓存
      • 19.8.2 二级缓存
      • 19.8.3 两级缓存机制
  • 20 transaction包
    • 20.1 背景知识
      • 20.1.1 事务概述
    • 20.2 事务接口及工厂
    • 20.3 JDBC事务
    • 20.4 容器事务
  • 21 cursor包
    • 21.1 背景知识
      • 21.1.1 Iterable接口与Iterator接口
    • 21.2 MyBatis中游标的使用
    • 21.3 游标接口
    • 21.4 默认游标
      • 21.4.1 CursorStatus内部类
      • 21.4.2 ObjectWrapperResultHandler内部类
      • 21.4.3 CursorIterator内部类
      • 21.4.4 DefaultCursor外部类
  • 22 executor包
    • 22.1 背景知识
      • 22.1.1 基于cglib的动态代理
      • 22.1.2 javassist框架的使用
      • 22.1.3 序列化与反序列化中的方法
      • 22.1.4 ThreadLocal
      • 22.1.5 存储过程
      • 22.1.6 Statement及其子接口
    • 22.2 主键自增功能
      • 22.2.1 主键自增的配置与生效
      • 22.2.2 Jdbc3KeyGenerator
      • 22.2.3 SelectKeyGenerator
    • 22.3 懒加载功能
      • 22.3.1 懒加载功能的使用
      • 22.3.2 懒加载功能的实现
      • 22.3.3 懒加载功能对序列化和反序列化的支持
    • 22.4 语句处理功能
      • 22.4.1 MyBatis对多语句类型的支持
      • 22.4.2 MyBatis的语句处理功能
    • 22.5 参数处理功能
    • 22.6 结果处理功能
    • 22.7 结果集处理功能
      • 22.7.1 MyBatis中多结果集的处理
      • 22.7.2 结果集封装类
      • 22.7.3 结果集处理器
    • 22.8 执行器
      • 22.8.1 执行器接口
      • 22.8.2 执行器基类与实现类
    • 22.9 错误上下文
  • 23 session包
    • 23.1 SqlSession及其相关类
      • 23.1.1 SqlSession的生成链
      • 23.1.2 DefaultSqlSession类
      • 23.1.3 SqlSessionManager类
    • 23.2 Configuration类
    • 23.3 其他类
  • 24 plugin包
    • 24.1 背景知识
      • 24.1.1 责任链模式
    • 24.2 MyBatis插件开发
    • 24.3 MyBatis拦截器平台
    • 24.4 MyBatis拦截器链与拦截点
  • 【模块 五】总结与展望
  • 25 源码阅读总结
    • 25.1 前期准备
      • 25.1.1 工具准备
      • 25.1.2 项目选择
      • 25.1.3 项目使用
    • 25.2 项目初探
    • 25.3 源码阅读
      • 25.3.1 模块分析
      • 25.3.2 模块归类
      • 25.3.3 自底向上
      • 25.3.4 合理猜测
      • 25.3.5 类比阅读
      • 25.3.6 善于汇总
      • 25.3.7 网格阅读
  • 26 优秀开源项目推荐
    • 26.1 Guava
    • 26.2 Tomcat
    • 26.3 Redis
    • 26.4 Dubbo
    • 26.5 React

书籍购买地址: 京东 | 淘宝

mybatiscn's People

Contributors

yeecode avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

mybatiscn's Issues

PropertyCopier.copyBeanProperti描述错误

文中写的是:
copyBeanProperties方法的工作原理非常简单:通过反射获取类的 所有属性,然后依次将这些属性值从源对象复制出来并赋给目标对象。 但是要注意一点,该属性复制器无法完成继承得来的属性的复制,因为
getDeclaredFields方法返回的属性中不包含继承属性。

这个是可以获得继承来的属性的,他循环复制属性后,最后会获取父类判空继续循环父类的属性进行赋值

书中发现的疑似错误和建议

P34 代码3-30中,"return handler.query"应改为"return handler.query";
P34 倒数第二行,"handler.query"应改为"handler.query";
P35 代码3-32中,"return resultSetHandler.handleResultSets"应改为"return resultSetHandler.handleResultSets";
P35 倒数第7行,"为 h>statement>result"应改为"为 h>statement>results";
P36 第一行,"交给ResultHanlder对象"应改为"交给ResultSetHanlder对象";
P36 第三行,"交给ResultHanlder对象"应改为"交给ResultSetHanlder对象","ResultHandler是"应改为"ResultSetHandler对象是";
P45 5.1.2下第五行,"则必须继承Serializable接口"应改为"则必须实现Serializable接口"
P84 图8-1下第二行,"BaseTypeHandler继承了"应改为"BaseTypeHandler实现了","并实现了TypeHandler中的接口"应改为"并实现了TypeHandler中的抽象方法"
P101 代码10-2下第一行,"而对象适配器Adaptee"应改为"而对象适配器Adapter"
P141 图14-1上第三行,"不需要关系建造对象的细节"应改为"不需要关心建造对象的细节"
P148 倒数第三行,"赋予默认的属性名称"expression""应改为""赋予默认的属性名称"property""
P174 代码15-9上第三行,"如果sex的值为0,则最终输出结果为Girl对象"应改为"如果sex的值为1,则最终输出结果为Girl对象","如果sex的值为1,则最终输出结果为Boy对象"应改为"如果sex的值为0,则最终输出结果为Boy对象"
P280 代码20-2中第2行,"connection.setAutoCommit(true);"应改为"connection.setAutoCommit(false);";
P285 21.2上第三行,"那么这个类可以继承Iterable接口"应改为"那么这个类可以实现Iterable接口";
P285 21.2下第二行,"并使用List接受这些对象"应改为"并使用List接收这些对象";
P286 21.4下第二行,"DefaultCursor类直接或间接继承了"应改为"DefaultCursor类直接或间接实现了";
P288 21.4.3下第一行,"CursorIterator类继承了"应改为"CursorIterator类实现了";
P288 21.4.3下第er行,"DefaultCursor类间接继承了"应改为"DefaultCursor类间接实现了";
P296 22.1.1下第二行,"则必须继承Serializble接口"应改为"则必须实现Serializble接口";
P296 22.1.1下第四行,"我们还给出了继承"应改为"我们还给出了实现";
P296 22.1.1下第五行,"继承Serializable接口"应改为"实现Serializable接口";
P296 倒数第五行,"而继承Externalizable接口"应改为"而实现Externalizable接口";
P302 第二行,"可以用图22-6将继承Externalizable"应改为"可以用图22-6将实现Externalizable";
P302 图22-6下第一行,"继承Serializable接口的类"应改为"实现Serializable接口的类";
P303 第六行,"而ThreadLocal是典型的“时间换空间”思路的应用"应改为"而ThreadLocal是典型的“空间换时间”思路的应用";
P324 倒数第十一行,"我们知道,在继承了Serializable"应改为"我们知道,在实现了Serializable";
P324 倒数第一行,"与之一起消失的还有MetaObject对象和ResultLoader对象"应改为"与之一起消失的还有MetaObject对象和Log对象";
P325 代码 22-33上第一行,"调用代码22-33所示的createProxy方法"应改为"调用代码22-33所示的crateProxy方法";
P325 代码22-33中倒数第二行,"static Object createProxy(...)"应改为"static Object crateProxy(...)";
P326 代码22-34上第七行,"代码22-33所示的createProxy方法"应改为"代码22-33所示的crateProxy方法";
P326 代码22-34上第六行,"则会让代理类继承WriteReplaceInterface"应改为"则会让代理类实现WriteReplaceInterface";
P331 图22-22中最后一行最左边,"BaseStatementHandler"应改为"SimpleStatementHandler";
P366 代码24-1中第3-6行,"// 创建三个工作人员实例...",建议可以去除;

注释问题

关于MapperMethod中resolveMappedStatement()方法的注释
@param declaringClass 操作方法所在的类。一般是映射接口本身,也可能是映射接口的子类

这里子类应该改作父类吧,interface A(amethod)--extend-->interface B(bmethod),B的实现类应该实现a&b两个方法,如果namespace:B中只映射了b方法,不过A的实现类namespace:A实现了a方法,getMap(B.class).amethod因为B没实现,mybatis会找到父接口的实现类来实现吧。很喜欢yee的书,如指正有误,望回复

不明的一个注释

这个类 org.apache.ibatis.reflection.Reflector#pickBetterSetter

image
if (paramType1.isAssignableFrom(paramType2)) { // 父类的那个为准 return setter2; } else if (paramType2.isAssignableFrom(paramType1)) { return setter1; }
这里应该是以子类的为准吧

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.