我已经看到指向解决方案的链接,但最相关的是 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 替换参数中的值。 但是当该值被替换时,查询就会变成下面的内容。
Select * from employee where emp_id in ('123,345,667,888');
这是一个无效的查询,因为 mybatis 在查询中添加了单引号。
我应该如何解决这个问题? 我无法连接这些值,因为为了防止 SQL 注入(inject)。
最佳答案
How to use Annotations with iBatis (myBatis) for an IN query? 中接受的答案给出了适用于 postgres 的解决方案,列表/数组的字符串表示形式由数据库传递和转换。 Oracle 不支持这一点。必须迭代该列表才能绑定(bind)每个值。
在我看来,您正在寻找的是动态 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 字符串。但绑定(bind)参数变得更加繁琐。
关于java - 如何在 SQL Provider 中使用带有 Mybatis Annotation 的 IN 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40525642/