在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 - 通过重新定义||严重打破了标准 表示OR.
所以,我也可以
SELECT*FROM Person WHERE name LIKE CONCAT(#{beginningOfName},'%')
在这种情况下,只限于MySQL,或者我可以做到
SELECT*FROM Person WHERE name LIKE '{beginningOfName}%'
并且必须自己清理输入.
有更优雅的解决方案吗?
bob*_*nce 11
通常,这是通过%在传入参数之前添加参数本身来完成的,无论您在SQL之外使用何种语言.但请注意,无论哪种方式,如果您的搜索字词可能包含_或%在其中,您仍可能需要执行转义步骤.有关背景,请参阅此问题.)
为了解决一般的连接问题,将MySQL放入ANSI sql_mode并获得对||运算符的适当支持,以及正确处理模式名称的双引号而不是字符串文字.
(如果你不能做到这一点你必须建立一个功能,打造出既声明||或CONCAT(),抽象掉的差异.)
Bar*_*cki 10
您可以使用绑定语法
引用官方文档
bind元素允许您从OGNL表达式创建变量并将其绑定到上下文.例如:
<select id="selectBlogsLike" resultType="Blog">
<bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
SELECT * FROM BLOG
WHERE title LIKE #{pattern}
</select>
Run Code Online (Sandbox Code Playgroud)
小智 7
如果你用的是mybatis,你可以为s写这个
SELECT(" * ");
FROM(" student ");
WHERE(" ten LIKE '%' #{ten} '%' ");
Run Code Online (Sandbox Code Playgroud)
小智 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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
41642 次 |
| 最近记录: |