ホームページ  >  記事  >  Java  >  Mybatisシリーズ徹底解説(6)---objectFactory、プラグイン、マッパーの導入と設定

Mybatisシリーズ徹底解説(6)---objectFactory、プラグイン、マッパーの導入と設定

黄舟
黄舟オリジナル
2017-03-02 10:50:151477ブラウズ

前回の記事「Mybatisシリーズ徹底入門(5)---TypeHandlerの導入と設定(mybatisソースコード)」では、TypeHandlerについて簡単に解説しました。 今回は mybatis の設定ファイルの検討を終了します。今回は、言及されていない残りのノード (objectFactory、databaseIdProvider、プラグイン、およびマッパー) の設定が含まれます。

それでは、次に、これらの構成の機能を簡単に紹介しましょう:

1. objectFactory は何をしますか? 設定が必要ですか?

MyBatis が結果オブジェクトの新しいインスタンスを作成するたびに、ObjectFactory インスタンスを使用してそれを実行します。デフォルトのオブジェクト ファクトリが行う必要があるのは、デフォルト コンストラクター、またはパラメーター マップが存在する場合はパラメーター コンストラクターを通じて、ターゲット クラスをインスタンス化することだけです。デフォルトでは、設定する必要はありません。mybatis は objectFactory のデフォルト実装を呼び出します。 ObjectFactory の実装をカスタマイズしたくない場合は、手動で構成する必要があります。

では、ObjectFactoryの実装をカスタマイズするにはどうすればよいでしょうか? 設定方法は?

ObjectFactoryをカスタマイズするには、ObjectFactoryインターフェースの実装クラスであるDefaultObjectFactoryを継承し、そのメソッドを書き換えるだけで済みます。ここでは詳しく説明しませんので、後ほど詳しく説明します。

ObjectFactoryを書いたら、次のように設定するだけです:


<configuration>
    ......    <objectFactory type="org.mybatis.example.ExampleObjectFactory">
        <property name="someProperty" value="100"/>
    </objectFactory>
    ......  </configuration


2.プラグインの役割は何ですか? 設定が必要ですか?

プラグインはオプションの構成です。 mybatis のプラグインは実際にはインターセプターであり、Executor、ParameterHandler、ResultSetHandler、および StatementHandler の一部のメソッドをインターセプトして、独自のロジックを処理できます。 Executor は実際に SQL ステートメントを実行するもので、ParameterHandler は渡したパラメータを処理するものです。以前に TypeHandler について話したときに、Mybatis が typeHandler を明示的に設定しない場合に多くの typeHandler を実装するのに役立つと述べたことを今でも覚えています。 mybatis パラメータのタイプ (実際には ParameterHandler) に基づいて、適切な typeHandler が実行用に自動的に選択されます。 選ぶにあたって。 ResultSetHandler は返された結果を処理します。

プラグインをカスタマイズするにはどうすればよいですか?

プラグインをカスタマイズするには、Interceptor インターフェースを実装する必要があります。ここでは詳しく説明しませんが、後の実践的な部分で詳しく説明します。定義後の構成は次のようになります:

<configuration>
    ......    <plugins>
      <plugin interceptor="org.mybatis.example.ExamplePlugin">
        <property name="someProperty" value="100"/>
      </plugin>
    </plugins>
    ......  </configuration>

3. これにより、mybatis のコアの 1 つが表示されます。これを構成する必要がありますか?

マッパーノードの下で、マッパーマッピングファイルを設定します。いわゆるマッパーマッピングファイルは、データテーブルとJavabeanマッピングの間のブリッジを確立するためにmybatisによって使用されます。実際の開発では通常、daoインターフェースに相当するマッパーファイルがあり、このマッパーがdaoの実装とみなすことができます。したがって、マッパーを構成する必要があります。

では、どのように設定すればよいのでしょうか?

