JDBI在引号内的查询中使用@bind作为变量

时间:2013-05-31 21:08:40

标签: objectquery jdbi

我想知道这是否可行,如果是的话,我确定它是一个简单的解决方案,我似乎无法弄清楚

@SqlQuery("SELECT * FROM Table WHERE column LIKE '%:thingName%'")
public Set<Things> getThings(@Bind("thingName", String thingName)

基本上对于这个玩具示例,我试图选择一个列包含[任何文本] thingName [anyText]的行。当使用如上所述时,我认为引号模糊了绑定变量,因此它实际上查找[任何文本] :thingName [anyText]而不是我的绑定变量。

提前谢谢你, 麦德兰

2 个答案:

答案 0 :(得分:19)

我使用concat用%符号包围输入,同时仍然使用绑定变量来避免SQL注入:

@SqlQuery("select * from atable where acolumn like concat('%',:thingName,'%')")
public Set getNames(@Bind("thingName") String thingName);

答案 1 :(得分:12)

似乎必须将'%'百分比添加到绑定变量:

@SqlQuery("SELECT * FROM Table WHERE column LIKE :thingName")
public Set<Things> getThings(@Bind("thingName") String thingName); // where thingName = "%" + thingName + "%"

另请参阅:https://groups.google.com/forum/?fromgroups#!topic/jdbi/EwUi2jAEPdk

Brian McCallister引用

  

使用:foo绑定东西创建一个预准备语句,并在这种情况下绑定name的值。您需要将%作为绑定值的一部分,或者您不需要对预准备语句使用绑定。

     
      
  • 方法1(更安全,通常更好):   “select ... from foo where name like:name”并绑定值(“%”+ name)

  •   
  • 方法2(打开你的SQL注入):

  •   
     

“从foo中选择...其中名称如'%'”和define(“name”,name)(或在sql对象中,(@ define(“name”)名称) - 将名称作为文字放入你的陈述。

     

关键是%字符是您正在测试的的一部分,而不是语句的一部分。