プログラムをデバッグし、いくつかのブログを作成し、最終的にMyBatis構成の拡張メカニズムを確立するために数晩一生懸命働いた後。拡張メカニズムは重要ですが、真に実用的な拡張機能がない場合、少なくともそれほど刺激的ではありません。このブログでは、拡張機能のいくつかの例を示します。
ソースコードのこの調査の理由は、OracleとMySQLデータベースの互換性です。たとえば、Oracleのコネクタとして二重垂直線を使用し、MySQLでconcat関数を使用します。たとえば、Oracleでデコード関数を使用しますが、MySQLでの場合のみ標準ケースを使用します。たとえば、field1 in(field1フォームテーブルを選択している場合は、field2 =?)を削除しますが、mysqlなどで例外がスローされます。
これらの互換性の問題を解決することから始めましょう。まず、データベースID関連の構成を構成に追加する必要があります。
< name = "mapperlocations"> <array> <balue> classpath*:**/*。sqlmapper.xml</value> </array> </property> <! - データベース製品識別構成 - > <プロパティ名= "databaseidprovider"> <bean> <bean> <プロパティ名= "プロパティ> < MySQLは、構成のDatabaseIDとして使用されます。 MyBatisネイティブの実装キーワードはケースに敏感です。 Oracleとdb2-> <prop key = "mysql"> mysql </prop> <prop key = "oracle"> oracle </prop> <prop key = "h2"> h2 "> h2 </prop> <prop key =" db2 "> db2 </prop> </props> </property> </bean> </bean> </beant
1。コネクタの問題
1。SQL構成関数実装クラスを書き込みます
パブリッククラスconcatsqlconfigfunction extends abstractsqlconfigfunction {//デフォルトの順序レベルは抽象的な親class @overridepublic string getname(){return "concat";} @overridepublic string eval(string databaseid、string [] args){concat <2){arsss.lengting <2)引数。 ");} if(" mysql ".equalsignorecase(databaseid)){return" concat( "+tool.string.join(args、"、 ")+") ";} els {return tool.stling.join(args、" || ")}}}}}}}}2。Schemahandlersクラスの静的コードブロックに登録するか、スタートアップ初期化クラスのSchemahandlersメソッドを呼び出します。
static {// Statement HandlerRegister( "cache-ref"、new cacherefstatementhandler()); register( "cache"、new cachestatementhandler()))); register(new parametermapstatementler())); register( "resultmap"、new resultmapStatementler(); register(); sqlstatementhandler()); register( "select | insert | update | delete"、new crudstatementhandler()) foreachscripthandler()); register( "if | when"、new ifscripthandler()); register( "choice"、new choosescripthandler()); // register( "when"、new ifscripthandler()); register( "その他"、new otherwisescriptherler()); RegisterExtend( "db"、new dbstatementhandler()、new dbscripthandler()); // restiple sqlconfigfunctionregister(new decadesqlconfigfunction()); Register(new concatsqlconfigfunction());concatsQlConfigFunctionの登録に加えて、上記のコードには他の登録コードもいくつかあります。これらについては、こちらに記載されており、以下に省略されます。
3. SQLMapper構成を変更します
<選択id = "selectString" resultType = "string"> param_name、$ concat {param_code、param_name}はbf_param_enum_defのcode_nameとしてcode = "null!= ''!= paramname"> param_name like $ concat {'%' {'%' {paramname}、jdbctype、jdbctype、jdbcty '%'} </if> </select>4。インターフェイスクラスを書き込みます
@RepositoryPublic Interface iExampledao {public string selectString(@param( "paramname")string paramname);}5.テストクラスを書きます
@runwith(springjunit4classrunner.class)@contextconfiguration(locations = {classpath:spring/applicationcontext.xml "})@componentpublic class exampledaotest {@resourceprivate iexampledao dao.selectString( "show"); assert.assertequals( "showエリア"、a);}}6.それぞれMySQLとH2で次のように実行します(MyBatisログレベルをトレースに調整します)
(1)mysql
20161108 00:12:55,235 [main] - [debug] ==>準備:param_name、concat(param_code、param_name)を選択します。 (String)20161108 00:12:55,287 [main] - [trace] <==列:param_name、code_name20161108 00:12:55,287 [main] - [trace] <==行:ディスプレイエリア、ディスプレイ_areaディスプレイエリア20161108 00:
(2)H2
20161108 00:23:08,348 [main] - [debug] ==>準備:param_name、param_code || param_name as code_name as code_name as code_name as bam_name (String)20161108 00:23:08,411 [main] - [trace] <==列:param_name、code_name20161108 00:23:08,411 [main] - [trace] <== row:ディスプレイエリア、ディスプレイ_areaディスプレイエリア20161108 00:
ご覧のとおり、コネクタの互換性の問題が解決されました。
さらに、「Likeキーワード」を使用する場合、書き込みはより面倒であることがわかりました。
パブリッククラスのwarsqlconfigfunctionfactory isqlconfigfunctionfactory {@overridepublic collection <isqlconfigfunction> getsqlconfigfunctions(){return arrays.aslist(getLeftlikesqlconfigfunction()、getrikesqunfunction()、get functiont()、getRikes functiont()、getRikes()、 isqlconfigfunction getLeftlikesqlconfigfunction(){return new abstractlikesqlconfigfunction(){@overridepublic string getname(){return "llike";}@overridepublic string eval(string arg){return "like $ concat {'% isqlconfigfunction getRightlikesQlConfigFunction(){return new AbstractlikesQlConfigFunction(){@OverridePublic String getName(){return "rlike";} isqlconfigfunction getlikesqlconfigfunction(){return new abstractlikesqlconfigfunction(){@overridepublic string getname(){return "like";}@overridepublictected string eval(string arg){return "like $ ccat {'%'; abstractlikesqlconfigfunctions abstractsqlconfigfunction {@overridepublic string eval(string databaseid、string [] args){if(args.length!= 1){shrow.throwexception( "ここでは、一連のSQL構成関数が定義されており、左の類似性、右類似性、および中間類似性マッチングを伴い、SQL構成関数もネストできます。したがって、SQLMapperの構成ファイルは次のことを簡素化されます。
<選択id = "selectString" resultType = "string"> param_name、$ concat {param_code、param_name} as code_name as bf_param_enum_def <if test = "null!= ''!= paramname"> param_name $ lik実行結果はまったく同じです。
Param_nameとparamnameはラクダのような対応であるため、まだ面倒な場合は、フィールドのような関数を追加して構成を変更することもできます。
ここで$ fieldlike {#{param_name、jdbctype = varchar}}データ辞書と組み合わせると、JDBCTYPE構成も自動的に生成できます。
ここで$ fieldlike {#{param_name}}この場合、複数のパラメーターがある場合、あいまいさはありません(または、曖昧さを排除するために、新しく定義された構成関数$ '{}は使用されます)ので、複数の条件を単純化できます。
$が好き{#{param_name、param_name2、param_name3}}}もちろん、互換性の範囲だけでなくなったより多くの掘りやすい単純化があるので、ここにはこれ以上進みません。
2。機能/ケースをデコード...いつ
Oracleのデコード関数は非常に便利で、構文は次のとおりです。
デコード(条件、値1、戻り値1、値2、戻り値2、...値n、戻り値n [、デフォルト値])
同等物の標準執筆:
値1の場合、値1を返す場合、値2を返す場合、値2を返します。
次に、$デコード構成関数を実装しましょう。
public class decadesqlconfigfunctionの拡張abstractsqlconfigfunction {@overridepublic string getname(){return "decode";}@overridepublic string eval(string databaseid、string [] args){if(args.length <3){shrow.throwexception(decode function( "decode function)"引数。 ");} if(" h2 ".equalsignorecase(databaseid)){//テスト時に、h2をオラクルの代わりに使用し、公式プログラムでoraclereturnに変更します"+tool.stling.join(args、 "、")+")";} ").Append(args [0]); int i = 2、l = args.length; for(; i <l; i = i+2){sb.append(" when ").append(args [i-1])。 sb.append( "else").append(args [l-1]);} sb.append( "end"); return sb.tostring();}}}}}次に、Schemahandlersを使用して、SQLMapperの構成を登録および変更します。
<選択id = "selectString" resultType = "string"> param_name、$ decode {#{paramname}、 '1'、 'a'、 '2'、 '2'、 'c'} bf_param_enum_def <if test = "null! jdbctype = varchar}} </if> </select>テストは次のとおりです。
(1)H2(OracleをH2に置き換える)
20161108 06:53:29,747 [main] - [debug] ==>準備:param_name、decode(?、 '1'、 'a'、 '2'、 'b'、 'c')bf_param_enum_def from '%' || | | | | '%'% '
(2)mysqlで
20161108 06:50:55,998 [Main] - [debug] ==>準備:param_name、case? '1' then 'a' whe '2' 'b' els 'c'はbf_param_enum_defからdecode_testとして終了しますparam_name like '%' ||?|| '%'
上記は、編集者が紹介したMyBatisのSQLMapper構成の拡張とアプリケーションの詳細な紹介です(1)。それがあなたに役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!