1. [代码] mybatis 全局配置文件
<Plugins> <plugin Interceptor = "com.has.core.page.paginationInterceptor" /> </lugin>
2. [文件] PaginationInterceptor.java
@Intercepts ({@Signature (type = Pernyataan CLAS. Pernyataan Handler.getBoundsql (); MetaObject MetastatementHandler = MetaObject.forObject (Pernyataan HiSTLE); RowBounds rowbounds = (rowbounds) Metastatementhandler.getValue ("delegate.rowbounds"); if (rowbounds == null || rowbound == rowbounds ==); Invocation.proed ();} konfigurasi konfigurasi = (konfigurasi) metastatementhandler.getValue ("delegate.configuration"); dialect.type databaseType = null; coba {databaseType = dialect.type. {} if (databasetype == null) {lempar runtimeException baru ("Nilai properti dialek dalam configuration.xml tidak didefinisikan:"+ configuration.getVariables (). getProperty ("dialek");} dialek dialek = null; sakelar (databasePery) {case -new -new) {databasype) {data -new; 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);return invocation.proceed();}@Overridepublic Object plugin(Object target) {return Plugin.wrap (target, this);}@overridepublic void setProperties (properti properti) {}}3. [文件] Dialect.java
/*** 数据库方言定义 **/Dialek kelas abstrak publik {public static enum type {mysql, oracle} public abstract string getLimitString (string sql, int skipresults, int maxResults);}4. [文件] mysql5dialect.java
/*** mysql 方言分页类*/kelas publik mysql5dialect memperluas dialek {string final statis yang dilindungi sql_end_delimiter = ";" ; public string getLimitString (string sql, boolean hasoffset) {return mysql5pagehepler.getlimitString (sql, - 1, - 1);} public get getlimitstring (string sql, int offset, batas int) {return mysql5pageHepler. {return true;}}5. [文件] Oracledialect.java
Paket com.chyjr.has.core.page.dialect;/*** oracel 方言分页**/kelas publik Oracledialect memperluas dialek {public getSlimitString (string sql, int offset, batas int) {// 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 orderIndex = getLastOrderInsertPoint (QuerySelect); int formIndex = getAfterFormInsertPoint (queryselect); string select = queryselect.substring (0, formIndex); // 如果 pilih 中包含 berbeda 只能在外层包含 countif (select.tolowercase (). Indexof ("Select Distance")! = - 1 | iBery -toLowEccase (). IndexOf ("Select Distance")! = - 1 || QuerySelect. StringBuffer (QuerySelect.Length ()). Append ("Pilih Hitung (1) Hitung dari (") .Append (QuerySelect.SubString (0, OrderIndex)). Append (") t") .toString ();} else {return stringBuffer baru (QuerySelect.length (). ) .Append (QuerySelect.substring (FormIndex, OrderIndex)). ToString ();}}/*** 得到最后一个 pesanan oleh 的插入点位置 ** @Return 返回最后一个 pesanan dengan 插入点的位置*/private static int getLastOrderPoint (string querySelect) {int orderIndex = queryselect.tolowercase (). ! isBracketCanPartnership (queryselect.substring (orderIndex, queryselect.length ()))) {lempar runimeException baru ("sql saya 分页必须要有 pesanan oleh 语句!");} return orderIndex;}/** 得到分页的 sql ** @param offset* 偏移量 @@param* @parret* 位置 位置 位置* getLimitString(String querySelect, int offset, int limit) {querySelect = getLineSql(querySelect);// String sql = querySelect.replaceAll("[^//s,]+//.", "") + " limit " +// offset + " ," + limit;String sql = querySelect + " limit " + offset + " ," + limit;return sql;}/*** 将 sql 语句变成一条语句 , 并且每个单词的间隔都是 1 个空格 ** @param sql* sql 语句* @return 如果 sql 是 null 返回空 , 否则返回转化后的 sql*/string statis privat getLinesql (string sql) {return sql.replaceall ("[//r/noad)." "// S {2,}", "");}/*** 得到 sql 第一个正确的 dari 的的插入点*/private static int getafterFormInsertPoint (string queryselect) {string regex = "// s+dari // s+"; pola = pola.coCy (regex, pola.case_insensitive); cocherer (cocherer) pattern = POLA.COMPILE (regex, POLA.Case.case); SHOOKER.COCKERTERCITE (POLADEnDEnt. {int fromStartIndex = matcher.start (0); string text = queryselect.substring (0, fromstartIndex); if (isBracketCanPartnership (teks)) {return fromstartIndex;}} return 0;}/*** 判断括号 "()" 是否匹配 是否匹配 是否匹配 是否匹配 是否匹配 是否匹配 是否匹配 是否匹配isBracketCanPartNership (string text) {if (text == null || (getIndexofcount (text, '(')! = getIndexofcount (text, ')'))) {return false;} return true;}/*** 得到一个字符在另一个字符串中出现的次数 ** @param Text* 文本* @param ch* 字符*/for {prouct {prouct) {prouctix) {prouct {prouctix) {prouct {prouctix {prouct {@proad i = 0; i <text.length (); hitung + 1: hitung;} return count;}}2. [图片] mybatis.jpg