手敲Mybatis(七)-细化xml语句解析和构建

  1. 前言

为什么这一章节要细分之前的解析xml处理逻辑,原因是违反了单一原则设计,职责并不明确,将Sql语句、参数、返回值等等一切都进行解析,那么这种的需要拆开,为了后面可维护可扩展,例如Mapper级别的有mapper解析,Sql语句有Sql语句的解析,因为Sql也是脚本,需要对脚本进行动态处理,也会延伸一些脚本类来处理对应语句

图一,全部职责混到一个类里一个方法里

2. UML类图

按照设计原则,需要各功能满模块满足单一原则,而每一个具体的实现上采用迪米特原则(关联类只关联"朋友",不应该"关联陌生人"),而显然,在mapper解析时没有职责明确,全部写到一个方法里处理,现在就要优化这部分内容。

XMLConfigBuilder:Xml配置构建器(名字起的多见名之意啊,ps:赞美之情)

此类构建Xml的环境,如开发环境的jdbc,测试环境等等,也扩展了Mapper映射器包装,整个解析以此类为入口进行串联调用。

XMLMapperBuilder:XmlMapper构建器

此类解析Mapper数据,对mapper的namespace进行绑定映射,扩展语句构建器包装

XMLStatementBuilder:语句构建器

此类处理select、update....标签上的id,参数类型、返回类型、包装语言驱动器用来得到处理过的Sql语句,最终绑定到MapperStatement。

LanguageDriver:语言驱动器接口,定义创建SqlSource方法

XMLLanguageDriver:语言驱动器实现类,

此类在Configuration中配置为默认实现的语言驱动器,包装调用脚本构建器。

LanguageDriverRegistry:语言驱动器注册器,在Configuration中配置默认将XMLLanguageDriver注册到map里

XMLScriptBuilder:脚本构建器

此类处理静态语言Sql和动态语言Sql,所以和SqlNode节点、SqlSource打交道

SqlNode:sql节点接口,主要是描述文件配置中Sql的信息,定义了apply方法。

StaticTextSqlNode:静态文本Sql节点,

实现SqlNode,描述Xml配置中不带标签的信息,即静态文本内容。

MixedSqlNode:混合Sql节点

实现SqlNode,最终由MixedSqlNode将所有的SqlNode实现串起来执行,也看作责任。

SqlSource:Sql源接口,定义获取BoundSql方法。

RawSqlSource:原始Sql源

此类实现了SqlSource接口,得到了Sql语句,将Sql语句传给Sql源进行解析处理。

SqlSourceBuilder:SQL 源构建器,此类主要完成以下两个操作

方面是解析Sql中的#{}占位符定义的属性,如jdbcType、javaType(使用较少)

一方面是把#{}占位符替换成?占位符

ParameterMappingTokenHandler:SqlSourceBuilder内部类,处理Sql中的#{}占位符定义的属性

GenericTokenParser:普通记号解析器,完成对#{}标记的内容定位,并用?替换参数

StaticSqlSource:静态Sql源,将处理的sql语句和参数以构造方式传入进来,提供了获取boundSql方法,供其他的SqlSource使用。

总共涉及的就是这些类,最终流转回XmlStateMentBuilder中,将所有的信息存储到addMapperStatement,就可以供sql执行器基础信息。

以上的类解说也都是根据一步步流程梳理下来的,大家可以好好看下理解下,对照uml图看下

3. 代码实现及分析

3.1 Xml构建器(XMLConfigBuilder)

包:package df.middleware.mybatis.builder.xml

此类中其他地方没有变动,只有mapperElement有变动,将循环去XMLMapperBuilder取出每一个mapper信息。

此类中其他信息在下面链接里有具体代码,本节就不展示没有改动的了,新来的小伙伴可以看下

手敲Mybatis-Mapper的XML解析自动注册使用_渣渣洒泪成长记的博客-优快云博客

 /*
     * <mappers>
     *     <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
     *     <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
     *     <mapper resource="org/mybatis/builder/PostMapper.xml"/>
     * </mappers>
     */
    // 将xml中的配置解析出来存储到对应的实体类中
    // 处理mapper的方法,mapper里有多个sql语句,所以需要List
    private void mapperElement(Element mappers) throws Exception {
        // 得到mybatis-config-datasource.xml的mappers标签里的mapper
        List<Element> mapperList = mappers.elements("mapper");
        for (Element e : mapperList) {
            String resource = e.attributeValue("resource");
            InputStream inputStream = Resources.getResou
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值