小さな涙MyBatisの(B)

入門

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文を得ました。

フィット感ポータル

おすすめ

転載: juejin.im/post/5e7b6edbf265da42e31a671d