1. [代码] mybatis 全局配置文件
<glugins> <plugin interceptor = "com.has.core.page.paginationinterceptor" /> </glugins>
2. [文件] Pagination Interceptor.java
@Intercepts ({@Signature (type = DeclaryHandler. Class, método = "Preparar", args = {Conexión. Class})}) Class pública PaginationInterceptor implementa interceptor {@OverridePublic Object Intercept (invocation invocation) lanza showeable {DeclittHandler DeclarationHandler = (DeclittHandler) Invocation.GetTarget (); Boundsql Boundsql = DeclarationHandler.getBoundSql (); metaObject MetastatementHandler = metaObject.forObject (DeclarationHandler); RowBounds RowBounds = (RowBounds) MetastatementHandler.getValue ("Delegate.RowBounds"); if (RowBounds == null || RowBoundss.DefeFault) {returns invocation.proceed ();} Configuración Configuración = (Configuración) MetastatementHandler.getValue ("delegate.configuration"); dialect.type databaseSetype = null; try {databaseType = dialect.type.valueOf (configuration.getVariAnbles (). e) {} if (databaseType == null) {throw new runtimeException ("El valor de la propiedad del dialecto en configuración.xml no está definido:"+ configuración.getVariables (). getProperty ("dialect"));} dialect = null; switch (databasetype) {case mysql: dialect = newect = neowect = newect = newect = newect = newect = newect = newect = newecte Oracle: dialect = new oracledialect (); break;} String Originalsql = (String) MetaStatementHandler.getValue ("delegate.boundsql.sql"); metastatementHandler.setValue ("delegate.boundsql.sql", dialect.getLimitstring (Originalsql, RowBounds.getOffset (),) rowBounds.getLimit ())); metaStatementHandler.setValue ("delegate.rowbounds.offset", rowBounds.no_row_offset); metastatementHandler.setValue ("delegate.rowBounds.limit", rowBounds.no_row_limit); devuelve invocational Target) {return plugin.wrap (target, this);}@overridePublic void setProperties (propiedades de propiedades) {}}3. [文件] dialecto.java
/*** 数据库方言定义 **/Public Abstract Class Dialect {public static enum tipo {mysql, oracle} public abstract String getLimitString (String SQL, int Skipresults, int maxResults);}4. [文件] mysql5dialect.java
/*** mySQL 方言分页类*/public class mySql5Dialect extiende el dialecto {cadena final estática protegida sql_end_delimiter = ";" ; public String getLimitString (String sql, boolean haoffset) {return mySQL5PageHePler.getLiMitString (sql, - 1, - 1);} public String getLimitString (String sql, int offset, int limit) {return mySql5pageHepler.getLimitString (sql, sql, offset); SupportSlimit () {return true;}}5. [文件] oracledialect.java
paquete com.chyjr.has.core.page.dialect;/*** oracel 方言分页**/public class oracledialect extiende el dialecto {public String getLimitString (String Sql, int Offset, int Limit) {// toDO 未实现 return "";}}6. [文件] mysql5pagehepler.java
import java.util.regex.matcher; import java.util.regex.pattern;/*** mySql 分页工具类*/public class mySql5PageHePler {/*** 得到查询总数的 sql*/public static String getCountStRing (String QuerySelect) {QuerySelect = GetLinesql (QuerySelect); Int OdersEnds. getLastOrderInSertPoint (QuerySelect); int formindex = getAfterFormInsertPoint (QuerySelect); String select = QuerySelect.subString (0, FormIndex); // 如果 Seleccione 中包含 中包含 只能在外层包含 Countif (select.tOlowerCase (). indexOf ("Select Distint")! = -1 || 1) {return new StringBuffer (QuerySelect.length ()). Append ("Seleccione Contee (1) Count From (") .Append (QuerySelect.Substring (0, OrderIndex)). Append (") t") .ToString ();} else {return New StringBUffer (QuerySelect.lengther ) .Append (QuerySelect.SubString (formindex, ordenindex)). toString ();}}/*** 得到最后一个 的插入点位置 ** @return 返回最后一个 orden por 插入点的位置*/private static int getLastOrderInsertPoint (string QuerySelect) {int OrderIndex = QuerySelect.tolowerCase (). LastIndExOf ("Order by"); || getLimitString (String QuerySelect, int Offset, int Limit) {QUERYSELECT = GetLinesql (QuerySelect); // String Sql = QuerySelect.replaceAll ("[^// s,] + //.", "") + "Limite" + // Offet + "," + Limit; String sql = QuerySelect. límite; return sql;}/*** 将 sql 语句变成一条语句 , 并且每个单词的间隔都是 1 个空格 ** @param sql* sql 语句* @return 如果 sql 是 null 返回空 , 否则返回转化后的 sql*/private static string getLinesql (string sql) {return sql.replaceall ("[/r/n]", "", "). "// s {2,}", "");}/*** 得到 sql 第一个正确的 de 的的插入点*/private static int getAfterFterFertinSertPoint (String QuerySelect) {String Regex = "// S+From // S+"; Pattern = Pattern.comPile (REGEX, Pattern.case_insensitive); Matcher Matcher = Pattern.Matcher (querySelect); (Matcher.find ()) {int fromstartindex = matcher.start (0);如果匹配返回 VERDADERO, 否则返回 FALSO*/PRIVADA ESTÁTICA ISBRACKETCANPARTNERSHIT (texto de cadena) {if (text == null || (getIndexOfCount (text, '(')! = GetInDexofCount (text, ')'))) {return false;} return true;}/*** ** @param text* 文本* @param ch* 字符 字符 字符 字符 字符 字符 字符* getIndexOfCount (texto de cadena, char ch) {int count = 0; for (int i = 0; i <text.length (); i ++) {count = (text.charat (i) == ch)? recuento + 1: count;} return Count;}}2. [图片] mybatis.jpg