<configuration>
    ......    <mappers>
      <!-- 第一种方式:通过resource指定 -->
    <mapper resource="com/dy/dao/userDao.xml"/>
    
     <!-- 第二种方式, 通过class指定接口,进而将接口与对应的xml文件形成映射关系
             不过,使用这种方式必须保证 接口与mapper文件同名(不区分大小写), 
             我这儿接口是UserDao,那么意味着mapper文件为UserDao.xml 
     <mapper class="com.dy.dao.UserDao"/>      -->
      
      <!-- 第三种方式,直接指定包,自动扫描,与方法二同理 
      <package name="com.dy.dao"/>      -->
      <!-- 第四种方式:通过url指定mapper文件位置
      <mapper url="file://........"/>       -->
  </mappers>
    ......  </configuration>

この記事は簡単な紹介にすぎません。より高度な使用法とその実装原理については、後の実践編で詳しく説明します。

これらのノードのソース コードの解析は、前述のノードの解析と似ているため、ここでは説明しません。 ソースコードを折りたたんだので、必要に応じて開いてください。

/**
 * objectFactory 节点解析 
 */private void objectFactoryElement(XNode context) throws Exception {    
 if (context != null) {      
 //读取type属性的值, 接下来进行实例化ObjectFactory, 并set进 configuration      
 //到此,简单讲一下configuration这个对象,其实它里面主要保存的都是mybatis的配置
      String type = context.getStringAttribute("type");      
      //读取propertie的值, 根据需要可以配置, mybatis默认实现的objectFactory没有使用properties
      Properties properties = context.getChildrenAsProperties();
      
      ObjectFactory factory = (ObjectFactory) resolveClass(type).newInstance();
      factory.setProperties(properties);
      configuration.setObjectFactory(factory);
    }
 } 
  
  /**
   * plugins 节点解析   */
  private void pluginElement(XNode parent) throws Exception {    if (parent != null) {      for (XNode child : parent.getChildren()) {
        String interceptor = child.getStringAttribute("interceptor");
        Properties properties = child.getChildrenAsProperties();        //由此可见,我们在定义一个interceptor的时候,需要去实现Interceptor, 这儿先不具体讲,以后会详细讲解
        Interceptor interceptorInstance = (Interceptor) resolveClass(interceptor).newInstance();
        interceptorInstance.setProperties(properties);
        configuration.addInterceptor(interceptorInstance);
      }
    }
  }  
  /**
   * mappers 节点解析
   * 这是mybatis的核心之一,这儿先简单介绍,在接下来的文章会对它进行分析   */
  private void mapperElement(XNode parent) throws Exception {    if (parent != null) {      for (XNode child : parent.getChildren()) {        if ("package".equals(child.getName())) {          //如果mappers节点的子节点是package, 那么就扫描package下的文件, 注入进configuration
          String mapperPackage = child.getStringAttribute("name");
          configuration.addMappers(mapperPackage);
        } else {
          String resource = child.getStringAttribute("resource");
          String url = child.getStringAttribute("url");
          String mapperClass = child.getStringAttribute("class");          //resource, url, class 三选一
          
          if (resource != null && url == null && mapperClass == null) {
            ErrorContext.instance().resource(resource);
            InputStream inputStream = Resources.getResourceAsStream(resource);            //mapper映射文件都是通过XMLMapperBuilder解析
            XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration, resource, configuration.getSqlFragments());
            mapperParser.parse();
          } else if (resource == null && url != null && mapperClass == null) {
            ErrorContext.instance().resource(url);
            InputStream inputStream = Resources.getUrlAsStream(url);
            XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration, url, configuration.getSqlFragments());
            mapperParser.parse();
          } else if (resource == null && url == null && mapperClass != null) {
            Class<?> mapperInterface = Resources.classForName(mapperClass);
            configuration.addMapper(mapperInterface);
          } else {            throw new BuilderException("A mapper element may only specify a url, resource or class, but not more than one.");
          }
        }
      }
    }
  }

本次就简单的到此结束, 从下篇文章开始,将会开始接触到mybatis的核心部分,不过首先还是要讲mapper文件的配置及使用, 并通过源码进一步深入核心。

 以上就是深入浅出Mybatis系列(六)---objectFactory、plugins、mappers简介与配置的内容,更多相关内容请关注PHP中文网(www.php.cn)!


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。