20

MyBatis中,您标记应该将参数插入 SQL 的位置,如下所示:

SELECT * FROM Person WHERE id = #{id}

此语法激活适当的转义等,以避免 SQL 注入攻击等。如果您有受信任的输入并且想要跳过转义,则可以逐字插入参数:

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

现在,我想对不安全的输入进行 LIKE 搜索,所以我想做的是:

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

然而不幸的是,重要的数据库服务器不支持||连接的语法

MSSQL - 通过使用“+”运算符而不是“||”来打破标准。

...

MySQL - 通过重新定义严重违反标准 || 意思是或。

所以,我可以做

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 中,您将获得对运算符的适当支持||,以及正确处理模式名称而不是字符串文字的双引号。

(如果您不能这样做,则必须构建一个函数来从||or中构建语句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} + '%' ...”

对于 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 回答