MyBatisはどのようにmapperを解析しますか.xmlにおけるsql関連情報(一)

4525 ワード

日常の解析XMLファイルには4つの主流の方法があり、DOM解析、SAX解析、JDOM解析、DOM 4 j解析、それではMybatisの中でDOMの解析方法を使って、JDOMとDOM 4 jはオープンソースjarパッケージで、その中でDOM 4 jは運用するのが多くて、性能はわりに良くて、私達は後で彼の解析の細部を研究して学ぶことができます.
Mybatisの解析ではクラスXNodeのノードクラスを自分で新しく書き、xml解析の意味を理解するのは難しくありません.
これからソースコードから見て、まず下のロードコードからエントリを見つけます.
//config.xml    ,    spring,mapper.xml        mappers   
Reader reader = Resources.getResourceAsReader("/config.xml"); 
            SqlSessionFactory sq = new SqlSessionFactoryBuilder().build(reader);

build()メソッドに入ると、ここに位置するbuild()メソッドがfinally部分のソースコードを削除し、場所を占めます.
 public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
        SqlSessionFactory var5;
        try {
            XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
            var5 = this.build(parser.parse());
        } catch (Exception var14) {
            throw ExceptionFactory.wrapException("Error building SqlSession.", var14);
        } 
        return var5;
    }

メソッドの3つのパラメータはそれぞれ、プロファイルフロー、他のパラメータは2つとも空で、まずXMLConfigBuilderクラスを構築した構築方法ですが、この構築方法を見てみましょう
 public XMLConfigBuilder(Reader reader, String environment, Properties props) {
        this(new XPathParser(reader, true, props, new XMLMapperEntityResolver()), environment, props);
    }

XPathParserクラスの構築方法を続行
 public XPathParser(Reader reader, boolean validation, Properties variables, EntityResolver entityResolver) {
        this.commonConstructor(validation, variables, entityResolver);
        this.document = this.createDocument(new InputSource(reader));
    }

まずcommonConstructorメソッドの簡単な操作後、this.createDocument()メソッドを見てみましょう
private Document createDocument(InputSource inputSource) {
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            factory.setValidating(this.validation);
            factory.setNamespaceAware(false);
            factory.setIgnoringComments(true);
            factory.setIgnoringElementContentWhitespace(false);
            factory.setCoalescing(false);
            factory.setExpandEntityReferences(true);
            DocumentBuilder builder = factory.newDocumentBuilder();
            builder.setEntityResolver(this.entityResolver);
            builder.setErrorHandler(new ErrorHandler() {
               //...   。
            });
            return builder.parse(inputSource);
        } catch (Exception var4) {
            throw new BuilderException("Error creating document instance.  Cause: " + var4, var4);
        }
    }

ここではtryの最初の行のコード:DocumentBuilderFactoryが明らかになった.newInstance();その後return builder.parse(inputSource); 説明MybatisプロファイルフローはJDKのDOM解析を行ってDocumentオブジェクトを返します.
ここでS qlSessionFactoryBuilderクラスのbuild()メソッドに戻り、XMLConfigBuilderクラスを構築してDocumentに戻る次のステップを見ます:var 5=this.build(parser.parse()); ここでは解析の方法parse()を示し,具体的にはXMLConfigBuilderクラスのparse()を参照する.
 public Configuration parse() {
        if(this.parsed) {
            throw new BuilderException("Each MapperConfigParser can only be used once.");
        } else {
            this.parsed = true;
            this.parseConfiguration(this.parser.evalNode("/configuration"));
            return this.configuration;
        }
    }

この方法ではまずthisを判断した.parsed真偽は、実はこのクラスの構造方法で定義されています:this.parsed = false;だから私たちは下のelseに入って、これも1つのファイルが1回しか解析されないことを防止します.この方法を見てevalNode()、中のパラメータはxmlファイルのxpathパス、/configurationで、興奮しているのではないでしょうか.これはプロファイルのルートノードです.メソッドに入り、この3つのメソッドにナビゲートします.
public XNode evalNode(String expression) {
        return this.evalNode(this.document, expression);
    }
public XNode evalNode(Object root, String expression) {
        Node node = (Node)this.evaluate(expression, root, XPathConstants.NODE);
        return node == null?null:new XNode(this, node, this.variables);
    }
private Object evaluate(String expression, Object root, QName returnType) {
        try {
            return this.xpath.evaluate(expression, root, returnType);
        } catch (Exception var5) {
            throw new BuilderException("Error evaluating XPath.  Cause: " + var5, var5);
        }
    }

実は簡単にMyBatisプロファイルのconfigurationノードの下のすべての内容を得ることができます!XNodeオブジェクトは、XLConfigBuilderクラスのparse()解析メソッドに戻ります.
現在,ソースコードからDOMによりプロファイルを解析し,最後にconfigurationノードの下の左右のコンテンツのXNodeオブジェクトを返した後,他の解析を行っている.他の部分はどのように解析して、次のソースコードを読み続けます!今日はここまでです.