Java MyBatis字符串作为参数

Java MyBatis字符串作为参数,java,database,string,mybatis,Java,Database,String,Mybatis,我想在MyBatis中为Select语句使用字符串参数。 My mapper.xml: <select id="selectAll" parameterType="String" resultMap="fastXMLResultMap"> SELECT CREATIONDATE, DOCUMENTID, TITEL, REGTITEL, INFORCEDATE, DOCTYPE FROM #{databBaseTable} </select>

我想在MyBatis中为Select语句使用字符串参数。 My 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 Tabellenname表名无效,但它不是。当我打印出DatabaseTable的值时,它就是表的确切名称。当我将表名写入mapper.xml而不使用变量时,它会起作用。 我做错了什么?

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

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


请参阅。

中的“字符串替换”部分。好的,我确实不知道为什么会这样,但我只是使用以下方法来解决问题:

<select id="selectAll" parameterType="String" resultMap="fastXMLResultMap">
        SELECT CREATIONDATE, DOCUMENTID, TITEL, REGTITEL, INFORCEDATE, DOCTYPE
        FROM ${value}
</select>
我没有设置任何属性或其他内容,只是从{databasetable}更改为${value}


我想有人可以回答为什么这样做会很好。但就目前而言,这确实帮助了我。

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

当您使用${..}语法时,MyBatis会执行普通的旧字符串子项,这样您就可以自由地参数化所需sql的几乎任何部分


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

好的,我知道您的意思,但我真的不知道我必须做什么。我应该向config.xml添加ad属性,如:但是我的ressource应该是什么,它的值是什么?我想动态地设置这个值。对不起,我对这个话题完全陌生。加载属性文件。。。将值直接放入MyBatis配置xml中。您需要该值具有多大的动态性?是的,我正在遍历一个包含许多子目录的目录,每个子目录代表数据库的一个表名。因此,SELECTFROM语句必须是完全动态的。正如我在下面所写的,我可以用${value}来解决这个问题,但是如果你知道如何将多个字符串参数放到调用函数中,那就太好了,如果现在还不需要的话。。谢谢你救了我的命。。我差点就要死了,只是为了弄明白为什么它不起作用!!:我没有注意到我处理的是表,而不是它的数据。如果您不清理输入,直接使用${dataBaseTable}可以使您的代码开放注入。伙计,也许您应该将功劳归于AngerClown?!Nabil Sham-是的,@AngerClown的答案应该被接受。你可以找到工作示例[here][1][1]:你能指出myBatis PreparedStatement在哪一行向那些{…}注入值吗?我正在学习myBatis的源代码。。。