《MyBatis 技术内幕》阅读梳理 第二章 基础支持层

点击查看合集

解析器模块

在Mybatis中涉及多个XML配置文件,常见的XML解析方式有三种DOM(Document Object Model) SAX、StAX。Mybatis使用的是DOM。DOM是基于树形结构的解析方式,他会将整个XML文件读入内存,并构建一个DOM树,基于这棵树形结构对各个节点进行操作。节点分为元素节点、属性节点、文本节点。
XPath是与DOM解析方式配合使用的语言。XPath之于DOM就相当于SQL相当于数据库。通过XPath可以查询XML文档。

反射模块

Mybatis中进行参数处理,以及结果映射等操作时,会涉及大量的反射操作。Mybatis中的Reflector时反射模块的基础。它可以把JavaBean对象进行解析。获取JavaBean对象的可读属性,可写属性。以及可读属性的get方法,可写属性的set方法。并且记录了相应方法的返回值类型和参数类型。

类型转换

JDBC数据类型和Java语言中的数据类型并不是完全对应的。在PrepareStatement为SQL语句绑定参数时,需要将Java对象转换为JDBC类型。当从结果集中获取数据时,又需要将JDBC类型转换为Java类型。这个工作由类型转换器完成(TypeHandler)

TypeHandler

BaseTypeHandler继承了TypeReference抽象类实现了TypeHandler接口。并且实现了setParameter()方法和getResult()方法。前者是将Java类型->JDBC类型。后者是JDBC类型->Java类型。但是它只实现了参数为NULL时的实现,而非空时的具体实现要由他的子类实现。(就是用PreparedStatment的setXX方法,和ResultSet的相关方法完成)
typeHandle的实现类很多,MyBatis是通过TypeHandlerRegistry进行管理的。

TypeHandlerRegistry

TypeHandlerRegistry中存在字段包括,当需要JDBC->Java时,的映射关系(Map<JDBCType,TypeHandler>)以及需要Java->JDBC时的映射关系对象(Map(Type,Map<JDBCType,TypeHandler>)例如String可以转换成char或者varchar因此存在一对多的关系)。调用TypeHandlerRegistry的registr()方法就可以将TypeHandler注册到TypeHandlerRegistry中。

TypeAliasRegistry

可以用这个对象来实现,给类起别名的目的。因为全路径类名会很长,起个别名会很方便。
在TypeAliasRegistry中有个Map<String,Class>来保存别名与类的关系

日志模块

Mybaits支持多中日志框架,但是这些框架对外的接口不尽相同,为了统一这些工具的接口。Mybatis定义了一套统一的接口供上层使用。并为一些常用框架(Log4j 、Log4j2 、Apache Commons Log、java.util.logging)提供了相应的适配器。

适配器模式

Mybatis为了给多种日志框架提供相同的对外接口,从而使用了适配器模式。为主流的日志框架都提供了相应的适配器。

资源加载

JVM采用双亲委派机制,通过类加载器来加载类。JVM自底向上检测类是否被加载。自顶向下检测是否可以加载类。因此,可以得知。子类加载器可以使用父类加载的类。而父类加载器不能使用子类加载器加载的类。
Mybatis中自定义了一个类加载器,ClassLoaderWrapper是一个ClassLoader的包装器。ClassLoaderWrapper对象中有两个字段一个是系统类加载器,一个是应用默认的加载器。
ClassLoaderWrapper的主要功能分为三类。getResourceAsURL、getResourceAsStream、classForName。
以getResourceAsURL为例。它通过遍历classLoader数组(参数指定加载器,应用默认加载器,当前线程绑定的类加载器,加载当前类使用的类加载器)依次遍历。并调用类加载器的getResource()方法获取资源。另外两类方法与这个类似。

待续

猜你喜欢

转载自blog.csdn.net/qq_30033509/article/details/111372136