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

标签 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 替换参数中的值。 但是当该值被替换时,查询就会变成下面的内容。

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/

相关文章:

java - java中set如何存储唯一数据

java - 使用NetBeans从Java项目制作可执行文件

java - 为什么service和dao的JDBC连接是一样的?

java - JDBC 中的负载平衡和复制

java - log4j JDBCAppender java.lang.ClassCastException

java - GAE/GWT 服务器端数据在实例之间不一致/不持久

java - 对于错误的配置抛出未经检查的异常是一个好主意吗?

sql - Oracle sqlplus - 定义没有属性但嵌套表的类型化表

mysql - JDBC锁: how to tell an exception is caused by lock timeout?

sql - 如何在 VIEW 输出子句中保留 "*"以便列跟踪表更改?