Внедрить многоточный совместный запрос
Или создайте новый класс веб -сайта в рамках пакета David.mybatis.model, чтобы сохранить данные и переписать соответствующий метод ToString (), чтобы облегчить использование тестовых программ.
Пакет David.mybatis.model; import java.text.simpledateformat; import java.util.date; веб -сайт публичного класса {private int id; Приватное название строки; частный int visitorid; частный статус Int; частная дата создания времени; частный посетитель; public webse () {// todo с генерируемым конструктором CreateTime CreateMime = new Date (); Посетитель = новый посетитель (); } public webse (string name, int visitorid) {this.name = name; this.visitorid = visitorid; Посетитель = новый посетитель (); Статус = 1; createTime = new Date (); } public int getId () {return id; } public void setId (int id) {this.id = id; } public Vitor getVisitor () {return Vitor; } public void setVisitor (посетитель посетителя) {this.visitor = Visitor; } public String getName () {return name; } public void setName (string name) {this.name = name; } public int getStatus () {return Status; } public void setStatus (int status) {this.status = status; } public date getCreatetime () {return createTime; } public void setCreatetime (дата CreateTime) {this.createTime = createTime; } public int getVisitorId () {int id = 0; if (посетитель == null) id = visitorid; else id = visitor.getid (); вернуть идентификатор; } public void setVisitorId (int visitorid) {this.visitorid = visitorid; } @Override public String toString () {stringBuilder sb = new StringBuilder (string.format ("webse => {id: %d, имя: %s, createTime: %s}/r/n", id, имя, new simpledateformat ("yyy-mm-dd hh: mm: ss"). if (посетитель! = null) sb.append (string.format ("visitor => %s", visitor.toString ())); вернуть sb.toString (); }}Создайте соответствующие операционные интерфейсы под David.mybatis.demo:
Пакет david.mybatis.demo; import java.util.list; import David.mybatis.model.website; общественный интерфейс iwebsiteoperation {public int add (веб -сайт веб -сайта); public int delete (int id); Public Int Update (веб -сайт веб -сайта); Общественный запрос на веб -сайт (INT ID); Общественный список <Веб -сайт> getList (); }Создайте новый файл отображения WebsiteMapper.xml в папке 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.org/dtd/mybatis-3-mapper.dtd"> mapper. namespace = "david.mybatis.demo.iwebsiteoperation"> <sql id = "getListSql"> Select Id, имя, посетители, статус, CreateTime с веб -сайта, где статус> 0 </sql> <INSERT ID = "Добавить" ParameterType = "Веб -сайт" useGenceys = "true" keypropert ( #{Name}, #{visitorid}, #{status}, #{createTime}) </insert> <delete id = "delete" parameterType = "int"> удалить с сайта, где статус> 0 и id = #{id} </delete> <update id = "update" parameterType = " id =#{id} </update> <select id = "query" parametertype = "int" resultmap = "websiters"> select websity.id siteid, сайт. Webse.status> 0 и webse.id =#{id} < /select> <resultMap type = "webse" id = "websiters"> <id column = "siteid" property = "id" /> <result column = "siteName" Property = "name" /> <result column = "propertive =" createTeTUM javaType="Visitor" resultMap="visitorRs" /> </resultMap> <resultMap type="Visitor" id="visitorRs"> <id column="visitorId" property="id" /> <result column="visitorName" property="name" /> </resultMap> <select id="getList" resultMap="websiteByVisitorIdRs"> <include refid="getListSql" /> </select> </mapper>То, о чем мы в основном говорим сегодня, это поиск. Теперь мы хотим запрашивать веб -сайт и собрать соответствующую информацию о посетителях вместе. Как это сделать? Вы можете обратиться к запросу в конфигурации и записать SQL для запроса таблицы ссылок.
Главное, что следует отметить, это то, что два свойства идентификатора и имени на объекте веб -сайта и посещения субъекта одинаковы. Следовательно, чтобы избежать ошибок отображения, перечислите соответствующие результаты запроса с различным псевдонимом, чтобы его можно было избежать при привязке.
Что бы я получил, если бы я настраиваю это как следующее?
<select id = "Query" parameterType = "int" resultMap = "websiters"> select website.id, websity.name sitename, vititor.id, vititor.name vitionorname, websity.status sateStatus, website.createTime siteCreateTime с сайта inner quister on viefit websitorid = visitor.id. Website.id=#{id}</select><resultMap type="Website" id="websiteRs"> <id column="id" property="id" /> <result column="siteName" property="name" /> <result column="siteStatus" property="status" /> <result column="siteCreateTime" property="createTime" /> <association property="visitor" javaType="Visitor" resultMap = "vitationOrrs" /> < /resultMap> <resultMap type = "visitor" id = "vitationOrrs"> <id column = "id" property = "id" /> <result column = "vistorname" property = "name" /> < /resultMap> Вы заметили, что идентификатор посетителя также стал 2. Если вы переключите местоположение сайта.id и vive.id, вы обнаружите, что результат снова изменился снова.
Таким образом, вам нужно дать псевдоним, чтобы избежать этой ситуации, поэтому вы обнаружите, что на самом деле есть только одна истина, которая является следующей:
Вы можете видеть, что метод результата Multi-Table обработки такой же, как и у отдельных таблиц. Это не что иное, как перечисление названия атрибута Javabean. Вы можете видеть, что в стойке регистрации есть еще одна карта результата в узле <srodemap> веб -сайта. Он представляет собой сущность, которая должна быть нанесена на карту визитной сущностью. Вы можете использовать следующий метод для создания ассоциаций.
<Association Property = "Visitor" javatype = "Visitor" resultMap = "vestingorrs" />
Посетитель - это название поля посещения на объекте веб -сайта. Имя должно быть последовательным. В противном случае, за исключением того, что нет никакого Getter для собственности с именем «XXX» в классе David.mybatis.model.website ', будет брошен. Это было описано в предыдущих главах. Конечно, если вы думаете, что это нормально, чтобы не гнездовать Resultmap, гнездование также связано с тем, что эта конфигурация может использоваться в другом месте, тогда она будет извлечена, что также является абстрактной идеей. Используйте идентификатор и результат в <SlustMap>, чтобы найти соответствующие отличия от официального веб-сайта: http://mybatis.github.io/mybatis-3/sqlmap-xml.html#result_maps
Таким образом, выйдет простой многоточный совместный запрос. Если есть более сложные сборы за деловой бизнес, некоторые модификации будут внесены на основе этого.
Логика эффекта страниц
То, о чем мы хотим поговорить о проблеме страниц, с которой мы часто сталкиваемся в бизнес -проблеме. При разработке веб -проектов мы часто используем отображение списка. Как правило, мы используем некоторые обще используемые элементы управления списками, такие как DataTables (я лично чувствую себя очень хорошо), и инкапсулированные элементы управления таблицей в простом пользовательском интерфейсе.
Идея: чтобы достичь эффекта подкидки в этих элементах управления, мы обычно передаем 2 параметры. Первое - это представление индекса текущей страницы (обычно начинающейся с 0), второе - это представление того, сколько бизнес -записей отображается на текущей странице, а затем передавать соответствующие параметры методу List <t> GetList (PagenateArgs Args). При наконец, реализуя пейджинг в базе данных, мы можем использовать ключевое слово Limit (для MySQL) для пейджинга. Если это сервер Oracle или SQL, все они имеют свою собственную функцию Rownum для использования.
Чтобы рассмотреть приведенные выше идеи, прежде всего, нам необходимо создать новый класс объектов страницы с именем Pagenateargs в Demo.mybatis.Model, как всегда, и класс Enum с именем SortDirectionEnum, который содержит текущий индекс страницы, сведущий, текущую страницу отображают бизнес -записи, и атрибут Pagestart указывает, какой элемент начинается. (Pagestart = pageIndex*pageSize), поскольку использование ограниченного ключевого слова состоит в том, чтобы представлять [ограниченный номер начала (не включенная), взять несколько элементов], поля сортировки OrderFieldstr, направление сортировки OrderDirectionStr, так что конкретное создание следующим образом:
Пакет David.mybatis.model;
/ * * Параметр Pagination Class */public Class pagenateargs {private int pageindex; частный int pageSize; Частный INT Pagestart; Private String OrderFieldStr; Private String OrderDirectionStr; public pagenateargs () {// todo Автогенерированный конструктор stub} public pagenateargs (int pageindex, int pagesize, строка orderfieldstr, string orderirectionstr) {this.pageindex = pageindex; this.pageize = pagesize; this.orderfieldstr = orderfieldstr; this.orderdirectionstr = ordervidectionstr; pagestart = pageIndex * pageSize; } public int getPageIndex () {return pageIndex; } public int getPageStart () {return pagestart; } public int getPageSize () {return PageSize; } public String orderfieldstr () {return orderfieldstr; } public String getOrderDirectionStr () {return ordervictionstr; }} Пакет David.mybatis.model;/ * * Сортировка Enum */public enum sortDirectionEnum {/ * * ascending */asc,/ * * спуск */desc}После завершения вышеуказанных шагов мы продолжаем добавлять общедоступный список метода <посетителя> GetListBypagenate (Pagenateargs Args) в класс интерфейса Ivisitoroperation. В предыдущих главах у нас уже есть метод GetList. Эта страница на самом деле является лишь небольшим изменением, основываясь на этом. После того, как класс интерфейса Ivisitoroperation изменился, он выглядит следующим образом:
Пакет david.mybatis.demo; импортировать java.util.list; import david.mybatis.model.pagenateargs; импорт david.mybatis.model.visitor; import.mybatis.model.visitorwithrn; public visitoroperation { /************************* /** Добавить посетителя*/ public int add (посетитель посетителя); /** Удалить посетителя*/ public int delete (int id); /** Обновление посетителя*/ public int update (посетитель посетителя); /** Запрос Посетителя*/ Public Vitator Query (INT ID); / * * Список запросов */ public list <visitor> getList (); / * * Список запросов на страниц */ public list <посетитель> GetListBypagenate (PagenateArgs Args); }Далее мы должны начать изменять наш файл конфигурации vitistormapper.xml, добавить новый идентификатор идентификатора и параметров <seact> и тип параметра, чтобы настроить его в соответствии с предыдущими главами. Новый идентификатор, добавленный здесь, GetListBypagenate. После конфигурации следующее
<? 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. <!-Использовать generatedKeys = "true" означает, использовать ли последовательность самоотраска, keyProperty = "id" Указывает, какой столбец является столбцом по самооценку, параметры ParameterType = "Visitor" Указывает соответствующий тип, переданный в определении в классе интерфейса IvisitorPeration-> <insert id = "add" parameterType = "userEner visorEner visorTekeS =" udERTEKES = "uDERTEREKES =" udERTEREKES = "udERTEREKEYSE =" udERTEREKEYSE = ". Into Vitor (имя, электронная почта, статус, createtime) values ( #{name}, #{email}, #{status}, #{createTime}) </insert> <delete id = "delete" parametertype = "int"> delete из посетителя, где статус> 0 и id = {id} </delete udete 'update " #{name}, email =#{email}, status =#{status} где id =#{id} и status> 0; </update> <select id = "Query" parameterType = "int" reculatyPe = "Посетитель"> SELECT ID, имя, электронная почта, статус, CreateTime из посетителя, где id =#{id} и статус> 0 Порядок по идентификатору </select> <select id = "basicQuery" ParameterType = "int" receledType = "vesitor"> select * select * is visitor wher############################################## </select> <select id = "getList" resultMap = "vitationOrrs"> <includ refiD = "getListSql"/> </select> <sql id = "getListSql"> SELECT * из посетителя, где статус> 0 </sql> <!- Ниже приведена новая часть для пансификации. OrderBysQL извлекается, например, повторное использование позже-> <resultMap type = "Visitor" id = "vitationOrrs"> <id column = "id" property = "id" /> <result column = "name" Property = " /> <result column =" email "propertive =" Email " /> <result column =" status = " /> <result column =" createMime " /" createMime " />" /> " />" /> " />" /"createMem id = "getListBypagenate" parameterType = "pagenateargs" resultype = "visitor"> select * from (inclact refid = "getListSql" /> <includ refid = "orderBysql" />) t <!- #{} означает parmetrized вывод, $ {} означает, что прямой вывод не выполняет любые операции Essect, это сами, at at yte aTrag, vat start aTrag, vat start at vecart aTragt aTrag, vat at vectra ext at vecratized aTrag. PageSize> -1 "> Limit #{pagestart}, #{pagesize} </if> </select> <sql id =" orderbysql "> заказа $ {orderfieldstr} $ {orderdirectionstr} </sql> </mapper>Вы найдете аналогичные конфигурации на рисунке ниже. Все атрибуты поля здесь согласуются с именами атрибутов в классе параметров Pagenateargs.
<if test = "pagestart> -1 и pagesize> -1"> Limit #{pagestart}, #{pagesize} </if>Создайте метод испытания в классе DeMorun:
/** Параметры страниц*/public static void QueryVisitorListWithPagenate (int pageIndex, int pageSize, String orderfield, String OrderDire) {pagenateArgs args = new Pagenateargs (PageIndex, PageSize, OrderField, OrderDire); SQLSession Session = mybatisutils.getSqlSession (); Visitoroperation voperation = session.getmapper (ivisitoroperation.class); Список <посетители> посетители = voperation.getListBypagenate (args); для (посетитель посетителя: посетители) {System.out.println (посетитель); } Mybatisutils.closesession (Session); Mybatisutils.showmessages (crud_enum.list, vitestors.size ());}Demorun.queryvisitorlistwithpagenate (0, 100, "id", sortdirectionenum.desc.tostring ());
После запуска результаты теста отсортированы в обратном порядке в идентификаторах. В таблице посетителей есть 14 записей.
Предположим, мы возьмем 5 штук на странице 2 и выполняем следующие 6-10 частей данных, поэтому просто передайте параметры.
Demorun.QueryVisitorListWithPagenate (1, 5, «id», sortDirectionEnum.desc.toString ());
Результаты следующие:
Это логика пейджинг, которую я реализовал сам ~^0^. Вам нужно отметить, что я не вынес никакого суждения на поле OrderFieldstr здесь. Теоретически, необходимо справиться с ним, чтобы предотвратить передачу неправильных имен столбцов. Однако сейчас в Интернете должна быть готовая инкапсуляция, чтобы вы также могли пойти в Google. Вот просто способ продемонстрировать, как использовать пейджинг Mybatis.
После завершения этого, потому что это MySQL, у него нет собственного идентификатора последовательности Rownum в результате запроса. Следовательно, это может быть не очевидно при проверке тестовых данных. Если вам не нужно торопиться, мы можем сделать это самостоятельно, чтобы восполнить еду и одежду и преобразовать вышеупомянутый метод. Здесь я создам совершенно идентичный объект для посетителя в пакете моделей и принесу дополнительный идентификатор Rownum, возвращаемый постоянством параметра Rownum, следующим образом:
Пакет David.mybatis.model; import java.text.simpledateformat; импорт java.util.date; открытый класс Visitorwithrn {private int id; Приватное название строки; Приватная строковая электронная почта; частный статус Int; частная дата создания времени; Частный Int Rownum; public Vitorwithrn () {// todo автоматически сгенерированный конструктором CreateTime = new Date (); } public VitorWithrn (string name, string email) {this.name = name; this.email = электронная почта; this.setStatus (1); this.createtime = new Date (); } public int getId () {return id; } public void setName (string name) {this.name = name; } public String getName () {return name; } public void setEmail (string email) {this.email = email; } public String getEmail () {return Email; } public date getCreatetime () {return createTime; } public int getStatus () {return Status; } public void setStatus (int status) {this.status = status; } public int getRownum () {return rownum; } public void setRownum (int rownum) {this.rownum = rownum; } @Override public String toString () {// TODO Автогенерированный метод заглушка return string.format ("{rownum: %d, id: %d, имя: %s, createTime: %s}", rownum, id, имя, new sompledateformat ("yyyy-mm-dd hh: mm: ss"). }}В Ivisitoroperation создайте новый метод под названием Public List <visitorwithrn> GetListBypagenateWithrn (Pagenateargs Args). Аналогичным образом, нам нужно настроить соответствующий узел и скрипт <select> и скрипт в VitoMarpper. Единственное отличие здесь заключается в том, что нам нужно изменить сценарий SQL следующим образом:
<? 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. <!-Использовать generatedKeys = "true" означает, использовать ли последовательность самоотраска, keyProperty = "id" Указывает, какой столбец является столбцом по самооценку, параметры ParameterType = "Visitor" Указывает соответствующий тип, переданный в определении в классе интерфейса IvisitorPeration-> <insert id = "Add" ParameterType = "userEnerEperation =" vIserTekeS = "udERTEREKES =" udERTEREKES = "trueDepeS =" true "=" ud "udemerType =" Into Vitor (имя, электронная почта, статус, createtime) values ( #{name}, #{email}, #{status}, #{createTime}) </insert> <delete id = "delete" parametertype = "int"> delete из посетителя, где статус> 0 и id = {id} </delete udete 'update " #{name}, email =#{email}, status =#{status} где id =#{id} и status> 0; </update> <select id = "Query" parameterType = "int" reculatyPe = "Посетитель"> SELECT ID, имя, электронная почта, статус, CreateTime из посетителя, где id =#{id} и статус> 0 Порядок по идентификатору </select> <select id = "basicQuery" ParameterType = "int" receledType = "vesitor"> select * select * is visitor wher############################################## </select> <select id="getList" resultMap="visitorRs"> <include refid="getListSql" /> </select> <sql id="getListSql"> select * from Visitor where status>0 </sql> <resultMap type="Visitor" id="visitorRs"> <id column="Id" property="id" /> <result column="Name" property="name" /> <result Column = "Email" Property = "Email" /> <result Column = "status" Property = "status" /> <result column = "createTime" property = "createTime" /> < /resultMap> <select id = "getListBypagenate" parameterType = "pagenateargs" resultype = "from * from (inclate refid =" getLists ". RefID = "orderBysql"/>) t <!- #{} означает параметризованный выход, $ {} означает, что прямой выход не выполняет каких-либо операций побега, передайте его самостоятельно-> <if test = "pagestart> -1 и pageize> -1"> Limit #{pagestart}, #{PageSize} </if> </select> <! id="orderBySql"> order by ${orderFieldStr} ${orderDirectionStr} </sql> <!-- How to write SQL scripts with rownum--> <resultMap type="VisitorWithRn" id="visitorWithRnRs"> <id column="Id" property="id" /> <result column="Name" property="name" /> <result column="Email" Property = "email" /> <result column = "status" property = "status" /> <result column = "createTime" property = "createTime" /> <result column = "rownum" property = "rownum" /> < /resultMap> <select id = "getListBypagenAteWithrn" resultMap = "viSorWithRnrs"> <! Не выполняйте каких-либо операций побега, передайте его самостоятельно-> Select T.Rownum, T.Id, T.Name, T.Email, T.Status, T.CreatEtime от (<inclact refid = "getListSqlContainSrn" /> <inclact refiD = "orderBysql" />) t <if test = "pagestart> -1 и pageize> -11mitart # #{PageSize} </if> </select> <sql id = "getListSqlContainSrn"> SELECT @Rownum: = @rownum+1 rownum, result.id, result.name, result.email, result.status, result.createTime из (select @Rownum: = 0, visor. Следующая вещь остается, чтобы добавить метод испытания под DeMorun только сейчас, чтобы я не буду наклеить карту здесь. После завершения вы можете видеть, что 6-10 фрагментов данных только сейчас станут следующими