MyBatis String作为参数

时间:2012-08-01 13:13:43

标签: java database string mybatis

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

<select id="selectAll" parameterType="String" resultMap="fastXMLResultMap">
        SELECT CREATIONDATE, DOCUMENTID, TITEL, REGTITEL, INFORCEDATE, DOCTYPE
        FROM #{databBaseTable}
</select>

调用函数:

public List<FastXMLObject> selectAll(String databBaseTable) {

    SqlSession session = sqlSessionFactory.openSession();

    System.out.println("Table: "+databBaseTable);

    try {
        List<FastXMLObject> list = session.selectList("FastXMLObject.selectAll",databBaseTable);
        return list;
    } finally {
        session.close();
    }
}

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

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

3 个答案:

答案 0 :(得分:24)

使用${dataBaseTable}代替'#'。不同之处在于'#'用于PreparedStatement替换。 '$'用于直接字符串替换。

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

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

答案 1 :(得分:7)

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

<select id="selectAll" parameterType="String" resultMap="fastXMLResultMap">
        SELECT CREATIONDATE, DOCUMENTID, TITEL, REGTITEL, INFORCEDATE, DOCTYPE
        FROM ${value}
</select>

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

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

答案 2 :(得分:3)

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

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

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