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解析の意味を理解するのは難しくありません.
これからソースコードから見て、まず下のロードコードからエントリを見つけます.
build()メソッドに入ると、ここに位置するbuild()メソッドがfinally部分のソースコードを削除し、場所を占めます.
メソッドの3つのパラメータはそれぞれ、プロファイルフロー、他のパラメータは2つとも空で、まずXMLConfigBuilderクラスを構築した構築方法ですが、この構築方法を見てみましょう
XPathParserクラスの構築方法を続行
まずcommonConstructorメソッドの簡単な操作後、this.createDocument()メソッドを見てみましょう
ここでは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()を参照する.
この方法ではまずthisを判断した.parsed真偽は、実はこのクラスの構造方法で定義されています:this.parsed = false;だから私たちは下のelseに入って、これも1つのファイルが1回しか解析されないことを防止します.この方法を見てevalNode()、中のパラメータはxmlファイルのxpathパス、/configurationで、興奮しているのではないでしょうか.これはプロファイルのルートノードです.メソッドに入り、この3つのメソッドにナビゲートします.
実は簡単にMyBatisプロファイルのconfigurationノードの下のすべての内容を得ることができます!XNodeオブジェクトは、XLConfigBuilderクラスのparse()解析メソッドに戻ります.
現在,ソースコードからDOMによりプロファイルを解析し,最後にconfigurationノードの下の左右のコンテンツのXNodeオブジェクトを返した後,他の解析を行っている.他の部分はどのように解析して、次のソースコードを読み続けます!今日はここまでです.
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オブジェクトを返した後,他の解析を行っている.他の部分はどのように解析して、次のソースコードを読み続けます!今日はここまでです.