誰もが基本的にMyBatisを使用して任意のSQLを実行する方法を知っています。使用方法は、たとえばxxmapper.xmlで非常に簡単です。
<select id = "executesQl" resultType = "map"> $ {_ parameter} </select>次のように呼ぶことができます。
sqlsession.selectlist( "executesql"、 "select * from sysuser where enabled = 1");
または、xxmapper.javaインターフェイスで次の方法を定義できます。
list <Map> executesQl(String SQL);
次に、インターフェイスを使用してメソッドを呼び出します。
xxmapper.executesql( "select * from sysuser where enabled = 1");
上記のすべての内容はすべてである可能性があり、これに基づいて以下はもう少し複雑です。
上記のSQLでパラメーターメソッドを使用して値を渡す場合、つまり、有効=#{enabled}として記述する場合、そのようなニーズに遭遇していない場合は、なぜこのように書くべきなのか理解できないかもしれません。たとえば、動的クエリを実装するには、前景でSQLを構成し、クエリの機能を実現するためのクエリ条件を提供できます(安全のために、これらの構成を開発または実装する必要があり、ユーザーがデータベースを直接操作することは不可能です)。
この機能では、MyBatisで実装するのは非常に簡単です。 SQLの構成を実行する必要があります。 SQLは、上記の方法で実行できます。パラメーターを提供する方法は?パラメーターは、enabled =#{enabled}の#{enabled}パーツです。より多くの条件がある場合、構成されたSQLは次のとおりです。
select * from sysuser entabled =#{enabled}およびusername like concat( '%'、#{username}、 '%')この場合、MyBatisを使用してそれを実装するにはどうすればよいですか?
まず、XMLは次のように変更されます。
<選択id = "executesQl" resultType = "map"> $ {sql} </select>インターフェイス内のメソッドは次のように変更されます。
リスト<Map> executesQl(マップマップ);
次に、メソッドを呼び出します。
Map Map = new Hashmap(); 1); //#{username} map.put( "username"、 "admin"); // call list <map> list = xxmapper.executesql(map); // sqlsessionメソッドはsqlsession.selectlist( "executesql"、map);このSQLを使用すると、ユーザーに条件として有効およびユーザー名を提供できます。これらの2つの条件は明らかに必要です。オプションの場合、どのように書く必要がありますか?
たぶん、誰かがMyBatisで動的SQLを使用することが可能か、<if>タグを使用することができるかどうかについて考えたかもしれません。
この質問に答える前に、動的SQLを処理するDynamicsQLSourceのコードを見てみましょう。
@Override public bundsql getBoundSql(Object ParameterObject){dynamicContext Context = new DynamicContext(configuration、parameterobject); rootsqlnode.apply(context); sqlsourcebuilder sqlsourceparser = new sqlsourcebuilderder(new sqlsourcebuilderder(conforation); class < object.class:parameterobject.getClass(); sqlsource sqlsource = sqlsourceparser.parse(context.getSql()、parametertype、context.getbindings()); for(map.entry <string、object> entry:context.getbindings()MyBatisが動的SQLを処理すると、すべての動的SQLタグがSQLNode(RootsQlNode Here)オブジェクトとして処理され、$ {}を含むオブジェクトもTextSQLNodeオブジェクトとして処理されます。上記の方法の最初の2行では、MyBatisが動的SQLを処理する場所です。
したがって、$ {sql}のコンテンツに$ {}や<if>、<where>、その他のタグなどのネストされたタグが含まれている場合、mybatisがxmlをSQLNodeオブジェクトに分布する場合、XML <Select>要素には$ {sql}のみが含まれ、$ {sql}のみが含まれます。実行時に、このパラメーター文字列には$ {}や<if>、<where>などなどのタグが含まれている場合がありますが、これはmybatisの解析後に発生します。したがって、これらのコンテンツが文字列の一部として表示される場合、それらは特別に処理されません。それらはSQLの一部にすぎず、そのまま出力されます(データベースはそれを認識しておらず、エラーを報告します)、処理できません。したがって、MyBatisに付属するメソッドを介して動的なSQLを書き込むことはできません。
ヒント
上記のコードで:
sqlsourceparser.parse(context.getSql()、parametertype、context.getBindings());
このコードは、動的SQL処理後に動的パラメーター(#{})を処理するため、このタイプのパラメーターはSQLで使用できます。
MyBatis Dynamic SQLメソッドを使用できないため、動的SQLを実装する方法は?
これが簡単なアイデアです。 SQLでテンプレートマークアップ言語を使用して、動的SQL(FreeMarkerなど)を実装します。 SQLが実行のためにMyBatisに引き渡される前に、テンプレートを使用してSQLを処理して最終実行されたSQL(処理#{}パラメーターを回避する必要があります)を生成し、このSQLを実行のためにMyBatisに渡します。
フリーマーカーテンプレートの例を挙げてみると、上記のSQLは以下に基づいています。
Select * select sysuser where 1 = 1 <#if enabled ??> enabled =#{enabled} </#if> <#if username ?? && username!= ''> and username like concat( '%'、#{username}、 '%')</#if><#if>これがFreemarkerの要素であることに注意してください。 SQLインジェクションを考慮せずに、上記のSQLも次のように記述できます。
Select * select sysuser where 1 = 1 <#if enabled ??> enabled =#{enabled} </#if> <#if username ?? && username!= ''> and username like '%$ {username}%' </#if>違いは「%$ {username}%」です。Freemarkerは$ {username}も処理し、ここのパラメーターを実際の値に置き換えるためです。
前述のコードでは、変更は次のとおりです。
//# {enabled} map.put( "enabled"、1); //#{username} map.put( "username"、 "admin"); //ここのsqlは、xml sql = "の$ {sql}文字列に対応します。 map); //処理されたsqlをMap.put( "sql"、 "select * select * select * from sysuser"+ "where enabled =#{enabled}"+ "およびconcat( '%'、#{username}、 '%')")注:ProcessSQLBYFREEMARKERメソッドは、マップ内のデータに基づいてSQL文字列を処理することであり、実装方法は自分で検索できます。
この時点で、あまり複雑ではない動的なSQL関数が実装されています。
もっと貪欲な人がいるのだろうか。上記の返された値はすべてリスト<map>タイプであると思いますか。指定したエンティティクラスを返すことはできますか?
たとえば、マップ:
map.put( "class"、 "tk.mybatis.model.sysuser");
この方法で戻り値をsysuserタイプにすることはできますか?この記事には時間がかかりすぎたので、ここでは詳細ではなく解決策を提供します。
インターセプターを使用して実装できます。マッピングステートメントを取得した後、コピーをコピーしてから、結果マップの結果マップのタイプ属性を変更して、クラスタイプを指定します。言うのは簡単ですが、実際の操作では、PageHelperページングプラグインの約1/10を使用できます。
この記事は妻の要請で書かれたため、妻がこの最後の必要性を持っている場合、妻がこのプラグインを実装してから共有するのを手伝います。
注:ダイナミックアップデート、挿入、削除ステートメントの場合、上記の<select>を変更して更新(<delete>および<inters>を使用する必要はありません)。
上記は、編集者が紹介したMyBatis実行の動的SQLステートメントの詳細な説明です。それがあなたに役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!