MyBatis String作为参数

Met*_*d89 8 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>
Run Code Online (Sandbox Code Playgroud)

和调用功能:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Ang*_*own 24

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

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

请参阅MyBatis文档中的"字符串替换"部分.


Met*_*d89 7

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

<select id="selectAll" parameterType="String" resultMap="fastXMLResultMap">
        SELECT CREATIONDATE, DOCUMENTID, TITEL, REGTITEL, INFORCEDATE, DOCTYPE
        FROM ${value}
</select>
Run Code Online (Sandbox Code Playgroud)

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

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

  • 老兄,也许你应该把它归功于AngerClown?! (10认同)

joh*_*hnm 5

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

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

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