В предыдущей статье я представил разницу между параметрами # {} и $ {} и разницей между # и $ в Mybatis. Если вам это нужно, вы можете обратиться к этому.
$ и # простое описание:
# эквивалентно добавлению двойных кавычек в данные, а $ эквивалентен непосредственному отображению данных.
1. Резюме
При использовании SQLMAP для запроса SQL в Mybatis часто необходимо для динамического передачи параметров. Dynamic SQL - одна из мощных особенностей Mybatis и важной причиной, по которой он превосходит другие рамки ORM. Перед предварительным компилированием оператора SQL Mybatis динамически проанализирует SQL и разрабатывает его в объект BoundSQL, который также обрабатывается здесь. На стадии динамического анализа SQL #{} и $ {} будут иметь разные выступления, и #{} будет проанализировано в маркер параметра для предварительного оператора JDBC.
#{} Проанализируется в заполнителю параметра? Полем $ {} - это просто замена чистой строки, а замена переменной будет выполняться на стадии динамического анализа SQL.
2. Описание ошибки
Передние параметры:
пропустить: 0
Взять: 10
Имя Рулена: A, B, c
Обработка бизнес -уровня:
Пакет SQL;/*** Front-End Front-End Multi-Select Parameters As SQL COMTET*/Public Class SQLUTIL {Private Final Static String Replacechar_comma = ","; частная конечная статическая строка Replacechar_semolon = ";"; "Abc"; system.out.println ("comma-sesparated:" + formatinstr (s1)); System.out.println ("Space-Separated:" + formatinStr (s2));} private Static String formatinstr (String Querystr) {return queryinstr (sliptquerystr (querystr); QueryStr) {if (null == QueryStr || "" .Equals (querystr.trim ())) return null; querystr = Querystr.replaceall (sqlutil.replacechar_comma, "") .Replaceall (Replacechar_Semolon, "); String QueryInstr (String [] QueryStrs) {if (null == QueryStrs || 0 == QueryStrs.length) return null; stringBuffer buf = new StringBuffer (); for (int i = 0; i <QueryStrs.length; i ++) {if (i! = 0) buf.append (","); buf.append ("''"). Append (querystrs [i]). Append ("''");} return buf.tostring ();}} Обработка слоя Mapper:
// Обработка ошибок <if test = "rulename! = Null и rulename! = ''"> И a.rule_name in (#{rulename}) </if> // Правильная обработка <if test = "rulename! = Null и правила! Описание журнала:
[DEBUG] [2016-08-02 17: 42: 42.226] [QTP1457334982-157] Java.SQL.Connection-==> Подготовка: SELECT A.Id, A.IS_VALID, A.Rule_lable, A.Rule_Name, A.Type, B.Sp_ID, B.Sp_Name, A.Rule_Name, C.Content, C.Content, C.Content, C.Content, C.Content, C. a.gmt_modified, a.ordering from idc_logistics_assign_rules a Left Join app_user c на c.work_no = a.modifier и c.is_deleted = 'n', idc_sp_info b, где a.is_deleted = 'n' и b.is_deleted = 'n' and a.sp_id = b.sp_id и a.rule_name in? [DEBUG] [2016-08-02 17: 42: 42.226] [QTP1457334982-157] java.sql.preparedStatement-==> Параметры: 'a', 'b' (String), 0 (Integer), 10 (Integer)
Анализ результатов: слой Mapper имеет предварительный SQL, и есть заполнители для #? , но он будет заменен непосредственно за $.
PS: при использовании порядка по динамическим параметрам при сортировке mybatis вам нужно обратить внимание на использование $ вместо #
Замена строки
По умолчанию, использование синтаксиса формата #{} заставляет Mybatis создать свойство предварительно обработанного оператора и установить безопасное значение с ним в качестве фона (например?). Это безопасно и быстро, и иногда вы просто хотите вставить строку, которая не изменяется непосредственно в оператор SQL. Например, например, заказ, вы можете использовать его так:
Кода -копия выглядит следующим образом:
Заказ по $ {columnName}
Здесь Mybatis не будет изменять и не избежать строк.
ВАЖНО: Небезопасно принимать вывод контента от пользователя и предоставлять его неизменной строке в операторе. Это может привести к потенциальным атакам инъекций SQL, поэтому вы не должны позволять пользователям вводить эти поля или обычно избегать и проверять их самостоятельно.