1. [代码] MyBatis 全局配置文件
<Plugins> <Plugin interceptor = "com.has.core.page.PaginationInterceptor" /> < /plugins>
2. [文件] Paginationsinterceptor.java
@Intercepts ({@signature (type = StatementHandler. Klasse, method = "vorbereiten", args = {class. Class})}) öffentliche Klasse PaginationInterceptor implementiert Interceptor {@Overridepublic Object Intercept (Invocation Invocation) Throws Throwable {StatementHandler = (StatementsQLEDER). StatementHandler.getBoundSQL (); MetaObject metastatementHandler = metaObject.forObject (StatementHandler); RowBounds RowBounds = (RowBounds) metastatementHandler.getValue ("Delegate.Rowbounds"); aufruf.Procece ();} Konfigurationskonfiguration = (Konfiguration) metastatementHandler.getValue ("Delegate.Configuration"); Dialekt.Type Databasetype = null; try {databasetype = dialect.Type.Valueof (configuration.getvariable (). oder Oracle: Dialekt = new ORACleDialect (); break;} String originalsql = (String) metastatementHandler.getValue ("delegate.boundSQL.SQL"); RowBounds.getLimit ())); Ziel) {return plugin.wrap (target, this);}@overridepublic void setProperties (Eigenschaften Eigenschaften) {}}3.. [文件] Dialekt.java
/*** 数据库方言定义 **/public abstract Class Dialekt {public static enum type {mysql, oracle} public abstract String getLimitString (String SQL, int SkipResults, int maxresults);};}4. [文件] MySQL5Dialect.java
/*** MySQL 方言分页类*/Public Class MySQL5Dialect erweitert den Dialekt {Protected Static Final String SQL_end_Delimiter = ";" ; public String getLimitString (String SQL, boolean hasOffset) {return mySQL5PageHepler.getLimitString (SQL, - 1, - 1);} public String getLimitString (String SQL, Int Offset, Int Grenze) {return MySQL5PageString (SQL, Offset,} SupportSlimit () {return true;}}5. [文件] oracledialect.java
Paket com.chyjr.has.core.page.dialect;/*** oracel 方言分页**/öffentliche Klasse Oracledialect erweitert den Dialekt {public String getLimitString (String SQL, int Offset, int limit) {// Todo 未实现 return "";}}}6. [文件] Mysql5PageHepler.java
importieren java.util.regex.matcher; import Java.util.regex.pattern;/*** Mysql 分页工具类*/public class MySQL5PageHepler {/*** 得到查询总数的 SQL*/public static String GetCountString (String -Abfragen) {queryselect = GetLinesql (queryselect = get linesql) (querysselekt = getLinesql) Getlinesql (queryselect = get linesql) (queryselect = get linesql) getLinesql (queryselect = get linesql) Getlinesql (queryselect = get linesql) getLastorderInsertPoint (querySelect); int FormIndex = GetAfFterformInsertPoint (querySelect); String select = querySelect.substring (0, FormIndex); // 如果 SELECT 中包含 DIRTIG 只能在外层包含 countif 只能在外层包含 countif (Select.tolowerClone (). Indexof ("SELECT DISTECTION"). {return New StringBuffer (querySelect.length ()). append ("zählen (1) zählen aus (") .Append (querySelect.substring (0, orderIndex). append (") t") .ToString ();} else {return New StringBuffer (Queryselect.Lect). . ||. getLimitString (String querySelect, int offset, int limit) {querySelect = getLinesql (querySelect); // String sql = querySelect.replaceAll ("[^// s,] + //. limit; return sql;}/*** 将 sql 语句变成一条语句 , 并且每个单词的间隔都是 1 个空格 ** @param sql* "// s {2,}", "");}/*** 得到 sql 第一个正确的 von 的的插入点*/privat static int getaFterformInsertPoint (String querySelect) {String regex = "// s+from // s+"; mustermuster = mustern.compile (regex, muster.case_insensitive); whilecherssitive); whilexssitive); whilexssitive); whilexssitive); whilex; (matcher.find()) {int fromStartIndex = matcher.start( 0 );String text = querySelect.substring( 0 , fromStartIndex);if (isBracketCanPartnership(text)) {return fromStartIndex;}}return 0 ;}/*** 判断括号"()"是否匹配,并不会判断排列顺序是否正确** @param text* 要判断的文本* @return如果匹配返回 true, 否则返回 false*/privat statischer boolean isbrackCanpartnership (String -Text) {if (text == null || (getIdexofCount (text, '(')! text, char ch) {int count = 0; für (int i = 0; i <text.length (); i ++) {count = (text.charat (i) == ch)? Graf + 1: count;} return count;}}2. [图片] mybatis.jpg