入門
Mybtais ORMは、オブジェクト指向プログラミング言語、システムの異なるタイプのデータ間の変換のためのフレームワークです。
本稿では、3つのステップMyBatisの解釈はなります。
SQL MyBatisのを実行するために取得する方法
今、私たちの目の実施のxmlファイルのSQLステートメントは、MyBatisの-config.xmlのの先頭に移動します。
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
复制代码
この時間は、インタビュアーがありマッパーは、いくつかの方法がありますマッパーファイルを読み込み、お願いしますか!
これらのタイプの優先順位が最も高いですか?
ハハ、それを知らない、私は今あなたを教えてくれます
<mappers>
<!-- 使用相对于类路径的资源引用 -->
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
<!-- 使用完全限定资源定位符(URL) -->
<mapper url="file:///var/mappers/BlogMapper.xml"/>
<!-- 使用映射器接口实现类的完全限定类名 -->
<mapper class="org.mybatis.builder.BlogMapper"/>
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<package name="org.mybatis.builder"/>
</mappers>
复制代码
私は主に第三説明します。第マッパークラスインターフェースは、そのようなものです
// 定义接口映射器
public interface TestMapper {
// 通过MyBatis的注解在Java接口方法上编写SQL语句
@Select("select * from test where id = #{id}")
Test selectOneTest(long id);
}
复制代码
私も資料の冒頭に述べた、MyBatisの構成は、本明細書に独立して作られていますMyBatisのは、MyBatisのは、Springフレームワークに統合されていません。(春の統合以下)
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 定义接口映射器所在的Java包 -->
<property name="basePackage" value="org.chench.test.mybatis.mapper.impl"/>
</bean>
复制代码
これは最も高い優先度を持って、我々はparseConfigurationを見ることができます()このメソッドの呼び出しmapperElement(root.evalNode(「マッパー」));(注:コードは、以前に与えられています)
したがって、オーダー名、リソース、URL、クラスを見ること。
インタビューの質問は、このを取り除くためにした後、我々は)(その後、ファンシーコードフィギュア、リソース!= NULL条件ができ、解析を入力してください
//解析
public void parse() {
//如果没有加载过再加载,防止重复加载
if (!configuration.isResourceLoaded(resource)) {
//配置mapper
configurationElement(parser.evalNode("/mapper"));
//标记一下,已经加载过了
configuration.addLoadedResource(resource);
//绑定映射器到namespace
bindMapperForNamespace();
}
//还有没解析完的东东这里接着解析?
parsePendingResultMaps();
parsePendingChacheRefs();
parsePendingStatements();
}
复制代码
キーワードマッパーた、のConfigurationElementを入力します()
private void configurationElement(XNode context) {
try {
//1.配置namespace
String namespace = context.getStringAttribute("namespace");
if (namespace.equals("")) {
throw new BuilderException("Mapper's namespace cannot be empty");
}
builderAssistant.setCurrentNamespace(namespace);
//2.配置cache-ref
cacheRefElement(context.evalNode("cache-ref"));
//3.配置cache
cacheElement(context.evalNode("cache"));
//4.配置parameterMap(已经废弃,老式风格的参数映射)
parameterMapElement(context.evalNodes("/mapper/parameterMap"));
//5.配置resultMap(高级功能)
resultMapElements(context.evalNodes("/mapper/resultMap"));
//6.配置sql(定义可重用的 SQL 代码段)
sqlElement(context.evalNodes("/mapper/sql"));
//7.配置select|insert|update|delete TODO
buildStatementFromContext(context.evalNodes("select|insert|update|delete"));
} catch (Exception e) {
throw new BuilderException("Error parsing Mapper XML. Cause: " + e, e);
}
}
复制代码
ディスプレイのコンテキスト
<mapper namespace="org.mybatis.example.BlogMapper">
<select id="selectBlog" parameterType="int" resultType="Blog">
select * from Blog where id = #{id}
</select>
</mapper>
复制代码
その後、SQL文の分析内容があります
buildStatementFromContext(context.evalNodes("select|insert|update|delete"));
复制代码
/* 解析语句(select|insert|update|delete)
<select
id="selectPerson"
parameterType="int"
parameterMap="deprecated"
resultType="hashmap"
resultMap="personResultMap"
flushCache="false"
useCache="true"
timeout="10000"
fetchSize="256"
statementType="PREPARED"
resultSetType="FORWARD_ONLY">
SELECT * FROM PERSON WHERE ID = #{id}*/
public void parseStatementNode() {
String id = context.getStringAttribute("id");
String databaseId = context.getStringAttribute("databaseId");
...
..
.
}
复制代码
ここでは、あなたがパッケージ化される必要があり、SQL文の解析が行われていたMyBatisの。
//又去调助手类
builderAssistant.addMappedStatement(id, sqlSource, statementType, sqlCommandType,
fetchSize, timeout, parameterMap, parameterTypeClass, resultMap, resultTypeClass,
resultSetTypeEnum, flushCache, useCache, resultOrdered,
keyGenerator, keyProperty, keyColumn, databaseId, langDriver, resultSets);
复制代码
addMappedStatementで呼び出さaddMappedStatement()を入力します()、コンフィギュレーションのためのクラスでそれを発見した、このクラスはまた、環境、私は前に述べ含んグローバルコンフィギュレーションクラス、でなければなりません。
問題にこの時間をお持ちですか?ベストプラクティス、通常、XMLマッピング・ファイルは、私が求めることができる、ダオに対応するインタフェースを記述します、インターフェイスの動作原理は、ダオは何かありますか?方法、パラメータのDAOインターフェイスが異なる、方法は、それをリロードすることができますか?
我々はaddMappedStatement()メソッドを入力してください。この時間は、このクラスには、SQLのソースコードを含む、ステートメントにMappedStatementマップ対応を発見しました。このことから、上記の質問に答えることができます。
解答:ダオ・インターフェースは、多くの場合、インターフェースのマッパーインタフェースの完全修飾名は、マップ・ファイル値の名前空間であり、インタフェースメソッド名がMappedstatement値は、インターフェースメソッド内のパラメータが転送することであるIDマッピングファイルであると言われていますSQLのパラメータ。com.mybatis3.mappers.StudentDao.findStudentByIdは、固有の名前空間がCOMです見つけることができます:キー文字列の連結値としてメソッド呼び出しインタフェース、インタフェース名+完全修飾メソッド名がMappedstatement、例に決定することができるではない実装クラスのインターフェイスマッパー、 ID =以下.mybatis3.mappers.studentDao MappedStatementはfindstudentById。
MyBatisの、各SELECT、INSERT、UPDATEでは、削除タグは、Mappedstatementオブジェクトに解決されます。ポリシーを維持するために、完全修飾名+メソッド名を見つけることですので、インターフェイスメソッドでダオは、オーバーロードされていません。DAOインターフェイスがJDKの動的プロキシはプロキシプロキシオブジェクトDAO JDK動的プロキシインタフェースの生成を実行MyBatisのに使用される動作であり、SQL MappedStatementの実装に有利な方法インターフェイスプロキシオブジェクトプロキシインターセプトは、SQL実行結果が返され、その後、表現しました。
プロキシクラスのインスタンスを生成するためのプロセスマッパーを解析し、そこmapperProxyFactoryプロキシ工場、。その役割は、DAO層の例を生成することです。これは、インターフェイスのDAO層は、直接メソッドを呼び出すことができる理由である - 実際には、ないインターフェイスメソッドの呼び出しが、そのプロキシクラスがメソッドを呼び出します。
現時点では、SQL文を得ました。
フィット感ポータル