В начале проекта мне нужно было использовать пейджинг Mybatis. Я читаю много плагинов в Интернете. Фактически, принципы реализации в основном одинаковы, но большинство из них дают только код и имеют неполные аннотации. Поэтому я сослался на многие статьи (каждая статья крадет небольшой код, оценивает мой собственный и полуфаризирует ее), а затем я подражал и написал плагин с пейджингом, подходящий для моего проекта. Без лишних слов я только что загрузил код. По сравнению с большинством статей, аннотации очень полны.
Самый важный перехватчик
пакет com.dnkx.interceptor; Импорт java.sql.*; импортировать java.util.hashmap; импортировать java.util.properties; Импорт 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.interceptor; Импорт org.apache.ibatis.plugin.intercepts; Импорт org.apache.ibatis.plugin.invocation; Импорт org.apache.ibatis.plugin.plugin; Импорт org.apache.ibatis.plugin.signature; Импорт org.apache.ibatis.reflection.metaobject; импорт org.apache.ibatis.reflection.systemmetaobject; Импорт com.dnkx.pojo.page; /** * * * * * * * Принцип Pageging Pagingis реализуется с использованием перехватчиков: * Для использования JDBC для работы в базе данных вы должны иметь соответствующий объект оператора. Прежде чем MyBatis выполнит оператор SQL, он будет генерировать объект оператора, содержащий оператор SQL, и соответствующий оператор SQL* генерируется до оператора, поэтому мы можем начать с оператора SQL, используемого для генерации оператора, прежде чем он генерирует оператор. В операторе Mybatis оператор генерируется методом подготовки объекта RoutingStatementHandler. Следовательно, одной из идей для использования перехватчика для реализации подготовки Mybatis является перехват метода подготовки интерфейса оператора handler, а затем изменить оператор SQL в соответствующий оператор Pagination запрос SQL в методе Interceptor, а затем вызовут метод Prepare объекта * atemberHandler объекта, то есть вызов вызовов. * Для страниц одна из операций, которые мы должны выполнить в перехватчике, - подсчитать общее количество записей, которые соответствуют текущим условиям. Это получает исходное оператор SQL, изменение его на соответствующий статистический оператор, а затем заменить параметры в операторе SQL, используя инкапсулированные параметры Mybatis и параметры настройки *. Затем, оператор SQL, запрашивающий количество записей, выполняется для подсчета общего количества записей. ** Объясните несколько классов, которые могут использоваться в подключателе:* MetaObject: класс, предоставленный MyBatis, на основе объекта, который возвращает значение свойства* Boundsql: В этом вы можете получить SQL для выполнения, и параметры, которые будут использоваться для выполнения SQL* MapedStatement: это может получить значение ID For For For For For For For For For FOREDESTEDESTEDESTEDESTEDESTEDESTEDESTEDESTED. Пейджинг памяти. * ParameterHandler: он используется в Mybatis для замены значения, которое появляется в SQL. * * @author li xiaogui 9 ноября 2016 г. 10:59:04 */ @Intercepts ({@Signature (type = antagementHandler.class, method = "prepare", args = {connection.class}), @signature (type = resultsethandler.class, method = "handleresultsets", args = {athortice.class}). Interceptor {// Intercept Ключевое слово Paging Private Static Final String Select_id = "page"; // Код, запускаемый плагином, заменит оригинальный метод и переписывает наиболее важное перехват @override public obstect incept inception (invocation vlocation) throws {if (vocation.gettarget () exantef atember handler) {// Здесь у нас есть настройка, если метод запроса содержит страницу, Paging Fething waging waging waging waging waging waging waging waging) MetaObject metaObject = SystemMetAobject.ForObject (ratementHandler); MapedStatement MapedStatement = (MapedStatement) metaObject.getValue ("Delegate.MappedStatement"); String selectId = mapedStatement.getId (); String methodname = selectId.subString (selectId.lastIndexof (".")+1) .tolowerCase (); // Затем судья, если страница включена, получите sql if (methorname.contains (select_id)) {boundsql boundsql = (boundsql) metaobject.getvalue ("delegate.boundsql"); // Параметр странификации является свойством параметрового параметра. System.out.println ("Get SQL:"+SQL); Hashmap <string, object> map = (hashmap <string, object>) (boundsql.getParameterObject ()); // page page = (page) (boundsql.getParameterObject ()); Страница страницы = (страница) map.get ("page"); // Переписать SQL String Countsql = concatCountsql (sql); String pagesql = concatpagesql (sql, page); // System.out.println ("Переписать счет SQL:"+countsql); System.out.println ("Переписать Select SQL:"+pagesql); Connection Connection = (Connection) vocation.getArgs () [0]; Подготовленное Statatement countstmt = null; Результат RS = NULL; int totalCount = 0; try {countstmt = connection.prepareStatement (countsql); rs = countstmt.executequery (); if (rs.next ()) {totalCount = rs.getint (1); }} catch (sqlexception e) {System.out.println ("Игнорировать это исключение"+e); } наконец {try {rs.close (); countstmt.close (); } catch (sqlexception e) {System.out.println ("игнорировать это исключение"+e); }} metaObject.SetValue ("delegate.boundsql.sql", pagesql); // bind count page.setnumCount (totalCount); }} return vlocation.proceedceed (); } // Перехватывание оператора типа, переопределите метод плагина @Override public Object Plugin (объект Target) {if (Target ancomation OfficeHandler) {return plugin.wrap (target, this); } else {return target; }} @Override public void setProperties (свойства свойств) {} // РЕБЕНЕННЫЙ SQL Public String ConcatCountsql (String SQL) {// stringBuffer SB = new StringBuffer («Выберите count (*) из"); /* sql=sql.tolowercase (); if (sql.lastindexof ("order")> sql.lastindexof (")")) {sb.append (sql.substring (sql.indexof ("from")+4, sql.lastindexof ("порядок"))); } else {sb.append (sql.substring (sql.indexof ("from")+4)); }*/ Stringbuffer sb = new StringBuffer (); sql = sql.tolowercase (); if (sql.lastindexof ("order")> 0) {sql = sql.substring (0, sql.indexof ("order")); } sb.Append ("Выберите count (*) из ("+sql+") tmp"); вернуть sb.toString (); } public String concatPagesql (String SQL, страница страницы) {stringBuffer sb = new StringBuffer (); SB.Append (SQL); sb.append ("Limit") .append (page.getPageBegin ()). Append (",") .append (page.getPagesize ()); вернуть sb.toString (); }} Класс страницы [java] Просмотр простого copypackage com.dnkx.pojo; импортировать java.util.hashmap; импортировать java.util.map; / ** * * * Вспомогательный класс запроса страниц * @author li xiaogui 9 ноября 2016 г. 13:55:37 */ Public Class Page { // ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- pagebegin; // начало позиции private int numCount; // Общее количество частного pagetotal; // Общее количество частной строки orderfield = ";"; // контролировать частную строку OrderEdection, отображаемое на странице сортировки = ""; "; public page () {} public page (int pagesize, int pagecurrentpage) {super (); this.pageize = pagesize; this.pagecurrentPage = pagecurrentPage; } public page (map <string, string> map) {if (map.get ("pagenum")! = null) {this.setPageCurrentPage (this.PageCurrentPage = integer.parseInt (map.get ("pagenum")); // Число страхов if (map.get ("numperpage")! = null) {this.setPagesize (integer.parseint (map.get ("NumperPage")); // num отображаемых записей на страницу} else {this.setPagesize (5); // Установить начальное значение} if (map.get ("orderfield")! } if (map.get ("orderdirection")! = null) {this.setOrderDirection (map.get ("order -direction")); }} public int getPageCurrentPage () {return pagecurrentPage; } public void setPageCurrentPage (int pageCurrentPage) {this.PageCurrentPage = pageCurrentPage; } public int getNumCount () {return numCount; } public void setNumCount (int numCount) {this.numCount = numCount; } public int getPageTotal () {return (numCount%pagesize> 0)? (NumCount/PageSize+1) :( numCount/pagesize); } public void setPageTotal (int pagetotal) {this.pagetotal = pagetotal; } public int getPageSize () {return PageSize; } public void setPagesize (int pageSize) {this.pagesize = pagesize; } public int getPageBegin () {return PageSize*(pageCurrentPage-1); } public void setPagebegin (int pagebegin) {this.pagebegin = pagebegin; } public String getOrderfield () {return orderfield; } public void setorderfield (String orderfield) {this.orderfield = orderfield; } public String getOrderDirection () {return order -direction; } public void setOrderDirection (строка order -andirection) {this.orderDirection = order -andirection; } public Static Page getPage (int pagesize, int pagecurrentPage) {return New Page (PageSize, PageCurrentPage); } public Static Page getPage (Map Map) {return New Page (map); }}Метод вызова в контроллере
public String List (httpservletrequest) {long a = System.currentTimeMillis (); HashMap <String, Object> Map = getRequestMap.getMap (запрос); // инкапсулирует метод самостоятельно, возьмите параметр страницы страницы запроса = page.getPage (map); // инициализировать карту страницы. Пропуск («Страница», страница); // Поместите объект страницы в набор параметров (эта карта используется MyBatis, включая условия запроса, сортировка, сортировка, пэгнирование, пэгнирование, и т. Д. И. и//и т. Д. map.put (map.get ("orderfield")+"", map.get ("orderdirection")); Список <Сотрудник> list = effectionService.getListPage (map); request.setattribute ("emlist", list); request.setattribute ("page", page); request.setattribute ("map", map); // Получить атрибуты, связанные с страницей page.getNumCount (); // общее количество страниц page.getPageTotal (); // общее количество страниц длиной b = System.currentTimeMiMillis (); System.out.println ("-------------- Труто-потребляющий:"+(ba)+"ms"); вернуть "basic/employee_list"; }Наконец, настройте плагин в пружине
<Bean id = "pageinterector"> < /bean> <!-Spring и Mybatis идеально интегрированы, и нет необходимости в файле отображения конфигурации mybatis-> <Bean id = "sqlSessionFactory"> <property name = "DataSource" ref = "DataSource" /> <!-Автоматическое сканирование файлов mapping.xml-файлов-> " /" "! value = "classpath: com/dnkx/mapping/*. xml"> </property> <name = "plugins"> <ref bean = "pageinterector"/> </property> </bean>
Хорошо, это конец, эта статья только для справки! С нетерпением жду совета великого Бога