Все в основном знают, как использовать Mybatis для выполнения произвольного SQL. Метод использования очень прост, например, в xxmapper.xml:
<select id = "executesql" resultype = "map"> $ {_ parameter} </select>Вы можете назвать это следующим образом:
sqlSession.selectlist ("executesql", "select * from sysuser, где включено = 1");Или вы можете определить следующий метод в интерфейсе xxmapper.java:
List <Ap> executesQL (String SQL);
Затем используйте интерфейс, чтобы вызвать метод:
xxmapper.executesql ("select * из sysuser, где включено = 1");Все вышеперечисленное содержимое может быть, и следующее на основе этого немного сложнее.
Если вы хотите передать значение, используя метод параметра в SQL выше, то есть напишите его как enabled = #{anabled}, если вы не столкнулись с такими потребностями, вы можете не понимать, почему вы должны написать это так. Например, чтобы реализовать динамический запрос, вы можете настроить SQL на переднем плане и предоставить некоторые условия запроса, чтобы реализовать функцию запроса (для безопасности эти конфигурации должны быть разработаны или реализованы, и пользователи не могут управлять базой данных напрямую).
Для этой функции это довольно легко реализовать с помощью Mybatis. Настройка SQL должна быть выполнена. SQL может быть выполнен в упомянутом выше методе. Как предоставить параметры? Параметр является частью #{enabled} in enabled = #{enabled}. Если есть больше условий, настроенный SQL выглядит следующим образом:
Выберите * из sysuser, где enabled = #{enabled} и имя пользователя, как concat ('%', #{username}, '%')В этом случае, как я могу использовать Mybatis для его реализации?
Во -первых, XML изменяется следующим образом:
<select id = "executesql" resultype = "map"> $ {sql} </select>Методы в интерфейсе изменяются на:
List <Ap> executesQL (Map Map);
Затем вызовите метод:
Map map = new hashmap (); // SQL здесь соответствует $ {sql} map.put ("sql", "select * from sysuser"+ ", где antabled =#{anabled}"+ "и имя пользователя, как concat ('%',#{username}, '%')");//##{ended} map. 1); //#{username} map.put ("username", "admin"); // вставить список вызовов <map> list = xxmapper.executesql (map); // метод sqlSession вызовы SQLSession.selectlist ("executeQl", map);С помощью этого SQL вы можете предоставить пользователю включенное и имя пользователя. Эти два условия, очевидно, требуются. Если это необязательно, как мне это написать?
Может быть, кто -то подумал о том, можно ли использовать динамический SQL в Mybatis, использовать теги <if> и т. Д.?
Прежде чем ответить на этот вопрос, давайте посмотрим на код в DynamicsQlSource, который обрабатывает динамический SQL:
@Override public boundsql getBoundsql (объект parameterObject) {dynamicContext context = new DynamicContext (Configuration, ParameterObject); ROOTSQLNODE.Apply (контекст); sqlSourcebuilder sqlSourcesser = new sqlSourceBuilder (configuration); Object.class: parameterObject.getClass (); sqlSource sqlSource = sqlSourcesser.parse (context.getSql (), parameterType, context.getBindings ()); Boundsql boundsql = sqlsource.getboundsql (parameterobject); for (map.Entry <string, object> entry: context.getBindings ().Когда Mybatis обрабатывает динамический SQL, все динамические теги SQL будут обрабатываться как объекты SQLNode (RootsQlNode здесь), и те, которые содержат $ {}, также будут обрабатываться как объекты TextSqlNode. В первых двух строках вышеуказанного метода, где Mybatis обрабатывает динамический SQL.
Следовательно, если наш контент в $ {SQL} содержит вложенные теги, такие как $ {} и <if>, <где> и другие теги, когда Mybatis sackses xml к объектам sqlnode, xml <elect> элемент содержит только $ {sql}, и только $ {sql} будет парирован. Во время выполнения эта строка параметров может содержать теги, такие как $ {} и <if>, <где> и т. Д., Но это происходит после анализа Mybatis. Следовательно, когда это содержимое появляется как часть строки, они не будут специально обработаны. Они являются лишь частью SQL, и они просто выводятся как есть (поскольку база данных не распознает ее, она сообщит об ошибке) и не может быть обработана. Следовательно, он не может написать динамический SQL с помощью метода, который поставляется с Mybatis.
намекать
В приведенном выше коде:
sqlsourcesser.parse (context.getsql (), parametertype, context.getbindings ());
Этот кусок кода обрабатывает динамические параметры (#{}) после динамической обработки SQL, поэтому этот тип параметров может использоваться в SQL.
Поскольку вы не можете использовать метод Mybatis Dynamic SQL, как реализовать динамический SQL?
Вот простая идея. Используйте язык разметки шаблона в SQL для реализации динамического SQL (например, Freemarker). Перед тем, как SQL передается Mybatis для выполнения, используйте шаблоны для обработки SQL для генерации окончательного выполненного SQL (необходимо избежать обработки #{} параметров), и передайте этот SQL Mybatis для выполнения.
Возьмите пример шаблона Freemarker, и все же вышеуказанный SQL основан на:
выберите * из sysuser, где 1 = 1 <#if включен? && username! = ''> и имя пользователя, как concat ('%',#{username}, '%') </#if>Обратите внимание, что <#if> вот элемент Freemarker. Без учета инъекции SQL, вышеупомянутый SQL также может быть написан как:
выберите * из sysuser, где 1 = 1 <#if включен? && username! = ''> и имя пользователя, как '%$ {username}%' </#if>Разница - «%$ {username}%», потому что Freemarker также обработает $ {username}, а также заменит параметры здесь на фактическое значение.
В коде, называемом ранее, модификация заключается в следующем:
//# <enabled) map.put("enabled ", 1); //#{username} map.put (" username "," admin "); // SQL здесь соответствует $ {sql} string в xml sql =" Один из двух комплексных SQL выше "; // freemarker для процесса sqlSql map); // Поместите обработанную SQL в карту map.put ("sql", "select * from sysuser"+ "где enabled = #{anabled}"+ "и имя пользователя, как concat ('%', #{username}, '%')"); // execute list <map> = xxmapper.executesql (map);ПРИМЕЧАНИЕ. Метод ProcessSqlbyfreemarker состоит в том, чтобы обрабатывать строки SQL на основе данных на карте, и метод реализации можно искать самостоятельно.
На этом этапе реализована динамическая функция SQL, которая не очень сложна.
Интересно, есть ли больше жадных людей. Вы думаете, что возвращаемые значения, выше, - все это тип <карта> типа. Можете ли вы вернуть класс объектов, который я указал?
Например, на карте:
map.put ("class", "tk.mybatis.model.sysuser");Могу ли я сделать возвратное значение стать типом Sysuser таким образом? Поскольку эта статья заняла слишком много времени, я предоставлю решение здесь, а не углубленное.
Вы можете использовать перехватчик для его реализации. После получения MapedStatement, скопируйте копию, а затем изменяйте атрибут типа ResultMap в результатах, чтобы указать тип класса для вас. Легко сказать, но в реальной работе у вас может быть около 1/10 плагина PageHelper.
Поскольку эта статья была написана по просьбе моей жены, если у моей жены есть последние потребности, я помогу моей жене реализовать этот плагин, а затем поделиться этим.
Примечание. Если это динамическое обновление, вставьте, удалить оператор, вы можете изменить вышеупомянутое <SELECT> для обновления (не нужно использовать <leteTe> и <INSERT>) и использовать int для возвращаемого значения, что намного проще, чем SETECT.
Выше приведено подробное объяснение динамического оператора выполнения Mybatis, представленного вам редактором. Я надеюсь, что это будет полезно для вас. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит вам вовремя. Большое спасибо за вашу поддержку сайту wulin.com!