12

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に書き込むと、機能します。私は何を間違えますか?

4

3 に答える 3

31

${dataBaseTable}「#」の代わりに使用します。違いは、「#」が PreparedStatement 置換に使用されることです。「$」は文字列の直接置換用です。

selectList()ただし、これを行うと、テーブル名をパラメーターとして呼び出しに渡すことができなくなります。テーブル名をプロパティとして設定する必要があります。プロパティは<properties>、MyBatis config.xml の 要素を使用して設定するか、 を使用してコードで直接設定できますConfiguration.getVariables()

MyBatis Docsの「文字列置換」セクションを参照してください。

于 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 に答える