一般的に、フレームワークのソースコードを変更することは非常に危険であり、絶対に必要でない限り変更しないでください。しかし、今日、私は春と統合されたMyBatisによって公式に提供されたSQLSessionFactoryBeanクラスを慎重に再構築しました。第一に、試行錯誤の考え方があり、第二に、現実的なニーズがあります。
最初に2つのポイントを説明させてください:
一般的に言えば、リファクタリングとは、関数を変更せずにコードを最適化することを指しますが、この記事に記載されているリファクタリングには機能の追加も含まれます。
この記事で使用されているメインジャーパッケージ(バージョン):spring-* - 4.3.3.Release.jar、mybatis-3.4.1.jar、mybatis-spring-1.3.0.jar
MyBatisとSpringの統合から始めましょう。
1. mybatisとspringを統合します
<bean id = "sqlsessionfactory" p:datasource-ref = "dataSource" P:configlocation = "classpath:mybatis/mybatis-config.xml"> <プロパティ名= "mapperlocations =" mapperlocations "
統合の重要なクラスはorg.mybatis.spring.sqlsessionfactorybeanです。これは、Mybatis Global Session Factory Factory SqlSessionFactory(つまり、セッションファクトリーを生成する工場Bean)を生成するために使用される工場のBeanです。接続に相当)。
ここで、プロパティ(Pネームスペースまたはプロパティチャイルド要素を使用して構成):
DataSourceはデータソースであり、DBCP、C3P0、Druid、JNDI-Lookupおよびその他の方法を使用して構成できます。
構成は、MyBatisの動作を変更するために使用されるMyBatisエンジンのグローバルな構成です。
MapperLocationsは、MyBatisがロードする必要があるSQLMapperスクリプト構成ファイル(モード)です。
もちろん、他にも多くの属性があるので、ここでは例を挙げません。
2。なぜ再構築するのか
1。ソースコードの最適化
SQLSessionFactoryBeanの機能は、SQLSessionFactoryを生成することです。この方法(sqlsessionfactorybean.java line 384-538)を見てみましょう。 1.3.0、{@link configuration}インスタンスを直接(構成ファイルなし)に指定できます。 (this.configuration!= null){configuration = this.configuration; if(configuration.getVariables()== null){configuration.setVariables(this.ConfigurationProperties);} elsif(this.configurationProperties!= null){configuration.getvaris(this configulation() (this.configlocation!= null){xmlconfigbuilder = new xmlconfigbuilder(this.configlocation.getinputStream()、null、this.configurationProperties); configuration = xmlconfigbuilder.getConfiguration(); {logger.debug( "プロパティ` configuration`または 'configlocation' not quatified、default mybatis configuration ");} configuration = new Configuration(); configuration.setVariables(this.ConfigurationProperties);} if(this.ObjectFactory!= null){configuration.setObjectory(this.burctory(this.objectory(this.burptory); != null){configuration.setObjectWrapperFactory(this.objectwrapperfactory);} if(this.vfs!= null){configuration.setvfsimpl(this.vfs);} if(haslengt(this.typealiasespackage)){string [] typealiaspacagearray = tokenizetStringArray(this.typealiasespackage、configurableapplicationContext.config_location_delimiters); for(string packageToscan:typealiaspackagearray){configuration.gettypealiasregistry()。レジスタリアス(packageToscan、typealiasessupertype = null?object.class:typealiasesupertype); "'エイリアス");}}} if(!isempty(this.typealiase)){for(class <?> typealias:this.typealiase){configuration.gettypealiasregistry()。レジスタリアス(Typealias); "'");}}} if(!isempty(this.plugins)){for(interceptorプラグイン:this.plugins){configuration.addinterceptor(プラグイン); if(logger.isdebugenabled()){ogger.debug( "登録プラグイン:' +プラグイン +" '' '' '' ');}} (haslength(this.typehandlerspackage)){string [] typehandlerspackagearray = tokenizetostringarray(thisepehandlerspackage、configureableapplicationcontext.config_location_delimiters); for(string packageToscan:typehandlerspackagearray){configuration.getTypehandlerregistry()。レジスタ(packageToscan); if(logger.isdebugenabled()){oggger.debug( "スキャンパッケージ: '" + packageToscan + "' for handlers"); (!isempty(this.typehandlers)){for(typehandler <?> typehandler:this.typehandlers){configuration.getTypeHandlerRegistry()。レジスタ(TypeHandler); if(logger.isdebugenabled()){logger.debug(ife (this.databaseidprovider!= null){// fix#64 databaseidを解析する前にxmlstry {configuration.setdatabaseid(this.databaseidprovider.getDatabaseid(this.DataSource)); e);}} if(this.cache!= null){configuration.addcache(this.cache);} if(xmlconfigbuilder!= null){try {xmlconfigbuilder.parse(); if(ogger.isdebugenabled()){logger.debug + "'");}} catch(Exception ex){throw new NestedioException( "config resource:" + this.configlocation、ex);} finally {ersercontext.instance()。reset()。 SpringManagedTransactionFactory();} configuration.SetenVironment(新しい環境(this.environment、this.transactionfactory、this.datasource))); if(!isempty(this.mapperlocations))) {xmlmapperbuilder XMLMAPPERBUILDER = new XMLMapperBuilder(MapperLocation.getInputStream()、configuration、mapperlocation.toString()、configuration.getSqlFragments();マッピングリソース: '" + mapperlocation +"' '"、e);}最後に{errorcontext.instance()。 {logger.debug( "Property 'MapperLocations'は指定されていないか、一致するリソースが見つかりませんでした")MyBatisは優れたPersistence Layer Frameworkですが、正直なところ、このコードは実際にはあまり良くなく、再構築と最適化の余地がたくさんあります。
2。機能拡張
(1)スキーマを使用して、SQLMapperを検証します
<! - DTDモード - > <?XMLバージョン= "1.0"エンコード= "UTF-8"? namespace = "org.dysd.dao.mybatis.config.iexampledao"> </mapper> <! - schemaモード - > <?xmlバージョン= "1.0" encoding = "utf-8"? xmlns = "http://dysd.org/schema/sqlmapper" xsi:schemalocation = "http://dysd.org/schema/sqlmapper http://dysd.org/schema/sqlmapper.xsd "namespace =" org.dysd.dao.mybatis.config.iexampledao "> </mapper>
一見、スキーマの使用はより複雑ですが、IDEと組み合わせると、スキーマを使用する自動プロンプトはより友好的であり、検証情報はより明確になります。同時に、他の開発者がウィンドウを開き、既存の名前空間に基づいて名前空間をカスタマイズできるようにします。たとえば、<OGNL>タグを導入したり、OGNL式を使用してSQLステートメントなどを構成します。
(2)構成をカスタマイズします。 sqlsessionfactorybeanは、カスタム構成のためのより多くのパラメーターを提供していますが、以下など、よりパーソナライズされた設定を必要とすることはまだ可能です。
A.デフォルトの結果タイプを設定します。 resultTypeとresultMapを設定しない<select>要素の場合、デフォルトの返されたタイプを解析後にマップに設定することで、SQLMapperの構成を簡素化できます。
<! - simplifiedの前 - > <id = "select" resulttype = "map"> select * from table_name from field1 =#{field1、jdbctype = varchar} </select> <! - </select> <! - > <> <> <select id = "select" select> select * select> select *ここで、field1 =#{field1、jdbctype = varchar}B. MyBatisの元のパラメーター分析を拡張します。ネイティブの解析の実装は、defaultParameterhandlerです。この実装は継承および拡張できます。たとえば、SPEL:、SPELを使用して値を評価するプロパティ式式の場合。
(3)他の拡張機能については、MyBatis拡張機能に関する著者の以前のブログを参照してください
3。再構築の実現可能性
(1)コードの影響の範囲に関して
以下は、SqlSessionFactoryBeanの継承構造です
このことから、SQLSessionFactoryBean継承システムは複雑ではなく、他の親クラスを継承していないことがわかります。春には3つのインターフェイスのみを実装します(JDKのEventlistenerは単なるロゴです)。さらに、SqlSessionFactoryBeanは、サブクラスがなく、他のクラスがそれを呼び出していない最終開発ユーザーを対象としているため、コードインパクトの範囲の点では非常に小さいです。
(2)再構成の実装では、新しいschemasqlsessionfactorybeanを作成し、コードが最初にsqlsessionfactorybeanを完全にコピーし、パッケージ名とクラス名を変更してから、再構成の基礎として使用することができます。これは比較的簡単です。
(3)統合アプリケーションでは、統合された構成とSPRINGでクラス属性を変更する必要があります。
上記は、MyBatisと統合されたSqlSessionFactoryBeanのリファクタリングとSpringがお客様に紹介されたことです。それがあなたに役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!