1. [代码] Mybatis 全局配置文件
<flugins> <plugin interceptor = "com.has.core.page.paginationinterceptor" /> </glugins>
2. [文件] PaginationInterceptor.java
@Intercepts ({@Signature (type = instructionHandler. Class, method = "prépare", args = {connexion. Class})}) public class paginationInterceptor implémente interceptor {@OverRidePublic Object Intercept (invocation invocation) lance throws {statuthandler StatementHandler = (statutHandler) invocation.getTarget (); Boundsql Boundsql) instructionHandler.getBoundSQL (); metaObject MetaStationHandler = metaObject.ForObject (StatementHandler); RowBounds Rowbounds = (Rowbounds) MetastatementHandler.getValue ("Delegate.Rowbounds"); if (Rowbounds == Null || Rowbounds == Rowbounds.Default) {retour invocation.proceed ();} configuration configuration = (Configuration) metaStationHandler.getValue ("Delegate.configuration"); dialect.type databaseType = null; tryVariables (). {} if (databasetype == null) {lancer un nouveau runtimeException ("La valeur de la propriété dialect dans configuration.xml n'est pas définie:" + configuration.getVariables (). getProperty ("dialect"));} dialect dialect = null; switch (databasety) {case mysql: dialect = new Mysql5Dialect (); case; case; case; case; case; case; case; case; case; case; case; case; case; case; case; case; Oracle: dialect = new Oracledialect (); Break;} String OriginalSQL = (String) metastationhandler.getValue ("Delegate.boundsql.sql"); MetaStationHandler.SetValue ("Delegate.boundsql.sql", dialect.getLimitsString (Originalsql, rowbounds.getS.get (),,) Rowbounds.getLimit ())); MetaStatementHandler.SetValue ("Delegate.Rowbounds.offset", Rowbounds.no_row_offset); MetaStatementHandler.SetValue ("Delegate.Rowbounds.limit", Rowbounds.No_Row_limit); Return Invocation.Proced {return plugin.wrap (Target, this);} @ OverRidepublic void setProperties (Propriétés Propriétés) {}}3. [文件] dialect.java
/ *** 数据库方言定义 ** / public abstrait class dialect {public static enum type {mysql, oracle} public abstrait string getLIMITString (String sql, int skipresults, int maxresults);}4. [文件] mysql5dialect.java
/ *** MySQL 方言分页类 * / classe publique MySQL5Dialect étend le dialect {la chaîne finale statique protégée sql_end_delimiter = ";" ; String public getLIMITSTRING (String SQL, Boolean Hasoffset) {return MySQL5PageHepler.getLimitstring (SQL, - 1, - 1);} public String getLIMITSTRING (String SQL, Int Offset, Int Limit) {Return MySQL5PageHepler.getLimitString (SQL, Offset, Limit); O) {return true;}}5. [文件] OraceleDialect.java
package com.chyjr.has.core.page.dialect; / *** Oracel 方言分页 * * / public class OracleDialect étend le dialect {public String getLIMITSTRING (String sql, int offset, int limit) {// too 未实现 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) {querrySelect = getLinesql (querySelect); INTRANDEx = getLastOrderInsertPoint (queySelect); int formIndEx = getAfterformInsertPoint (queyrySelect); String Select = queySelect.SubString (0, FormIndex); // 如果 Select 中包含 Distinct 只能在外层包含 countf (select.tolowercase (). indexof ("SELET")! = - 1 || QuerySelect.ToLelower. {return new StringBuffer (quereySelect.length ()). APPEND ("SELECT COUNT (1) Count From (") .Apnd (queySelect.SubString (0, OrderIndex)). . ||! ISBRACKETCANPARTNERNERShip (queySelect.SubString (OrderIndex, QuerySelect.Length ()))) {Retourne RuntimeException ("My SQL 分页必须要有 Ordre par 语句!");} Retour getLIMITSTRING (String QuerySelect, int offset, int limit) {queySelect = getlinesql (queySelect); // String sql = queySelect.replaceAll ("[^ // s,] + //.", "") + "Limit" + // Offset + "," + limite; String sql = querySelect + "Limite" + "+ limite; String sql = queryseled; sql;} / *** 将 SQL 语句变成一条语句 , 并且每个单词的间隔都是 1 个空格 ** @param sql * sql 语句 * @return 如果 sql 是 null 返回空 , 否则返回转化后的 sql * / private static string getlinesql (string sql) {return sql.replaceAll ("[/ r / n]", "") .replaceL ( "// s {2,}", "");} / *** 得到 sql 第一个正确的 de 的的插入点 * / private static int getAfterformInsertPoint (String QuerySelect) {String regex = "// s + from // s +" Matcher = patron (Matcher.Find ()) {int FromStarTindex = Matcher.Start (0); String text = queySelect.SubString (0, FromStartIndex); if (IsbracketCanPartnership (Text)) {return FromStarTindex;}} RETOUR 0;} / *** 判断括号 "()" 是否匹配 是否匹配 并不会判断排列顺序是否正确 并不会判断排列顺序是否正确 ** @Param 如果匹配返回TRUE,否则返回FALSE*/private static boolean isBracketCanPartnership(String text) {if (text == null || (getIndexOfCount(text, '(' ) != getIndexOfCount(text, ')' ))) {return false ;}return true ;}/*** 得到一个字符在另一个字符串中出现的次数** @param text* 文本* @param ch* 字符*/private static int getIndexofCount (Texte de chaîne, char ch) {int count = 0; for (int i = 0; i <text.length (); i ++) {count = (text.charat (i) == ch)? Count + 1: Count;} Return Count;}}2. [图片] mybatis.jpg