Я использовал структуру ORM Mybatis, и я использовал некоторые общие функции в Mybatis. Сегодня, в разработке проекта, существует бизнес, который требует ограничения пользователей от полей запроса в определенных таблицах и отображены определенные поля, такие как определенные поля в определенной таблице, не разрешаются запросить пользователи. В этом случае необходимо создать SQL для динамического передачи имен таблиц и имен поля. Теперь я суммирую решение, и я надеюсь, что оно будет полезно для моих партнеров, которые столкнутся с той же проблемой.
Dynamic SQL - одна из мощных особенностей Mybatis. Перед предварительным компилированием операторов SQL Mybatis динамически будет анализировать SQL и разобрать его в объект BoundSQL, который также обрабатывается здесь. Давайте сначала ознакомитесь с использованием #{} и $ {} в Mybatis:
В процессе динамического анализа SQL эффекты #{} и $ {} разные:
#{} Проанализирован как маркер параметра для предварительного оператора JDBC.
Как показано в следующем операторе SQL
выберите * из пользователя, где name = #{name};Будет проанализировано как:
Выберите * из пользователя, где имя =?
Вы видите #{} быть проанализированным в заполнителю параметра? Полем
$ {} - это просто замена чистой строки. Замена переменной будет выполнена на стадии динамического анализа SQL, например, следующее оператор SQL:
выберите * из пользователя, где имя = $ {name};Когда мы передаем параметр «спрайт», SQL будет анализироваться как:
выберите * из пользователя, где name = "sprite";
Вы можете видеть, что оператор SQL перед предварительным обязательством больше не содержит имя переменной.
Таким образом, этап замены переменной $ {} находится на стадии динамического анализа SQL, в то время как замена переменной #{} находится в СУБД.
Разница между #{} и $ {} может быть суммирована просто следующим образом:
#{} рассматривает пропущенный параметр как строку и добавляет двойную цитату к падебшему параметру
$ {} будет непосредственно отображать пропущенные параметры в SQL, и кавычки не будут добавлены.
#{} может предотвратить инъекцию SQL в Чэнду, но $ {} не может предотвратить инъекцию SQL
$ {} был заменен переменными перед предварительным комплемацией, что представляет риск инъекции SQL. Следующим образом SQL
Выберите * из $ {TableName}, где name = $ {name}Если пропущенное параметр таблицы является пользователем; Удалить пользователя; -Затем после динамического анализа SQL SQL до предварительного комплемента станет:
выберите * из пользователя; Удалить пользователя; - Где имя = ?;
-Последующие заявления не будут работать как комментарии, и мои друзья и я были ошеломлены! ! ! Вы видели, что исходное заявление запроса фактически тайно содержит SQL, который удаляет данные таблицы, которые должны удалять, удалять, удалять! ! ! Я сказал важные вещи три раза, и вы можете представить, насколько велик риск.
$ {} обычно используется для передачи имени таблицы, имени поля и т. Д. Базы данных.
Попробуйте не использовать $ {}, где вы можете использовать #{}
Переходя к теме, через приведенный выше анализ, я считаю, что у вас могут быть некоторые идеи о том, как динамически вызовать имена таблиц и имена поля. Примеры следующие:
<select id = "getUser" resultype = "java.util.map" parametertype = "java.lang.string" atportiontype = "ratement"> select $ {columns} от $ {tableName}, где company_Remark = $ {Компания} </select>Чтобы реализовать имена таблиц динамических вызовов и имена поля, нельзя использовать предварительное обязательство. Вам нужно добавить attervitytype = "оператор" ".
atputortype: любое из операторов (непреодолимого), подготовленного (предварительно скомпилированного) или вызовов, которое говорит Mybatis использовать оператор, подготовку или CallableStatement соответственно. По умолчанию: подготовлен. Очевидно, что предварительное обязательство здесь не может быть использовано, оно должно быть изменено на непреустройство.
Во -вторых, значение переменной в SQL - $ {xxx}, а не #{xxx}.
Поскольку $ {} предназначен непосредственно отображать прошедшие параметры для генерации SQL, например, параметры, передаваемые в $ {xxx}, являются строковыми данными, кавычки должны быть добавлены до передачи параметра, например:
String name = "sprite"; name = "'" + name + "'";
Суммировать
Выше представлено решение для динамического имени таблицы динамических вызовов Mybatis и имя поля, введенное вам редактором. Я надеюсь, что это будет полезно для вас. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит вам вовремя. Большое спасибо за вашу поддержку сайту wulin.com!
Эта статья воспроизведена из: http://www.yuanrengu.com/index.php/mybatis1021.html