(如何)我可以在 MyBatis 的 SQL 查询中安全且与数据库无关地使用“LIKE”吗?

2024-04-06

In MyBatis http://www.mybatis.org/,您可以标记参数应插入到 SQL 中的位置,如下所示:

从人员中选择 *,其中 id =#{id}

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

选择*从{表名}哪里 id = #{id}

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

从姓名类似的人中选择 *#{beginningOfName} || '%'

很遗憾但是,重要的数据库服务器不支持||连接语法 http://troels.arvin.dk/db/rdbms/#functions-concat:

MSSQL - 使用“+”运算符而不是“||”违反了标准。

...

MySQL - 通过重新定义 || 严重违反标准表示“或”。

所以,我可以做

从姓名类似的人中选择 *CONCAT(#{beginningOfName}, '%')

在本例中,仅限于 MySQL,或者我可以这样做

从姓名类似的人中选择 *'{beginningOfName}%'

并且必须自己清理输入。

有更优雅的解决方案吗?


你可以使用bind syntax

Quoting 官方文档 https://mybatis.github.io/mybatis-3/dynamic-sql.html

绑定元素允许您从 OGNL 表达式创建变量 并将其绑定到上下文。例如:

<select id="selectBlogsLike" resultType="Blog">
  <bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
  SELECT * FROM BLOG
  WHERE title LIKE #{pattern}
</select>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(如何)我可以在 MyBatis 的 SQL 查询中安全且与数据库无关地使用“LIKE”吗? 的相关文章

  • SQL 错误:1452:无法添加或更新子行:外键约束失败

    我的数据库中有两个表 order course order有一个专栏courseid哪个参考列id of the course桌子 每当我尝试做的时候saveAll in CakePHP以上SQL将显示错误并且不会保存数据 听起来是在数据库
  • 在日期 presto SQL 上运行总和

    我正在尝试使用 Presto SQL 根据下面的示例数据计算某个日期内 t 列和 s 列的累积总和 Date T S 1 2 19 2 5 2 1 19 5 1 3 1 19 1 1 我想得到 Date T S cum T cum S 1
  • 如何根据 Postgres 中的过滤条件更新深度嵌套的 JSON 对象?

    我有一张桌子mapping transform带有 JSONB 列content json包含类似的东西 meta mapping src up dest down 我想添加一个新的 JSON 条目 rule names some name
  • MySQL:如果该ip没有任何记录则插入

    I use INSERT INTO rating name user rating section ip VALUES name SESSION user rate section SERVER REMOTE ADDR 我想在 IF 语句中
  • 为每一表行创建一个 json

    我想从表中的数据创建 json 表格看起来像这样 code D5ABX0 MKT536 WAEX44 我正在使用 FOR JSON PATH 这很好 SELECT code FROM feature FOR JSON PATH 但是这个查询
  • 实体框架可以在本地工作,但不能在 azure 上工作

    我有一个在本地完美运行的网络项目 但是 当我更改 Azure 上发布的网站中的连接字符串以连接到 SQL Azure 上的数据库时 它将开始出现此错误 System Data Entity Infrastructure Unintentio
  • 包含对 char(13) 不满意

    为什么不会SSMS为我处理这个脚本 DECLARE containsReturn AS CHAR 500 email protected cdn cgi l email protection email protected cdn cgi
  • 为什么这个简单的 MySQL 查询不返回该行?

    我在表中有一行users与用户名test 但由于某种原因 此查询返回空结果集 SELECT id FROM users WHERE username test AND id null 但是 如果我删除 id null段 查询返回结果id 1
  • Java - oracle.jdbc.dcn.DatabaseChangeEvent - 获取更改的行

    我正在使用 oracle jdbc dcn DatabaseChangeEvent 来从 Oracle DB 获取事件通知 public class TListener implements DatabaseChangeListener p
  • 按 IN 值列表排序

    我在 PostgreSQL 8 3 中有一个简单的 SQL 查询 它捕获了一堆评论 我提供一个sorted的值列表IN构造在WHERE clause SELECT FROM comments WHERE comments id IN 1 3
  • 自动递增 SQL 值

    在我现在工作的一家公司的全球 DBA 的无限智慧中 他创建了一个表 该表采用 int 作为 ID 字段 但不会自动递增数字 我正在传递来自 Net 的表值参数 因为它在任何时间都会传递大约 100 行或更多行数据 并且我不想终止应用程序 破
  • Sql Server 2005 将列名放在方括号中

    我最近将数据库从 Sql Server 2000 迁移到 Sql Server 2005 在表设计器中 它坚持将方括号放在名为 Content 的列周围 我在 Sql Server 的保留字列表中没有看到 Content 所以我不明白它为什
  • 从集合类型 Oracle 12c 插入表 - ORA-00902: 无效数据类型

    我正在使用 Oracle 12 1 我以为我可以查询 12c 中的表类型 当我尝试执行此包时 我收到错误 ORA 00902 无效数据类型 我什至尝试使用强制转换多重集 但仍然出现同样的错误 我知道我们可以在数据库级别创建对象然后查询 但我
  • 物化视图与表:有什么优点?

    我很清楚为什么物化视图比仅查询基表更可取 不太清楚的是与仅创建另一个具有与 MV 相同数据的表相比的优势 MV 的唯一优势真的只是易于创建 维护吗 MV 不是相当于具有匹配架构的表和使用 MV SELECT 语句的 INSERT INTO
  • 根本原因 java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

    我有这个小代码用于将我的 jsp 连接到我的 mysql 数据库 String driver com mysql jdbc Driver Class forName driver String url jdbc mysql localhos
  • Oracle SQL:从表中选择数据和分区名称并截断分区

    这是一个由两部分组成的问题 1 是否可以根据数据所在的分区使用 select 语句检索其名称ROWID或者其他一些标识符 eg SELECT DATA ID CATEGORY VALUE PARTITION NAME FROM MYTABL
  • Oracle BLOB 与 VARCHAR

    我需要在表的一列中存储一个 大 SQL 查询 我想使用BLOB场地 需要明确的是 我想存储查询 而不是其结果 最好使用什么 BLOB or a VARCHAR 或者也许还有别的什么 另一种选择是 CLOB 对于文本数据 使用 CLOB 比使
  • 查询 ssisdb 以查找包的名称

    我正在查询 ssis 目录以找出目录中所有包的名称 Folder1项目中只有6个包 但查询却给出了9条记录 1 SELECT P NAME FROM SSISDB internal projects PRJ INNER JOIN SSISD
  • 使用 MOVE 确定 DB RESTORE 的 SQL 数据路径

    我正在尝试编写一个自动恢复数据库备份的脚本 我知道我可以使用以下 RESTORE 命令 RESTORE DATABASE DBRestoredName FROM DISK N C path to backup bak WITH FILE 1
  • 如何从 T-SQL 中的“/”分隔字符串中获取几乎最后一个子字符串?

    如果我有一个由用 字符分隔的其他字符串 xxx xxx xxx xxxx 组成的字符串 如何使用 t sql 获取最后一个和几乎最后一个 最后一个之前的 部分 它可能应该是 charindex 和 right 的某种组合 declare s

随机推荐