20

MyBatisでは、次のように、SQLにパラメーターを挿入する場所をマークします。

SELECT * FROM Person WHERE id = #{id}

この構文は、特にSQLインジェクション攻撃を回避するために、適切なエスケープなどをアクティブにします。入力を信頼していて、エスケープをスキップしたい場合は、パラメーターを逐語的に挿入できます。

SELECT * FROM {tableName} WHERE id =#{id}

ここで、安全でない入力に対してLIKE検索を実行したいので、実行したいのは次のとおりです。

SELECT * FROM Person WHERE name LIKE #{beginningOfName} || '%'

ただし、残念ながら、重要なDBサーバーは連結の構文をサポートしていません||

MSSQL-「||」の代わりに「+」演算子を使用して標準を破ります。

..。

MySQL-再定義することで標準をひどく破る|| ORを意味します。

だから、私はどちらかを行うことができます

SELECT * FROM Person WHERE name LIKE CONCAT(#{beginningOfName}、'%')

この場合はMySQLに限定されます。

SELECT * FROM Person WHERE name LIKE '{beginningOfName}%'

入力を自分でサニタイズする必要があります。

よりエレガントな解決策はありますか?

4

10 に答える 10

15

バインド構文を使用できます

公式文書の引用

bind要素を使用すると、OGNL式から変数を作成し、それをコンテキストにバインドできます。例えば:

<select id="selectBlogsLike" resultType="Blog">
  <bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
  SELECT * FROM BLOG
  WHERE title LIKE #{pattern}
</select>
于 2015-05-19T07:28:18.273 に答える
12

通常、これは%、SQL以外で使用している言語に関係なく、パラメーターを渡す前にパラメーター自体にを追加することによって行われます。ただし、どちらの方法でも、検索語に_またはが含まれている可能性がある場合は、エスケープ手順を実行する必要がある場合があることに注意してください%。背景については、たとえばこの質問を参照してください。)

一般的な連結の問題を修正するには、MySQLをANSI sql_modeに入れると、演算子が適切にサポートされ、||文字列リテラルではなくスキーマ名の二重引用符が正しく処理されます。

(それができない場合は、またはのいずれ||かからステートメントを作成する関数を作成しCONCAT()、違いを抽象化する必要があります。)

于 2011-09-20T20:32:43.383 に答える
7

mybatisを使用している場合は、これをs用に記述できます。

SELECT(" * ");
FROM(" student ");
WHERE(" ten LIKE '%' #{ten} '%' ");
于 2018-07-30T08:48:10.260 に答える
6

if内のバインドインクルード

<select id="select" parameterType="java.util.Map" resultType="ViajeDTO">

SELECT A.ID_VIAJE ID, A.NOMBRE, A.DESCRIPCION, A.FINICIO, A.FFIN, A.LOGO, A.URL, 
        A.ID_CLIENTE IDCLIENTE, B.NOMBRE CLIENTE
FROM VIAJE A
INNER JOIN CLIENTE B ON (A.ID_CLIENTE = B.ID_CLIENTE)
WHERE A.ESTATUS = 1 

<if test="P_NOMBRE != null">
    <bind name="pattern" value="'%' + P_NOMBRE + '%'" />
      AND A.NOMBRE LIKE #{pattern}
</if>
</select>
于 2017-05-19T16:31:48.113 に答える
2

Bindを利用できます。bind要素を使用すると、式から変数を作成し、それをコンテキストにバインドできます。例えば:

<select id="select" parameterType="java.util.Map" resultType="ViajeDTO">

    <bind name="pattern" value="'%' + P_NOMBRE + '%'" />

    SELECT A.ID_VIAJE ID, A.NOMBRE, A.DESCRIPCION, A.FINICIO, A.FFIN, A.LOGO, A.URL, 
            A.ID_CLIENTE IDCLIENTE, B.NOMBRE CLIENTE
    FROM VIAJE A
    INNER JOIN CLIENTE B ON (A.ID_CLIENTE = B.ID_CLIENTE)
    WHERE A.ESTATUS = 1 

    <if test="P_NOMBRE != null">
        AND A.NOMBRE LIKE #{pattern}
    </if>
</select>

検索するパラメータがP_NAMEであることを考慮に入れてください。

于 2017-02-20T23:00:47.117 に答える
1

これは機能します:

SELECT * FROM Person WHERE name LIKE '%' + #{beginningOfName} + '%';
于 2020-10-15T14:14:09.080 に答える
1
SELECT("*");
FROM(Dao.TableName);
WHERE(Dao.TableFields.URL + " LIKE LOWER('%' || #{url} || '%') ");
于 2021-09-01T11:41:05.203 に答える
0

バインド機能はmybatisバージョン3.2以降で利用できます。それより下のバージョンの場合:-Mysqlで次のことが機能しました。concat関数を使用しました。

<select id="getUserNamesAndEmails" parameterType="com.ashish.cardservices.models.UserCreds" resultMap="userCreds">
        select name,email from users where upper(name) like concat("%",concat(upper(#{searchQuery}),"%")) or upper(email) like concat("%",concat(upper(#{searchQuery}),"%")) and upper(email) != upper(#{email}) ;
</select>
于 2020-10-11T16:35:32.540 に答える
-1

mybatisアノテーション@Select

SQLサーバーの場合"...LIKE'%' +#{param} +'%' ..."

for ORACLE "... LIKE'%' ||#{param} ||'%' ..."

参照:https ://mybatis.org/mybatis-3/java-api.html

于 2020-08-05T15:19:17.497 に答える
-2

||オペレーターはIBatisで働いていましたが、Mybatisでは働いていませんでした。

MyBatisでは+演算子を使用する必要がありました。

SELECT *
FROM Employee
WHERE
name like '%' + #{searchName,jdbcType=NVARCHAR} + '%'
于 2012-01-24T16:36:31.883 に答える