Al comienzo del proyecto, necesitaba usar MyBatis Paging. Leí muchos complementos en línea. De hecho, los principios de implementación son básicamente los mismos, pero la mayoría de ellos solo dan código y tienen anotaciones incompletas. Así que me referí a muchos artículos (cada artículo roba un pequeño código, evalúa el mío y lo plagiaría), y luego imité y escribí un complemento de paginación adecuado para mi proyecto. Sin más preámbulos, acabo de subir el código. En comparación con la mayoría de los artículos, las anotaciones son muy completas.
El interceptor más importante
paquete com.dnkx.interceptor; import java.sql.*; import java.util.hashmap; import java.util.properties; importar org.apache.ibatis.executor.resultset.resultsethandler; importar org.apache.ibatis.executor.statement.statementHandler; importar org.apache.ibatis.mapping.boundsql; importar org.apache.ibatis.mapping.MappedStatement; importar org.apache.ibatis.plugin.interceptor; importar org.apache.ibatis.plugin.Intercepts; importar org.apache.ibatis.plugin.invocation; importar org.apache.ibatis.plugin.plugin; importar org.apache.ibatis.plugin.signature; importar org.apache.ibatis.REFLECTION.MetaObject; importar org.apache.ibatis.REflection.SystemMetaObject; import com.dnkx.pojo.page; /** * * Interceptor de paginación, utilizado para interceptar operaciones que requieren consulta de paginación y luego paginarlas. * El principio de MyBatis Paging se implementa utilizando interceptores: * Para usar JDBC para operar en la base de datos, debe tener un objeto de declaración correspondiente. Antes de que MyBatis ejecute la instrucción SQL, generará un objeto de instrucción que contenga la instrucción SQL, y la declaración SQL correspondiente* se genera antes de la declaración, por lo que podemos comenzar con la instrucción SQL utilizada para generar la declaración antes de generar la declaración. En MyBatis Declary la declaración es generada por el método * Preparar del objeto RoutingStatementHandler. Por lo tanto, una de las ideas para usar un interceptor para implementar myBatis Paging es interceptar el método de preparación de la interfaz DeclaryHandler, y luego cambiar la instrucción SQL a la declaración SQL de consulta de paginación correspondiente en el método de interceptor, y luego llamar al método de preparación del objeto * DeclarationHandler, que es, llame invocación de invocación ().). * Para la paginación, una de las operaciones que debemos hacer en el interceptor es contar el número total de registros que cumplan con las condiciones actuales. Esto es obteniendo la instrucción SQL original, cambiándola a la declaración estadística correspondiente y luego reemplazando los parámetros en la instrucción SQL utilizando los parámetros encapsulados MyBatis y la configuración * de los parámetros *. Luego, la instrucción SQL que consulta el número de registros se ejecuta para contar el número total de registros. ** Explique varias clases que se pueden usar en el complemento:* MetaObject: Una clase proporcionada por myBatis basada en un objeto que devuelve el valor de la propiedad* Boundsql: en esto, puede obtener el SQL que se ejecuta y los parámetros se utilizarán para ejecutar SQL* MappedStatement: Esto puede obtener el valor del ID de ID en el archivo XML de la declaración SQL actualmente ejecutada. Mybatis Memory Paging. * ParameterHandler: se usa en MyBatis para reemplazar el valor que aparece en SQL. * * @author li xiaogui 9 de noviembre de 2016 10:59:04 */ @intercepts ({@Signature (type = DeclaryHandler.class, método = "Preparar", args = {Connection.Class}), @Signature (type = ResultSethandler.class, método = "HandlerEsultSets", Args = {Declarat.Class}) Interceptor {// Interceptar la palabra clave de paginación String final de la final estática select_id = "Página"; // El código ejecutado por el complemento reemplazará el método original y reescribirá la interceptación más importante @Override Public Object Intercept (Invocation Invocation) lanza {if (invocation.getTarget () instanceOf DeclarationHandler) {// aquí tenemos una configuración si el método de consulta contiene la página, Pensar otros métodos ignorará // por lo que debe obtener el nombre del método DeclarationHandler = (DeclarationHandler). Metaobject metaobject = systemmetaObject.forObject (DeclaryHandler); MappedStatement MappedStatement = (MappedStatement) MetaObject.getValue ("Delegate.MappedStatement"); Cadena selectID = mappedStatement.getId (); String MethodName = selectid.substring (selectID.lastIndexof (".")+1) .tolowerCase (); // Entonces juzga si la página está incluida, obtenga SQL if (methorname.contains (select_id)) {BoundSQL BoundSql = (BoundSql) MetAobject.getValue ("delegate.boundsql"); // El parámetro de paginación es una propiedad de la cadena de parámetro de parámetroBject sql = boundsql.getSql (); System.out.println ("Get SQL:"+SQL); Hashmap <string, object> map = (hashmap <string, object>) (boundsql.getParametRangject ()); // página página = (página) (boundsql.getParameterObject ()); Página página = (página) map.get ("página"); // reescribe sql string countSql = concatCountSql (SQL); String Pagesql = concatPagesql (SQL, página); // System.out.println ("Reescritura de conteo SQL:"+CountSql); System.out.println ("Reescribir SELECT SQL:"+Pagesql); Conexión Connection = (Connection) Invocat.GetArgs () [0]; Preparado en cuenta CountStmt = null; ResultSet rs = null; int totalCount = 0; intente {countStmt = Connection.PrepareStatement (CountSql); rs = countstmt.executeQuery (); if (rs.next ()) {totalCount = rs.getInt (1); }} Catch (Sqlexception e) {System.out.println ("Ignorar esta excepción"+e); } finalmente {try {rs.close (); countstmt.close (); } catch (sqlexception e) {system.out.println ("ignorar esta excepción"+e); }} metaObject.setValue ("delegate.boundsql.sql", páginasql); // Bind Count Page.SetNumCount (TotalCount); }} return invocation.proced (); } // Intercepta el tipo de DeclarationHandler, anule el método de complemento @Override Public Object Plugin (Object Target) {if (Target instanceOf DeclarationHandler) {return Plugin.wrap (Target, este); } else {Target de retorno; }} @Override public void setProperties (propiedades de propiedades) {} // renovar sql public string concatCountSql (string sql) {// stringbuffer sb = new StringBuffer ("select Count (*) desde"); /*SQL=SQL.TOLOWERCASE (); if (sql.lastindexof ("orden")> sql.lastindexof (")")) {sb.append (sql.substring (sql.indexof ("from")+4, sql.lastindexof ("orden"))); } else {sb.append (sql.substring (sql.indexof ("from")+4)); }*/ StringBuffer sb = new StringBuffer (); sql = sql.tolowercase (); if (sql.lastindexof ("orden")> 0) {sql = sql.substring (0, sql.indexof ("orden")); } sb.append ("Seleccionar recuento (*) de ("+sql+") tmp"); return sb.ToString (); } public String ConcatPagesql (String SQL, página de página) {StringBuffer sb = new StringBuffer (); sb.append (SQL); sb.append ("límite") .append (page.getPagebegin ()). append (",") .append (page.getPageSize ()); return sb.ToString (); }} Clase de página [Java] Ver CopyPackage simple com.dnkx.pojo; import java.util.hashmap; import java.util.map; / ** * * Pagination Consuly Clase auxiliar * @Author Li Xiaogui 9 de noviembre de 2016 13:55:37 */ Página de clase pública { // ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- PageBegin; // Inicie la posición privada int numCount; // número total de private int pageTotal; // número total de cadena privada ordenfield = ""; // Controle la dirección de orden de cadena privada que se muestra en la página de clasificación = ""; Public Page () {} Public Page (int PAGESIZE, INT PageCurrentPage) {super (); this.pagesize = PageSize; this.pageCurrentPage = PageCurrentPage; } página pública (map <string, string> map) {if (map.get ("pagenum")! = null) {this.setPageCurrentPage (this.pageCurrentPage = Integer.ParseInt (map.get ("PageNum"))); // num of Page to Query} Else {this.setPageCurrentPage (1); if (map.get ("numperPage")! = null) {this.setPageSize (integer.ParseInt (map.get ("numperPage"))); // num de entradas mostradas por página} más {this.setSetPageSize (5); // Establezca el valor inicial} if (map.get ("Orderfield)! = null) {this.setPageField (5); // set el valor inicial} if (map.get (" ordenfield)! = null) {this.setPageField (5); // set el valor inicial} if (map.get ("ordenfield)! = null) {this.setPageField (map); } if (map.get ("OrderDirection")! = NULL) {this.setOrderDirection (map.get ("OrderDirection")); }} 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 págsagesize) {this.pagesize = pageSize; } public int getPagebegin () {return PageSize*(pageCurrentPage-1); } public void setPagebegin (int PageBegin) {this.Pagebegin = PageBegin; } public String getOrderField () {return ordenfield; } public void setOrderfield (String Orderfield) {this.orderfield = Orderfield; } public String getOrderDirection () {return OrderDirection; } public void setOrderDirection (String OrderDirection) {this.OrderDirection = OrderDirection; } Public Static Page GetPage (int PageSize, int PageCurrentPage) {return nueva página (PageSize, PageCurrentPage); } Public Static Page getPage (mapa mapa) {return nueva página (mapa); }}Método de llamadas en el controlador
Lista de cadenas públicas (solicitud httpservletRequest) {long a = system.currentTimemillis (); Hashmap <string, object> map = getRequestMap.getMap (request); // Encapsula el método usted mismo, tome el parámetro de la página de solicitud de la página = página.getPage (map); // inicializar map.put ("página", página); // Coloque el objeto de página Conjunto de parámetros (este mapa se utiliza por mybatis, incluyendo condiciones de consulta, clasificación, pagination, pagination, etc.) // map.put (map.get ("Orderfield")+"", map.get ("OrderDirection")); Lista <Eloza> list = EmployeService.getListPage (MAP); request.setAttribute ("emList", lista); request.setAttribute ("página", página); request.setAttribute ("map", map); // Obtener atributos relacionados con la página Page.getNumCount (); // Número total de páginas Page.getPageToTal (); // Número total de páginas Long B = System.CurrentTimemillis (); System.out.println ("-------------- Consumir el tiempo:"+(BA)+"MS"); return "BASIC/Employee_List"; }Finalmente, configure el complemento en Spring
<bean id = "pageInterector"> < /bean> <!-Spring y MyBatis están perfectamente integrados, y no hay necesidad del archivo de asignación de configuración de MyBatis-> <bean id = "sqlsessionFactory"> <Property name = "dataSource" ref = "dataSource" /> <!-escaneo automático de mapping.xml-<name de propiedad = "Ref. valor = "classpath: com/dnkx/mapping/*. xml"> </property> <property name = "plugins"> <ref bean = "pageInterector"/> </Property> </bean>
Ok, ese es el final, ¡este artículo es solo para referencia! Esperando el consejo del Gran Dios