MyBatis String作为参数

我想在MyBatis中为Select语句使用String参数。 我的mapper.xml:

 SELECT CREATIONDATE, DOCUMENTID, TITEL, REGTITEL, INFORCEDATE, DOCTYPE FROM #{databBaseTable}  

和调用函数:

 public List selectAll(String databBaseTable) { SqlSession session = sqlSessionFactory.openSession(); System.out.println("Table: "+databBaseTable); try { List list = session.selectList("FastXMLObject.selectAll",databBaseTable); return list; } finally { session.close(); } } 

字符串dataBaseTable是我的数据库的表的名称(谁会想到),因为我想从verious表中动态获取数据。

但不幸的是,这不起作用:错误:ORA-00903:UngültigerTabellenname(表名无效)但它不是。 当我打印出“databBaseTable”的值时,它就是表的确切名称。 当我将表的名称写入我的mapper.xml而没有变量时,它可以工作。 我做错了什么?

使用${dataBaseTable}而不是’#’。 不同之处在于’#’用于PreparedStatement替换。 ‘$’用于直接字符串替换。

但是,如果执行此操作,则无法将表名作为参数传递给selectList()调用。 您需要将表名称设置为属性。 可以使用MyBatis config.xml中的元素或使用Configuration.getVariables()直接在代码中设置

请参阅MyBatis文档中的“字符串替换”部分。

好吧我绝对不知道为什么会这样,但我只是使用以下来解决问题:

  

我没有设置任何属性或其他东西,只是从FROM #{databBaseTable}更改为FROM ${value}

我有人可以回答为什么这个工作会很好。 但是现在这对我很有帮助。

使用#{..}语法,MyBatis使用jdbc PreparedStatement对象,您无法在该对象上将表名指定为参数。 使用#{..},您只能参数化sql语句的参数。

当你使用$ {..}语法时,MyBatis会执行普通的旧字符串替换,因此你可以自由地参数化你想要的sql的任何部分。

注意:顺便说一下:使用#{..}你可以非常安全地从sql注入,但是使用$ {..}它确实打开了这种攻击的大门