Spring3.1.1+MyBatis3.1.1的增、刪、查、改以及分頁和事務(wù)管理
1. [代碼]Mybatis全局配置文件
<plugins> < plugin interceptor = "com.has.core.page.PaginationInterceptor" /> </plugins>
2. [文件] PaginationInterceptor.java
@Intercepts ({ @Signature (type = StatementHandler. class , method = "prepare" , args = { Connection. class }) }) public class PaginationInterceptor implements Interceptor { @Override public Object intercept(Invocation invocation) throws Throwable { StatementHandler statementHandler = (StatementHandler) invocation.getTarget(); BoundSql boundSql = statementHandler.getBoundSql(); MetaObject metaStatementHandler = MetaObject.forObject(statementHandler); RowBounds rowBounds = (RowBounds) metaStatementHandler.getValue( "delegate.rowBounds" ); if (rowBounds == null || rowBounds == RowBounds.DEFAULT) { return invocation.proceed(); } Configuration configuration = (Configuration) metaStatementHandler.getValue( "delegate.configuration" ); Dialect.Type databaseType = null ; try { databaseType = Dialect.Type.valueOf(configuration.getVariables().getProperty( "dialect" ).toUpperCase()); } catch (Exception e) { } if (databaseType == null ) { throw new RuntimeException( "the value of the dialect property in configuration.xml is not defined : " + configuration.getVariables().getProperty( "dialect" )); } Dialect dialect = null ; switch (databaseType) { case MYSQL: dialect = new MySql5Dialect(); break ; case 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(); } @Override public Object plugin(Object target) { return Plugin.wrap(target, this ); } @Override public void setProperties(Properties properties) { } }
3. [文件] Dialect.java
/** * 數(shù)據(jù)庫方言定義 * */ public abstract class Dialect { public static enum Type { MYSQL, ORACLE } public abstract String getLimitString(String sql, int skipResults, int maxResults); }
4. [文件] MySql5Dialect.java
/** * mysql方言分頁類 */ public class MySql5Dialect extends Dialect { 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 limit) { return MySql5PageHepler.getLimitString(sql, offset, limit); } public boolean supportsLimit() { return true ; } }
5. [文件] OracleDialect.java
package com.chyjr.has.core.page.dialect; /** * oracel方言分頁 * */ public class OracleDialect extends Dialect { public String getLimitString(String sql, int offset, int limit) { // TODO 未實現(xiàn) return ""; } }
6. [文件] MySql5PageHepler.java
import java.util.regex.Matcher; import java.util.regex.Pattern; /** * mysql分頁工具類 */ public class MySql5PageHepler { /** * 得到查詢總數(shù)的sql */ public static String getCountString(String querySelect) { querySelect = getLineSql(querySelect); int orderIndex = getLastOrderInsertPoint(querySelect); int formIndex = getAfterFormInsertPoint(querySelect); String select = querySelect.substring( 0 , formIndex); // 如果SELECT 中包含 DISTINCT 只能在外層包含COUNT if (select.toLowerCase().indexOf( "select distinct" ) != - 1 || querySelect.toLowerCase().indexOf( "group by" ) != - 1 ) { return new StringBuffer(querySelect.length()).append( "select count(1) count from (" ) .append(querySelect.substring( 0 , orderIndex)).append( " ) t" ).toString(); } else { return new StringBuffer(querySelect.length()).append( "select count(1) count " ) .append(querySelect.substring(formIndex, orderIndex)).toString(); } } /** * 得到最后一個Order By的插入點(diǎn)位置 * * @return 返回最后一個Order By插入點(diǎn)的位置 */ private static int getLastOrderInsertPoint(String querySelect) { int orderIndex = querySelect.toLowerCase().lastIndexOf( "order by" ); if (orderIndex == - 1 || !isBracketCanPartnership(querySelect.substring(orderIndex, querySelect.length()))) { throw new RuntimeException( "My SQL 分頁必須要有Order by 語句!" ); } return orderIndex; } /** * 得到分頁的SQL * * @param offset * 偏移量 * @param limit * 位置 * @return 分頁SQL */ public static String 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返回空,否則返回轉(zhuǎn)化后的SQL */ private static String getLineSql(String sql) { return sql.replaceAll( "[\r\n]" , " " ).replaceAll( "\\s{2,}" , " " ); } /** * 得到SQL第一個正確的FROM的的插入點(diǎn) */ private static int getAfterFormInsertPoint(String querySelect) { String regex = "\\s+FROM\\s+" ; Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(querySelect); while (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 */ private static boolean isBracketCanPartnership(String text) { if (text == null || (getIndexOfCount(text, '(' ) != getIndexOfCount(text, ')' ))) { return false ; } return true ; } /** * 得到一個字符在另一個字符串中出現(xiàn)的次數(shù) * * @param text * 文本 * @param ch * 字符 */ private static int getIndexOfCount(String text, 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
相關(guān)文章
Java中Elasticsearch 實現(xiàn)分頁方式(三種方式)
Elasticsearch是用Java語言開發(fā)的,并作為Apache許可條款下的開放源碼發(fā)布,是一種流行的企業(yè)級搜索引擎,這篇文章主要介紹了Elasticsearch實現(xiàn)分頁的3種方式,需要的朋友可以參考下2022-07-07淺談Hibernate中的三種數(shù)據(jù)狀態(tài)(臨時、持久、游離)
下面小編就為大家?guī)硪黄獪\談Hibernate中的三種數(shù)據(jù)狀態(tài)(臨時、持久、游離)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09解決Eclipse的Servers視圖中無法添加Tomcat6/Tomcat7的方法
這篇文章主要介紹了解決Eclipse的Servers視圖中無法添加Tomcat6/Tomcat7的方法的相關(guān)資料,需要的朋友可以參考下2017-02-02Java中JVM的雙親委派、內(nèi)存溢出、垃圾回收和調(diào)優(yōu)詳解
這篇文章主要介紹了Java中JVM的雙親委派、內(nèi)存溢出、垃圾回收和調(diào)優(yōu)詳解,類加載器是Java虛擬機(jī)(JVM)的一個重要組成部分,它的主要作用是將類的字節(jié)碼加載到內(nèi)存中,并生成對應(yīng)的Class對象,需要的朋友可以參考下2023-07-07