Примечание. Этот блог полностью отличается от текущего плагина Paging, поэтому рекомендуется проверить последний исходный код и документацию с помощью вышеуказанного адреса проекта, чтобы понять.
Я ранее беспокоился о запросе на страниц Mybatis, и я искал много связанных статей в Интернете, но я не использовал последний. Место для страниц полностью написано от руки с SQL и Count SQL, что очень хлопотно.
Позже, какое -то время я хотел написать реализацию страниц из Mybatis. Я написал реализацию для Languagedriver. Нет проблем с автоматической страницей, но общее количество запросов (счетов) все еще не может быть решено за один раз, и оно осталось нерешенным.
Недавно я должен снова использовать страницу. Ради удобства я должен написать общий класс страниц, поэтому я снова имею в виду большинство кодов мибатиса в Интернете.
На самом деле, давным -давно кто -то открыл реализацию источника на GitHub, поддерживая MySQL, Oracle и SQLServer, что аналогично приведенной выше ссылке и имеет более полное рассмотрение. Но я думаю, что слишком много классов слишком неприятны, поэтому я внедрил класс только с одним перехватчиком, который на самом деле можно разделить на два класса. Один из классов был написан мной как статический класс и помещен в перехватчик. Вы также можете извлечь класс страницы, чтобы облегчить использование страницы.
Давайте сначала поговорим о методе реализации. Этот плагин имеет только один класс: PageHelper.java
Подпись перехвата:
@Intercepts ({ @signature (type = ratemtHandler.class, method = "prepare", args = {connection.class}), @signature (type = resultsethandler.class, method = "handleresultsets", args = {atportion.class})})Подпись здесь имеет решающее значение для всей реализации и идеи. Во -первых, я перехватываю метод подготовки, чтобы изменить SQL Pagination и выполнять запрос подсчета. Затем я перехватываю метод HandlerSultssets, чтобы получить последний результат обработки и поместить результат в объект страницы.
Ниже приведен код для изменения страницы, которая является изменением данных Oracle. Если вы используете другие базы данных, вы можете изменить код здесь самостоятельно.
/ ** * Модифицируйте исходный SQL на страницу SQL * @param sql * @param page * @return */ private string buildpagesql (string sql, page page) {stringbuilder pagesql = new StringBuilder (200); pagesql.append ("select * from (select temp. *, rownum row_id from ("); pagesql.append (sql); pagesql.append (") temp, где rownum <=") .append (page.getendrow ()); pagesql.append ("), где row_id>") .append (page.gettrow (); вернуть pagesql.toString (); } Затем, в следующем методе SetPageParameter, оператор SELECT COUNT должен быть изменен в соответствии с типом базы данных:
// Общее количество записей строки string ountsql = "select count (0) from (" + sql + ")";Почему я не предоставляю поддержку различным базам данных? Я не думаю, что это необходимо. Некоторые базы данных не поддерживают пейджинг, и чем проще этот плагин, тем проще для разработчиков понимает и изменяется. Модификация его в нужный запрос на страницу, который вам нужен, определенно не является проблемой.
Наконец, дополняется полный код (продолжение чтения, есть также метод использования ниже): (Нажмите, чтобы загрузить)
пакет com.mybatis.util; Импорт org.apache.ibatis.executor.parameter.parameterhandler; Импорт org.apache.ibatis.executor.resultset.resultsethandler; Импорт org.apache.ibatis.executor.statement.statementHandler; Импорт org.apache.ibatis.mapping.boundsql; Импорт org.apache.ibatis.mapping.mappedStatement; Импорт org.apache.ibatis.plugin.*; Импорт org.apache.ibatis.reflection.metaobject; импорт org.apache.ibatis.reflection.systemmetaobject; Импорт org.apache.ibatis.scripting.defaults.defaultParameterHandler; Импорт org.apache.log4j.logger; Импорт java.sql.*; импортировать java.util.list; импортировать java.util.properties; /*** mybatis-Универсальный страниц Перехватчик* @author liuzh/abel533/isea* Создан Liuzh на 14-4-15. */ @Intercepts ({ @Signature (type = atportionAndler.class, method = "prepare", args = {connection.class}), @Signature (type = resultsethandler.class, method = "handleresultstestes", args = {atervice.class})}) Общественный класс Imptressem Logger.getLogger (pageHelper.class); public static final threadlocal <gear> localpage = new Threadlocal <GARE> (); / ** * Start Paging * @param pagenum * @param pagesize */ public static void Startpage (int pagenum, int pagesize) {localpage.set (новая страница (pagenum, pageize)); } /*** Завершите пейджинг и верните результат. Метод должен быть вызван, в противном случае LocalPage будет сохранена до следующей стартовой страницы * @return */ public Static Page Endpage () {page page = localpage.get (); localpage.remove (); вернуть страницу; } @Override public Object Intercept (vocation vocation) бросает throwable {if (localpage.get () == null) {return villocation.proceed (); } if (vocation.getTarget () exactionOf antagementHandler) {atpocationHandler atportionHandler = (ratportHandler) vocation.getTarget (); MetaObject MetaTatementHandler = SystemMetaObject.ForObject (atthipleHandler); // Отделение цепочки объекта прокси (поскольку целевой класс может быть перехвачен множественными перехватчиками, образуется множественное прокси -прокси, а следующие две петли // наиболее примитивный целевой класс могут быть разделены), в то время как (MetaTatementHandler.hasgetter («H»)) {Object object = metatementHandler.getValue ("h"); MetaTatementHandler = SystemMetaObject.ForObject (Object); } // Целевой класс, который разделяет последний прокси -объект, while (metaTatementHandler.hasgetter ("target")) {object = metastatementHandler.getValue ("target"); MetaTatementHandler = SystemMetaObject.ForObject (Object); } MapedStatement MapedStatement = (MapedStatement) metaTatementHandler.getValue ("Delegate.MappedStatement"); // Информация о странице if (localpage.get ()! = Null) {page page = localpage.get (); Boundsql boundsql = (boundsql) metastatementhandler.getvalue ("delegate.boundsql"); // Параметр страницы как свойство параметра -параметрирования sql = boundsql.getsql (); // переписать SQL String PagesQL = buildPagesQL (SQL, Page); // Переписать пейджинг SQL MetaTatementHandler.SetValue ("Delegate.boundsql.sql", Pagesql); Connection Connection = (Connection) vocation.getArgs () [0]; // сбросить общее количество страниц в параметрах пейджинга и т. Д. SetPageParameter (SQL, соединение, отображение Statatement, BoundsQl, Page); // передавать права на выполнение следующему перехвату return vocation.proceedceed (); } else if (vocation.getTarget () exanceof resultsethandler) {object result = vocation.proceed (); Страница страницы = localpage.get (); page.setResult (((список) результат); результат возврата; } return null; } / ** * Только перехватывает эти два типа * ratectHandler * resultsethandler * @param target * @return * / @override public object plugin (объект цели) {if (target ancome histhandler || target instanceof resultsethandler) {return plugin.wrap (target, this); } else {return target; }} @Override public void setProperties (свойства свойства) {} / ** * Модифицируйте исходную SQL на страницу SQL * @param sql * @param Page * @return * / private String BuildPagesQL (String SQL, Page Page) {StringBuilder Pagesql = new StringBuilder (200); pagesql.append ("select * from (select temp. *, rownum row_id from ("); pagesql.append (sql); pagesql.append (") temp, где rownum <=") .append (page.getendrow ()); pagesql.append ("), где row_id>") .append (page.gettrow (); вернуть pagesql.toString (); } / ** * Получить общее количество записей * @param sql * @param connection * @param mapedstatement * @param boundsql * @param page * / private void setpageparameter (String sql, соединение соединения, сопоставление Stappatement MapedStatement, BoundSQL Boundsql, Page Page) {// Общее количество записей string our counttatement = "selectscl boundsql, page page) {// count rescl string string ourttsql =" selectscl (scept stage) {// count rescl string string structql = "selectsql. ")"; Подготовленное Statatement countstmt = null; Результат RS = NULL; try {countstmt = connection.prepareStatement (countsql); Boundsql Countbs = new Boundsql (mapedStatement.getConfiguration (), gountsql, boundsql.getParameterMappings (), boundsql.getParameterObject ()); SetParameters (CountStmt, MapedStatement, Countbs, Boundsql.getParameterObject ()); rs = countstmt.executequery (); int totalCount = 0; if (rs.next ()) {totalCount = rs.getint (1); } page.settotal (totalCount); int totalPage = totalCount / page.getPagesize () + ((totalCount % page.getPagesize () == 0)? 0: 1); Page.SetPages (TotalPage); } catch (sqlexception e) {logger.error ("игнорировать это исключение", e); } наконец {try {rs.close (); } catch (sqlexception e) {logger.error ("игнорировать это исключение", e); } try {countstmt.close (); } catch (sqlexception e) {logger.error ("игнорировать это исключение", e); } } } /** * Substitute parameter value* @param ps * @param mappedStatement * @param boundSql * @param parameterObject * @throws SQLException */ private void setParameters(PreparedStatement ps, MappedStatement mappedStatement, BoundSql boundSql, Object parameterObject) throws SQLException { ParameterHandler parameterHandler = new DefaultParameterHandler (MapedStatement, ParameterObject, BoundSQL); ParameterHandler.SetParameters (PS); } / **! частный int pageSize; Частный int startrow; частный int endrow; частный длинный общий объем; частные страницы; частный список <e> результат; Общественная страница (int pagenum, int pagesize) {this.pagenum = pagenum; this.pageize = pagesize; this.startrow = pagenum> 0? (Pagenum - 1) * PageSize: 0; this.endrow = pagenum * pagesize; } public List <e> getResult () {return result; } public void setResult (list <e> result) {this.Result = result; } public int getPages () {return Pages; } public void set -setPages (int pages) {this.pages = pages; } public int getendRow () {return endrow; } public void setendRow (int endrow) {this.endrow = endrow; } public int getPagenum () {return pagenum; } public void setPagenum (int pagenum) {this.pagenum = pagenum; } public int getPageSize () {return PageSize; } public void setPagesize (int pageSize) {this.pagesize = pagesize; } public int getStartRow () {return starTrow; } public void setStartrow (int startrow) {this.startrow = startrow; } public long getTotal () {return total; } public void Centotal (Long Total) {this.Total = otting; } @Override public String toString () {return "page {" + "pagenum =" + pagenum + ", pageize =" + pagesize + ", startrow =" + startrow + ", endrow =" + endrow + ", total =" + total + ", pages =" + pages + '}'; }}} Чтобы использовать этот перехватчик, вам сначала необходимо настроить перехватчик в конфигурации Mybatis:
<blicins> <плагин receptor = "com.mybatis.util.pagehelper"> </plugin> </plugins>
При настройке перехватчика вам необходимо обратить внимание на местоположение плагинов. Порядок плагинов заключается в следующем:
Свойства?, Настройки?
Наконец, есть пример кода (уровень службы), который вызывает этот метод:
@Override public pageHelper.page <SysloginLog> findSySloginLog (строка Loginip, String usernate, String logindate, String uditdate, String logerr, int pageNumber, int pageize) Throws BusinessException {pageHelper.StartPage (pageNumber, pageize); sysloginlogmapper.findsysloginlog (loginip, имя пользователя, logindate, exitdate, logerr); return pagehelper.endpage (); }Из вышесказанного мы видим, что использование этого плагина очень просто. Вам нужно только использовать методы стартовой страницы и конечной страницы PageHelper до и после запроса. Результат вызова промежуточного кода уже существует в результате PageHelper. Если вы звоните PageHelper в месте, которое возвращает результат, возвращаемый результат все еще остается списком, и вы можете просто воспользоваться первым значением (я думаю, что никто не будет использовать его в этом месте, конечно, нет ошибки таким образом).
Кроме того, все коды Mybatis между стартовой страницей и конечной страницей будут нанесены на страницу, и PageHelper сохранит только последний результат. Поэтому при его использовании вы должны убедиться, что в нем выполняется только один запрос Mybatis. Если есть несколько пейджинг, пожалуйста, используйте стартовую страницу и конечную страницу несколько раз.
Поскольку здесь представлены только реализации Oracle, я надеюсь, что читатели, которые ссылаются на другие базы данных, реализованные этим плагином Paging, также могут открыть исходный код.
Адрес проекта: http://xiazai.vevb.com/201612/yuanma/mybatis_pagehelper_jb51.zip
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.