我看过指向解决方案的链接,但最相关的是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注入。
答案 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字符串。但是绑定参数变得更加乏味。