MyBatis String 作为参数

2022-09-04 05:24:14

我想在 MyBatis 中使用 String 参数作为 Select 语句。我的映射器.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 Tabellenname(无效的表名),但事实并非如此。当我打印出“databBaseTable”的值时,它是表的确切名称。当我将表的名称写入映射器时.xml没有变量,它就可以工作。我做错了什么?


答案 1

使用代替“#”。不同之处在于,“#”用于预准备语句替换。“$”表示直接字符串替换。${dataBaseTable}

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

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


答案 2

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

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

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

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