Вопрос по mybatis, database, string, java – MyBatis String как параметр

8

Я хочу использовать параметр String для оператора Select в MyBatis. Мой 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 (неверное имя таблицы), но это не так. Когда я распечатываю значение «databBaseTable» это точное название таблицы. И когда я записываю имя таблицы в свой mapper.xml без переменной, она работает. Что я делаю не так?

Вы можете найти рабочий пример [здесь] [1] [1]:stackoverflow.com/a/43357454/2762716 Alexander Davliatov

Ваш Ответ

3   ответа
24

${dataBaseTable} вместо "#". Разница в том, что «#»; используется для замены PreparedStatement. & APOS; $ & APOS; для прямой подстановки строк.

Однако, если вы сделаете это, вы не сможете передать имя таблицы в качестве параметраselectList() вызов. Вам необходимо установить имя таблицы в качестве свойства. Свойства могут быть установлены с помощью<properties> элемент в MyBatis config.xml или непосредственно в коде с помощьюConfiguration.getVariables().

См. «Подстановка строк». раздел вMyBatis Docs.

Хорошо, я знаю, что вы имеете в виду, но я просто не могу понять, что я должен делать. Я должен добавить свойство объявления в мой config.xml, например:<properties resource="????"> <property name="databBaseTable" value="???"/> </properties>  Но каким должен быть мой ресурс и какова ценность? Я хочу установить значение динамически. Извините, но я совершенно новичок в этой теме. Metalhead89
Использование $ {dataBaseTable} напрямую может сделать ваш код открытым для внедрения, если вы не очищаете ввод.
Да, я пересекаю каталог со многими подкаталогами, и каждый подкаталог представляет собой имя таблицы базы данных. Таким образом, оператор Select From должен быть полностью динамичным. Как я писал ниже, я мог бы выяснить это с помощью $ {value}, но если вы знаете, как поместить более одного параметра String в вызывающую функцию, было бы неплохо, если бы к этому времени не было необходимости. Metalhead89
Чувак .. Спасибо за спасение моей жизни .. Я почти собирался умереть, чтобы понять, почему это не работает !! :( Я не заметил, что имею дело с таблицей, а не с ее данными.
<properties resource> загружает файл свойств.<properties><property>... помещает значение непосредственно в конфигурационный файл MyBatis xml. Насколько динамичным вам должно быть значение? Просто при запуске или за каждый вызов БД?
3

для которого нельзя указать имя таблицы в качестве параметра. С # {..} вы можете только параметризовать параметры оператора SQL.

Когда вы используете синтаксис $ {..}, MyBatis выполняет простую подстановку старых строк, поэтому вы можете свободно параметризировать практически любую часть SQL, которую вы желаете.

Примечание: как между прочим: с # {..} вы довольно защищены от SQL-инъекций, но с $ {..} это открывает двери для таких атак

6

я точно не знаю, почему это работает, но я просто использовал следующее для решения проблемы:

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

Я не устанавливал никаких свойств или что-то еще, это было просто изменениеFROM #{databBaseTable} вFROM ${value}

Я кто-то мог бы ответить, почему это работает хорошо. Но сейчас это действительно помогло мне.

Чувак, может, тебе стоит отдать должное AngerClown ?!
Это сработало для меня. Есть идеи о том, как это работает?
Набиль-Шам - Да, ответ @AngerClown должен быть принят.

Похожие вопросы