12

我想在 MyBatis 中为 Select 语句使用字符串参数。我的 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ültiger Tabbellenname(无效的表名)但它不是。当我打印出“databBaseTable”的值时,它就是表的确切名称。当我在没有变量的情况下将表的名称写入我的 mapper.xml 时,它可以工作。我做错了什么?

4

3 回答 3

31

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

但是,如果这样做,则不能将表名作为参数传递给selectList()调用。您需要将表名设置为属性。可以使用 MyBatis config.xml 中的元素设置属性,也可以<properties>直接在代码中使用Configuration.getVariables().

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

于 2012-08-01T13:31:00.027 回答
6

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

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

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

我有人可以回答为什么这会很好。但就目前而言,这真的帮助了我。

于 2012-08-01T13:52:27.177 回答
5

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

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

注意:顺便说一句:使用 #{..} 可以避免 sql 注入,但使用 ${..} 它确实为此类攻击打开了大门

于 2013-05-23T09:49:25.053 回答