如何在SQL Provider中使用带有Mybatis Annotation的IN子句

时间:2016-11-10 10:45:40

标签: java oracle jdbc mybatis ibatis

我看过指向解决方案的链接,但最相关的是How to use Annotations with iBatis (myBatis) for an IN query? 但即使这样也无法为Oracle驱动程序提供解决方案。

public String getEmployees(Map<String, Object> params){

//Value hold by params    params={empId={123,345,667,888}}

StringBuilder sql=new StringBuilder();
sql.append("Select * from employee where emp_id in (#{empId}"); 

Mybatis取代了params的值。 但是当值被替换时,查询会变成下面的内容。

Select * from employee where emp_id in ('123,345,667,888');

这是一个无效的查询,因为mybatis在查询中添加了单引号。

如何修复此问题? 我无法连接值,因为要阻止SQL注入。

1 个答案:

答案 0 :(得分:2)

How to use Annotations with iBatis (myBatis) for an IN query?中接受的答案为postgres提供了一个解决方案,列表/数组的字符串表示由数据库传递和转换。 Oracle不支持这一点。列表必须是iterared以绑定每个值。

在我看来,您正在寻找的是动态SQL,在下一个答案中由 LordOfThePigs 解释。适应这种情况将是:

@Select({"<script>",
         "SELECT *", 
         "FROM employee",
         "WHERE emp_id IN", 
           "<foreach item='emp' collection='empId'",
             "open='(' separator=', ' close=')'>",
             "#{emp}",
           "</foreach>",
         "</script>"}) 
List<Employee selectEmployees(Map<String, Object> params);

@SelectProvider 提供用Java构建的SQL字符串。但是绑定参数变得更加乏味。