Según la idea de la siguiente página, es fácil implementar el diseño multiinquilino de myitas.
Use el interceptor proporcionado por MyBatis. Las declaraciones SQL pagadas se procesan en diferentes SQL pagados a través de la encapsulación.
Este ejemplo ha implementado la función de paginación de MySQL y Oracle. Preste atención al siguiente paquete de cotización y no lo cite incorrectamente.
import java.sql.connection; import java.sql.preparedStatement; import java.sql.ResultSet; import java.sql.sqlexception; import java.util.list; import java.util.properties; import org.apeSt. org.apache.ibatis.executor.statement.routingStatementHandler; importar org.apache.ibatis.executor.statement.statementHandler; importar org.apache.ibatis.mapping.BoundSql; import org.apache.ibatis.mapping.mappedStatement; import org.apache.ibatis.plugin.interceptor; import org.apache.ibatis.plugin.intercepts; import org.apache.lplugin.invocation; importar org.apache.ibatis.plugin.plugin; import org.apache.ibatis.scripting.defaults.defaultparameterhandler; import com.yida.utils.page; import com.yidao.utils.reflecthelper;/** * * Interceptor de paginación, utilizado para interceptar operaciones que requieren consultas de página 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. * */ @Intercepts ({ @firature (type = stattleHandler.class, método = "preparar", args = {conecte.class})}) clase pública PageInterceptor implementa el interceptor {private String dialect = ""; // dialecto de la base de datos String private pagesqlid = ""; // ID que debe interceptarse en Mapper.xml (regular coincidente) Intercepta pública de objeto (invocación invocación) lanza lanzar {// En realidad, solo hay dos clases de implementación para DeclarationHandler, uno es RoutingStatementHandler, y el otro es la clase BaseStementShandler de clase abstracta. // BaseStatementHandler tiene tres subclases, a saber, SimpleStatementHandler, PrepareStatementHandler y CallableStatementHandler. // SimpleStatementHandler se utiliza para procesar la declaración, PrepareStatementHandler maneja preparado y CallableStementHandler es // procesa CallableStatement. MyBatis crea un controlador de rutas cuando procesa declaraciones SQL. En RoutingStatementHandler, hay una propiedad delegada de // Tipo de DeclarationHandler. RoutingStatementHandler creará un BaseStatementHandler correspondiente de acuerdo con las diferentes declaraciones, es decir, SimpleStatementHandler, // PrepareStatementHandler o CallableStatementHandler. En RoutingStatementHandler, todos los métodos de interfaz de DeclareHandler son implementados por el delegado correspondiente al delegado llamado. // Hemos marcado el interceptor solo intercepta el método de preparación de la interfaz DeclarationHandler con @Signature en la clase PageInterceptor. Debido a que MyBatis solo lo envuelve a través del método de complemento de interceptor al establecer el rutininglatementHandler, por lo que el objeto de destino que intercepemos aquí debe ser el objeto RoutingStatementHandler. if (invocation.getTarget () instanceof RoutingStatementHandler) {RoutingStatementHandler DeclarationHandler = (RoutingStatementHandler) Invocation.GetTarget (); DeclarationHandler delegate = (DeclarationHandler) Reflectthelper.getFieldValue (DeclarationHandler, "Delegate"); BoundSQL Boundsql = delegate.getBoundSql (); Object obj = boundsql.getParametreEbject (); if (obj instancia de página <?>) {página <?> Page = (Page <?>) obj; // Recupere la propiedad MappedStatement de BaseStatementHandler de la clase delegada MappedStatement MappedStatement = (MappedStatement) Reflectthelper.getFieldValue (delegado, "MappedStatement"); // El parámetro del método de preparación interceptado es un objeto de conexión Connection Connection = (Connection) Invocation.GetArgs () [0]; // Obtenga la instrucción SQL ejecutada actualmente, es decir, la instrucción SQL que escribimos directamente en la cadena de la instrucción de mapeo mapper sql = boundsql.getSql (); // Establezca el número total de registros para el objeto de parámetro de página actual este.settotalRecord (página, mappedStatement, conexión); // Obtenga las páginas de cadena de instrucción SQL paginado = this.getPagesql (página, SQL); // Use la reflexión para establecer el atributo SQL correspondiente al BoundSQL actual para crear una buena declaración SQL pagada para US Reflectthelper.SetFieldValue (BoundSQL, "SQL", Pagesql); }} return invocation.proced (); } /*** Establezca el número total de registros para la página del objeto de parámetro actual** @Param Page MapePing Declaración* @param MappedStatement Mapper Mapeing Declaración* @Param Conexión de la base de datos actual Conexión* /private void settotalRecord (página <?> Página, mappedStatement MappedStatement, conexión de conexión) {// obtiene el límite correspondiente. Este BoundSQL es en realidad el mismo objeto que el BoundSQL que obtuvimos usando DeclaryHandler. // El límiteSQL en delegado también se obtiene a través del método MappedStatement.getBoundSQL (ParamObj). BoundSQL Boundsql = MappedStatement.getBoundSQL (página); // Obtener la cadena de instrucción SQL correspondiente sql = boundsql.getSql (); // Obtenga la instrucción SQL correspondiente que calcule el número total de registros consultando la instrucción SQL String CountSql = this.getCountSql (SQL); // Obtenga el mapa de parámetros correspondiente a través de LISTSQL LIST <amametermapping> Parametermappings = Boundsql.getParametermappings (); // Use la configuración, la declaración SQL CountSQL para consultar registros, la relación de mapeo de parámetros Parametermappings y la página del objeto de parámetros para crear un objeto BoundSQL correspondiente a los registros de consulta. BoundSQL CountBoundSQL = new BoundSQL (MappedStatement.getConfiguration (), CountSQL, Parametermappings, página); // Cree un objeto ParameterHandler para configurar los parámetros a través de MappedStatement, Página de objeto de parámetro y CountBoundSQL de objetos BoundSQL. ParameterHandler ParameterHandler = new DefaultParameterHandler (MappedStatement, Page, CountBoundSQL); // Cree un objeto preparado para la Estado correspondiente a CountSQL a través de la conexión. Preparado PSTMT = NULL; ResultSet rs = null; Pruebe {pstmt = Connection.PrepareStatement (CountSQL); // Establecer parámetros ParameterHandler para el objeto Preparado de preparación a través de ParameterHandler.SetParameters (PSTMT); // Luego se ejecuta para obtener el número total de registros y obtener los resultados. rs = pstmt.executeQuery (); if (rs.next ()) {int totalRecord = rs.getInt (1); // Establecer el número total de registros para el objeto de la página del parámetro actual. }} Catch (SQLException e) {E.PrintStackTrace (); } finalmente {try {if (rs! = null) rs.close (); if (pstmt! = null) pstmt.close (); } Catch (Sqlexception e) {E.PrintStackTrace (); }}} / ** * SQL Declaración que obtiene el número total correspondiente de registros en la consulta * @param sql * @return * / private String getCountSql (string sql) {int index = sql.indexof ("from"); return "select Count (*)" + sql.substring (índice); } /*** Obtenga la instrucción SQL de consulta de paginación correspondiente basada en el objeto de página. Aquí solo se realizan dos tipos de bases de datos, MySQL y Oracle * ninguna otras bases de datos son Paging * * @param Page Paging Object * @param SQL Declaración SQL original * @Return */ private String getPagesql (página <?> Page, String SQL) {StringBuffer SQLBuffer = new StringBuffer (sql); if ("mysql" .equalSignorecase (dialect)) {return getMysqlPagesql (página, sqlbuffer); } else if ("oracle" .equalSignorecase (dialect)) {return getoraclePagesql (página, sqlbuffer); } return sqlbuffer.ToString (); } / *** Obtenga la declaración de consulta pagada para la base de datos MySQL* @param Page Paging Object* @param sqlbuffer stringBuffer Object que contiene la instrucción SQL original* @return mysql Base de datos Declaración* / privada string getMysqlpagesql (página <?> Página, stringbuffer sqlbuffer) {// el registro de la posición de la posición de la posición de la posición del registro de la posición de la posición de la posición del registro de la posición del primero. La posición del registro en MySQL comienza desde 0. // System.out.println ("Page:"+Page.getPage ()+"--------"+Page.getrows ()); int offset = (page.getPage () - 1) * Page.getrows (); sqlbuffer.append ("límite") .append (offset) .append (","). append (page.getrows ()); return sqlbuffer.ToString (); } / *** Obtenga la declaración de consulta pagada para Oracle Database* @param Page Paging Object* @param SQLBuffer StringBuffer Object que contiene la instrucción SQL original* @return Pagination Declary para Oracle Database* / private String getoraclepagesql (página <?> Página, stringbuffer sqlbuffer) {// calculador de la ubicación del registro del primer registro. Oracle Pagination se realiza a través de Rownum, y Rownum comienza desde 1 int offset = (page.getPage () - 1) * Page.getrows () + 1; sqlbuffer.insert (0, "Seleccione u.*, Rownum r from (") .Append (") U Where Rownum <") .Append (offset + page.getrows ()); sqlbuffer.insert (0, "select * de (") .append (") donde r> =") .Append (offset); // La instrucción SQL anterior se ve así: // Seleccionar * de (Seleccione u. *, ROWNUM R de (SELECCIONAR * DE T_USER) U WHERE ROWNUM <11) WHERE r> = 16 return sqlbuffer.ToString (); } / *** Método para encapsular el objeto original correspondiente al Interceptor* / Public Object Plugin (Object Arg0) {// TODO STUB AUTO GENERADO if (arg0 instanceOf DeclarationHandler) {return plugin.wrap (arg0, esto); } else {return arg0; }} / *** Establezca el conjunto de propiedades al registrar el interceptor* / public void setProperties (propiedades p) {} public string getDialect () {return dialect; } public void setDialect (dialecto de cadena) {this.dialect = dialect; } public String getPagesqlid () {return PageSQLid; } public void setPagesqlid (String Pagesqlid) {this.pagesqlid = pagesqlid; }} Configuración XML:
* Se buscarán los mapeadores bajo este paquete. Se pueden especificar varios paquetes, separados por comas o semicolons-> <propiedad name = "basepackage" valor = "com.yidao.mybatis.dao" /> <propiedad name = "sqlsessionFactoryBeanName" value = "sqlSessionFactory" /> < /bean> <!-MyBatis Interceptor-> <<r Bean Id = "PAGINE name = "dialect" value = "mysql"/> <!-Intercept la declaración con ID que contiene caracteres de consulta en el archivo mapper.xml-> <name de propiedad = "pagesqlid" value = ".*Query $"/> </bean>
Clase de página
paquete com.yidao.utils;/** Míralo usted mismo, qué campos se necesitan para agregarle a él*/página de clase pública {ROWS INTEGER PRIVADO; Página de entero privado = 1; Integer privado TotalRecord; public Integer getrows () {return filas; } public void setrows (Integer filas) {this.rows = filas; } public Integer getPage () {return Page; } public void setPage (página entera) {this.page = page; } public Integer getTotalRecord () {return TotalRecord; } public void settotalRecord (Integer TotalRecord) {this.totalRecord = TotalRecord; }} Clase de reflexión
paquete com.yidao.utils; import java.lang.reflect.field; import org.apache.commons.lang3.reflect.fieldutils; public class Reflectthelper {Public Static Object getFieldValue (Obj Obj, String FieldName) {if (obj == null) {return null; } Campo Targetfield = getTargetfield (obj.getClass (), fieldName); intente {return fieldUtilss.readfield (Targetfield, obj, true); } catch (ilegalAccessException e) {E.PrintStackTrace (); } return null; } Public Static Field getTargetfield (class <?> TargetClass, String FieldName) {Field Field = Null; intente {if (targetClass == null) {campo return; } if (object.class.equals (targetClass)) {campo return; } campo = fieldUtils.getDeClaredField (TargetClass, FieldName, True); if (field == null) {field = getTargetfield (targetClass.getSuperClass (), fieldName); }} capt (excepción e) {} campo return; } public static void setFieldValue (objeto obj, string fieldName, valor de objeto) {if (null == obj) {return;} campo TargetField = getTargetfield (obj.getClass (), fieldName); intente {FieldUtils.WriteField (Targetfield, OBJ, Value); } catch (ilegalAccessException e) {E.PrintStackTrace (); }}}Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.