私はORMフレームワークMyBatisを使用しており、MyBatisでいくつかの一般的な機能を使用しています。今日、プロジェクト開発では、特定のテーブルの特定のフィールドなど、特定のテーブルのフィールドのクエリを制限する必要があるビジネスがあります。この場合、テーブル名とフィールド名を動的に渡すためにSQLを構築する必要があります。今、私は解決策を要約します、そして、私はそれが同じ問題に遭遇した私のパートナーに役立つことを願っています。
動的SQLは、MyBatisの強力な機能の1つです。 SQLステートメントを事前コンパイルする前に、MyBatisはSQLを動的に解析し、BoundSQLオブジェクトに解析します。これもここで処理されます。 MyBatisでの#{}と$ {}の使用に最初に慣れてみましょう。
動的なSQL解析プロセスでは、#{}と$ {}の効果は異なります。
#{} JDBC事前補償ステートメントのパラメーターマーカーとして解析されました。
次のSQLステートメントに示されているように
select * fromユーザーwhere name =#{name};次のように解析されます
select * fromユーザーwhere name =?;;
#{}がパラメータープレースホルダーに解析されているのがわかりますか? 。
$ {}は純粋な文字列置換です。次のSQLステートメントなど、動的なSQL解析段階で可変交換が実行されます。
select * fromユーザーwhere name = $ {name};パラメーター「Sprite」を渡すと、SQLは次のように解析します。
select * from user where name = "sprite";
Precompilationの前にSQLステートメントに変数名が含まれていないことがわかります。
要約すると、$ {}の変数の交換段階は動的なSQL解析段階にあり、#{}の変数の置換はDBMSにあります。
#{}と$ {}の違いは、次のように要約できます。
#{}渡されたパラメーターを文字列として扱い、渡されたパラメーターに二重引用符を追加します
$ {}はsqlに渡されたパラメーターを直接表示し、見積もりは追加されません
#{}は成都でのSQL注入を防ぐことができますが、$ {}はSQL注入を防ぐことはできません
$ {}は、事前コンパイル前の変数に置き換えられており、SQL注入のリスクをもたらします。次のようにSQL
select * from $ {tablename} where name = $ {name}渡されたパラメーターTableNameがユーザーの場合。ユーザーを削除します。 - 、SQLダイナミック解析の後、事前コンパイル前のSQLは次のようになります。
[fromユーザー]を選択します。ユーザーを削除します。 -where name =?;
- その後の声明はコメントとして機能せず、私の友人と私は驚いた! ! !元のクエリステートメントには、実際に密かにテーブルデータを削除し、削除、削除、削除するSQLが含まれていることがわかりました。 ! !私は重要なことを3回言ったが、リスクがどれほど大きいか想像できる。
$ {}は、通常、データベースのテーブル名、フィールド名などを転送するために使用されます。
#{}を使用できる$ {}を使用しないようにしてください
上記の分析を通じてトピックに行くと、テーブル名とフィールド名を動的に呼び出す方法についていくつかのアイデアがあるかもしれないと思います。例は次のとおりです。
<select id = "getUser" resultType = "java.util.map" parametertype = "java.lang.string" statementType = "statement"> select $ {columns} from $ {tableName} where company_remark = $ {company} </select> select>動的コールテーブル名とフィールド名を実装するには、事前コンパイルを使用できません。 StatementType = "ステートメント" "を追加する必要があります。
StatementType:ステートメント(採用されていない)、準備(事前コンパイル)、または呼び出し可能な状態のいずれか。これは、それぞれステートメント、準備、またはcallablestatementを使用するようにMyBatisに指示します。デフォルト:準備。明らかに、ここではプリコンパイルを使用することはできません。それは非縮小に変更する必要があります。
第二に、SQLの変数の値は$ {xxx}であり、#{xxx}ではありません。
$ {}は渡されたパラメーターを直接表示してSQLを生成するためです。たとえば、$ {xxx}で渡されたパラメーターは文字列データです。
string name = "sprite"; name = "'" + name + "'";
要約します
上記は、編集者が紹介したMyBatisの動的コールテーブル名とフィールド名の解決策です。それがあなたに役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!
この記事は、http://www.yuanrengu.com/index.php/mybatis1021.htmlから複製されています