【问题标题】:Dynamic Select SQL statements with MyBatis使用 MyBatis 动态选择 SQL 语句
【发布时间】:2013-10-22 06:42:01
【问题描述】:

我想在 Oracle 12g 数据库中使用 mybatis 使用动态 sql 语句,我可以利用哈希映射添加如下条件:

<select id="getUsers" resultType="hashmap" parameterType="hashmap"> 
  select * 
  from users 
  <where> 
  <iterate var="i=0" increment> 
    ${columni} like #{valuei} 
  </iterate> 
  </where> 
</select> 

有没有办法让我完成这样的事情?

【问题讨论】:

  • 想不通 - 你的问题是什么?你读过mybatis的文档吗?您的场景看起来非常标准和简单。
  • 在文档mybatis.github.io/mybatis-3/dynamic-sql.html 中,您必须使用 if 语句指定列,而带有 foreach 的示例仅用于指定 IN 条件中的值。我想必须有另一种方法让我使用 foreach 完成我想要的。同样,我想要构建一个选择语句,我可以在其中动态使用列名和值名。
  • 问题答案及其用法可以在这里找到:mybatis-generic-stmt-example

标签: java sql oracle mybatis ibatis


【解决方案1】:

来自documentation

字符串替换

默认情况下,使用 #{} 语法将导致 MyBatis 生成 PreparedStatement 属性并根据 PreparedStatement 参数安全地设置值(例如?)。虽然这更安全、更快并且几乎总是首选,但有时您只想将未经修改的字符串直接注入 SQL 语句中。例如,对于ORDER BY,您可能会使用如下内容:

ORDER BY ${columnName}

这里 MyBatis 不会修改或转义字符串。

这使您可以例如将列名作为参数传递给查询等。

请记住始终清理您直接粘贴到 SQL 的数据。


如果您需要为WHERE 子句生成多个条件,请使用&lt;where&gt; 标签和内部&lt;foreach&gt;。请注意,&lt;foreach&gt; 具有允许指定分隔符、开始/结束字符串等的高级属性。结合我之前提到的${} 表示法,可以构建动态WHERE 子句。例如,请参阅this answer

【讨论】:

  • 但是如何添加多个 where 子句?如何迭代地图以创建 where 子句?我不想只放一个字符串。
  • 你为什么不在&lt;where&gt;标签内使用&lt;foreach&gt;?查看我的更新答案。
  • 谢谢。正是我需要的!
  • 很高兴我能帮上忙 :) 请记住接受对您有帮助的答案。
猜你喜欢
  • 2020-09-09
  • 1970-01-01
  • 2012-05-05
  • 2013-12-27
  • 2014-11-27
  • 2011-06-09
  • 1970-01-01
  • 2010-10-04
相关资源
最近更新 更多