国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Spring3.1.1+MyBatis3.1.1的增、刪、查、改以及分頁和事務管理

2019-11-26 14:40:21
字體:
來源:轉載
供稿:網友

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 {@Overridepublic 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();}@Overridepublic Object plugin(Object target) {return Plugin.wrap(target, this );}@Overridepublic void setProperties(Properties properties) {}}

3. [文件] Dialect.java

/*** 數據庫方言定義**/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 未實現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);// 如果SELECT 中包含 DISTINCT 只能在外層包含COUNTif (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的插入點位置** @return 返回最后一個Order By插入點的位置*/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返回空,否則返回轉化后的SQL*/private static String getLineSql(String sql) {return sql.replaceAll( "[/r/n]" , " " ).replaceAll( "http://s{2,}" , " " );}/*** 得到SQL第一個正確的FROM的的插入點*/private static int getAfterFormInsertPoint(String querySelect) {String regex = "http://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 ;}/*** 得到一個字符在另一個字符串中出現的次數** @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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 尼玛县| 漳州市| 冷水江市| 台中市| 绵竹市| 泸州市| 平和县| 望都县| 贵阳市| 绍兴县| 工布江达县| 东宁县| 鲜城| 普定县| 旺苍县| 蕉岭县| 三原县| 昭觉县| 贡觉县| 鄄城县| 巢湖市| 锡林浩特市| 宜章县| 永康市| 揭东县| 西贡区| 上思县| 普洱| 徐州市| 康马县| 桑日县| 鲁甸县| 汕尾市| 莱芜市| 长沙县| 南平市| 鄂州市| 台南市| 昭平县| 金昌市| 虹口区|