ホームページ >Java >&#&チュートリアル >Mybatisシリーズ徹底解説(6)---objectFactory、プラグイン、マッパーの導入と設定
前回の記事「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系列(六)---objectFactory、plugins、mappers简介与配置的内容,更多相关内容请关注PHP中文网(www.php.cn)!