На самом деле, одной из мощных особенностей Mybatis обычно являются его динамические возможности SQL. Если у вас есть опыт использования JDBC или других аналогичных рамок, вы понимаете, что он очень запутался, чтобы динамически объединять строки SQL вместе, убедитесь, что вы не забыли места и не опускаете запятые в конце списка. Динамический SQL в Mybatis может тщательно справиться с этой болью. Для динамического SQL самый простой способ-дать нам различные динамические суждения по поведению при жестком кодировании. В Mybatis мощный динамический язык SQL используется для улучшения этой ситуации, которая может использоваться при любом отображении операторов SQL. Динамические элементы SQL аналогичны использованию JSTL или другим аналогичным текстовым процессорам на основе XML. Mybatis использует мощные выражения на основе Ognl для устранения других элементов.
Несколько элементов узлов, которые мы обычно используем, включают в себя if, выберите (когда, иначе), обрезка (где, if) и foreach. Я чувствую себя немного похоже на использование XSLT (я упомяну об этом позже в статье ~).
(1) Использование if
В конфигурации страниц ViisitMapper, если PageIndex> -1 и PageSize> -1 будет добавлено соответствующий SQL Pagination, в противном случае он не будет добавлен (по умолчанию все взято), следующим образом:
<select id = "getListBypagenate" parameterType = "pagenateargs" recouttype = "visitor"> select * from (include refid = "getListSql" /> <includ refid = "orderbysql" />) t <!- #{} означает, что вывод, $ {} Средства, не выполняет любой Escape Opporcation, #{} test = "pagestart> -1 и pageize> -1"> Limit #{pagestart}, #{pagesize} </if> </select> <sql id = "getListSql"> select * из посетителя, где состояние> 0 </sql> <sql id = "orderbysql"> порядок.Поскольку наши параметры PageIndex и PageSize являются значениями int, мы можем выносить такие прямые суждения, как это. Если это экземпляр объекта, мы можем использовать Null Sudge для управления некоторой динамической логикой. Конкретное развитие зависит от потребностей бизнеса. Я думаю, что здесь важно отметить, что писать нелегко &&, это не будет признано в конфигурации ~.
(2) Использование выбора (когда, иначе)
Выберите в основном в сценариях приложений, которые соответствуют только одному из условий в нескольких условиях. Например, вот условие запроса, передача идентификатора, имя и создание времени соответственно. Предположим, когда мы запрашиваем таблицу посетителей, если у посетителя есть значение, используйте идентификационный запрос, и если Visitorname имеет значение, используйте запрос VisitName. Следующим образом, добавьте метод List <visitor> GetListChoosewhendemo (BasicQueryargs Args) в класс интерфейса David.mybatis.demo.ivisitoroperation. Добавьте соответствующую конфигурацию выбора узла в ViteorMapper:
Пакет david.mybatis.demo; import java.util.list; import david.mybatis.model.basicqueryargs; import david.mybatis.model.pagenateargs; импорт david.mybatis.model.visitor; импорт david.mybatis.model.visitorwithrn; publicator visistoropest visistoropest visistoropest visistor int add (посетитель посетителя); /** Удалить посетителя*/ public int delete (int id); /** Обновление посетителя*/ public int update (посетитель посетителя); /** Запрос Посетителя*/ Public Vitator Query (INT ID); / * * Список запросов */ public list <visitor> getList (); / * * Список запросов на страниц */ public list <посетитель> GetListBypagenate (PagenateArgs Args); / * * Список запросов на страницы (включая Rownum) */ public List <visitorwithrn> GetListBypagenateWithrn (Pagenateargs Args); /** Базовый запрос*/ public Vitor BasicQuery (int id); / * * Динамическое условие запрос (выберите, когда) экземпляр */ public list <visitor> getListChoosewhendemo (basicQueryArgs args); / * * Динамическое условие запроса (где, if) экземпляр */ public list <visitor> GetListWheredEmo (BasicQueryArgs args); / * * Динамический запрос (foreach) экземпляр */ public list <visitor> getListforeChdemo (list <Integer> ids); }
<? xml version = "1.0" Encoding = "UTF-8"?> <! Doctype Mapper public "-// mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> mapper stightspace =" david.mybatis. <resultMap type = "visitor" id = "vitatorrs"> <id column = "id" property = "id" /> <result column = "name" property = "name" /> <result column = "email" property = "email" /> <result column = "status =" status " /> <result column =" createTime "createTime" /> < /resultMap> <sqlIst -й идентификатор gateListme = " /> < /resultMap> <sqlistmes weptim Из посетителя </sql> <!-Выберите, когда будет выполнено одно из условий-> <select id = "getListChoseWhendemo" resultMap = "vitationOrrs" parameterType = "basicQueryArgs"> <Cult RefID = "getListSqlConditions"/> <where> <if test = "QueryStatus> 0">#{Query QueryStAts> <fereStatus> 0 "> 0" Test = "QueryId! = 0"> и id = #{QueryId} </when> <when test = "QueryName! = Null"> и имя как #{QueryName} </when> <exut> и createTime> = #{QueryTime} </inety> </selet> </where> </selet> </mapper>(3) Использование того, где if (trim)
Преимущество того, где ключевые слова состоит в том, что если есть соответствующие условия фильтра, он знает, чтобы вставить, где ключевые слова в соответствующее время. И также знает, когда удалить соответствующие и или или разъемы, в основном дело со следующими сценариями
<SELECT ID = "findActiveBloglik" ResultType = "blog"> select * из блога, где <if test = "state! = null"> state = #{state} </if> <if test = "title! = null"> и заголовок как #{название} </if> <if test = "author! = null и Author.name!Это не станет результатом неудачи всех условий
<select id = "findActiveBloglike" resultType = "blog"> select * из блога, где </select>
Или поскольку первое условие не выполнено, последующее условие выполняется только.
<select id = "findActiveBloglike" resultType = "blog"> SELECT * из блога, где и заголовок, как 'Someitle' </select>
Поэтому для этого мы можем создать выбор при примере условия, и добавить соответствующий метод публичного списка <visitor> getListWheredEmo (BasicQueryArgs Args) в класс интерфейса IvisitorOperation и добавить соответствующую конфигурацию в файл конфигурации Visitormapper следующим образом:
<? xml version = "1.0" Encoding = "UTF-8"?> <! Doctype Mapper public "-// mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> mapper stightspace =" david.mybatis. <sql id = "getListSqlConditions"> select * из посетителя < /sql> <!-Добавить операции, если условия выполнены-> <select id = "getListwheredemo" resultMap = "Vitestorrs" parameterType = "basicQueryargs"> <Cult RefID = "getListSqlConditions" /> <lhance> <fice> "QueRyStTAT>" QUERYSTTAT> <fice> "QueRyStTAT> </if> <if test = "QueryId> 0"> и id =#{QueryId} </if> <if test = "QueryName! = null"> и имя как =#{QueryName} </if> <if test = "QueryTime! prefixoverrides = "и | или"> <if test = "QueryStatus> 0"> status> 0 </if> <if test = "QueryId> 0"> и id =#{QueryId} </if> <if test = "QueryName! = null"> и название как =#{QueryName} </if test = "QueryTime! CreateTime> =#{QueryTime} </if> </trim> -> </select> </mapper>(4) Использование Foreach
В обычно используемой динамической SQL у нас есть бизнес -сценарий, в котором идентификатор в большой строке идентификаторов. В этом случае мы можем использовать Foreach без необходимости усердно работать, чтобы разбить идентификационную строку. Тот же шаг - добавить соответствующий метод в общедоступный список класса интерфейса IvisitoroPeration, а затем настроить соответствующую информацию о элементе узла в соответствующем файле Mapper, следующим образом:
<? xml version = "1.0" Encoding = "UTF-8"?> <! Doctype Mapper public "-// mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> mapper stightspace =" david.mybatis. <sql id="getListSqlConditions"> select * from Visitor </sql> <!-- Foreach Loop Conditions--> <select id="getListForeachDemo" resultMap="visitorRs"> <include refid="getListSqlConditions"/> where status>0 and id in <foreach collection="list" item="item" index="index" open="(" separator="," close = ")"> $ {item} </foreach> </select> </mapper>Наконец, вам нужно только установить соответствующий метод испытаний в DeMorun, и динамический SQL в Mybatis будет завершен. Метод DeMorun, используемый для теста ниже
/** Динамический экземпляр Форита запроса*/ public static void getListheachDemo (list <Integer> ids) {sqlsession session = mybatisutils.getsqlsession (); Visitoroperation voperation = session.getmapper (ivisitoroperation.class); List <visitor> ls = voperation.getListaReachDemo (ids); для (посетитель посетителя: ls) {System.out.println (посетитель); }} /** Динамический запрос, где если экземпляр* / public static void getListwhereCondition (INT ID, имя строки, дата Createtime) {name = name == ""? NULL: имя; SQLSession Session = mybatisutils.getSqlSession (); BasicQueryArgs args = new BasicQueryArgs (ID, имя, CreateTime); Visitoroperation voperation = session.getmapper (ivisitoroperation.class); Список <visitor> ls = voperation.getListwheredemo (args); if (ls.size () == 0) System.out.println ("Проверьте совпадение!"); else {for (посетитель посетителя: ls) {System.out.println (посетитель); }}} /** Динамический запрос Выберите, когда экземпляр* / public static void getListChoseWhendemo (int id, name name, date createTime) {name = name == ""? NULL: имя; SQLSession Session = mybatisutils.getSqlSession (); BasicQueryArgs args = new BasicQueryArgs (ID, имя, CreateTime); Visitoroperation voperation = session.getmapper (ivisitoroperation.class); List <visitor> ls = voperation.getListChoosewhendemo (args); if (ls.size () == 0) System.out.println ("Проверьте совпадение!"); else {for (посетитель посетителя: ls) {System.out.println (посетитель); }}}
PS: О ognl
Ognl-это аббревиатура языка навигации объектного графа. С точки зрения языка: это мощный язык выражения, используемый для получения и установки свойств объектов Java. Он направлен на то, чтобы обеспечить более высокий синтаксис абстракции для навигации по графам объектов Java. Ognl имеет приложения во многих местах, таких как:
Язык привязки как элементы графического интерфейса (Textfield, Combobox и т. Д.) Для моделирования объектов.
Таблица базы данных для источника данных Data Data Swing.
Язык привязки для веб -компонентов и объектов фоновой модели (Webognl, гобелен, веб -работа, WebObjects).
В качестве более выразительной альтернативы Jakarata Commons Beanatils или JSTL -языку выражения.
Кроме того, есть много вещей, которые можно сделать в Java, которые также можно сделать с помощью OGNL, таких как сопоставление списков и выбор. Для разработчиков, используя Ognl, вы можете использовать краткий синтаксис для завершения навигации объектов Java. Вообще говоря, навигация информации о объекте завершается по «пути». Этот «путь» может быть атрибутом к бобов Java, объектом, индексированным в коллекции и т. Д., Вместо того, чтобы непосредственно использовать метод GET или SET.