MyBatis源码剖析

[MyBatis源码分析 - 解析器模块]

2020-10-02  本文已影响0人  小胡_鸭

  解析器模块的作用是解析XML文件,虽然mybatis全局配置和SQL Mapper配置都可以使用类注解方式配置,并且在一些功能上使用类配置更方便,但是从总体上看可读性、可维护性没有使用XML好,所以还是提倡用XML配置,解析器模块就为XML文件的解析提供了底层支持。

一、功能概要

  解析器模块,主要提供了两个功能:

1、解析XML文件:包括mybatis全局配置文件和SQL Mapper映射文件
2、处理占位符:包括普通变量占位${}和SQL语句需要经过预编译的变量占位#{}

二、XPathParser

  该类的类图如下所示:


  该类封装了加载XML文件生成的Document对象,并封装了使用javax.xml.xpath.XPath对象对Document对象中的DOM节点进行操作的方法,XPathParser的详细源码分析见:[MyBatis源码详解 - 解析器模块 - 组件二] XPathParser

三、XNode

  mybatis将XML文档加载成Document对象后,每个XML标签节点就对应一个org.w3c.dom.Node对象,为了方便处理Node对象,mybatis封装了XNode对象,对外提供的方法主要有:

  XNode的源码解析详见:[MyBatis源码详解 - 解析器模块 - 组件一] XNode

四、PropertyParser

  由于在XML配置文件中,经常使用变量占位来动态配置变量属性值,如下所示:

<dataSource type="POOLED">
  <property name="driver" value="${driver}"/>
  <property name="url" value="${url}"/>
  <property name="username" value="${username}"/>
  <property name="password" value="${password}"/>
</dataSource>

  这些变量通过mybatis-config.xml<properties>标签引入,引入的方式可以是properties文件,或者定义<property>子标签,如下所示:

<properties resource="jdbc.properties"/>
<properties>
    <property name="database.driver" value="com.mysql.jdbc.Driver"/>
    <property name="database.url" value="jdbc:mysql://localhost:3306/chapter4"/>
    <property name="database.username" value="root"/>
    <property name="database.password" value="root"/>
</properties>

  当解析的属性值是一个变量占位时,就需要调用PropertyParser去解析对应的值,PropertyParser封装了org.apache.ibatis.parsing.GenericTokenParser,解析占位变量名主要由该类完成,例如将上述的的usernamepassword解析出来,PropertyParser的静态方法parse(String string, Properties variables)会传入一个variables参数(对应上面的<properties>标签的内容),解析出来的变量就从该参数中获取对应的参数值rootroot

  mybatis允许多个变量占位来赋予同一个变量值如:${username}_${password},最终解析出来的值就是:root_root,除此之外还要带转义符等情况,源码详情见:[MyBatis源码详解 - 解析器模块 - 组件三] PropertyParser

上一篇 下一篇

猜你喜欢

热点阅读