激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Spring3.1.1+MyBatis3.1.1的增、刪、查、改以及分頁和事務管理

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

2020-03-22 13:20mrr JAVA教程

這篇文章主要介紹了Spring3.1.1+MyBatis3.1.1的增、刪、查、改以及分頁和事務管理的相關資料,需要的朋友可以參考下

1. [代碼]Mybatis全局配置文件

?
1
2
3
<plugins>
< plugin interceptor = "com.has.core.page.PaginationInterceptor" />
</plugins>

2. [文件] PaginationInterceptor.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
@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

?
1
2
3
4
5
6
7
8
9
10
/**
* 數據庫方言定義
*
*/
public abstract class Dialect {
public static enum Type {
MYSQL, ORACLE
}
public abstract String getLimitString(String sql, int skipResults, int maxResults);
}

4. [文件] MySql5Dialect.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* 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

?
1
2
3
4
5
6
7
8
9
10
11
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
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 只能在外層包含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的插入點位置
*
* @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( "\\s{2,}" , " " );
}
/**
* 得到SQL第一個正確的FROM的的插入點
*/
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 ;
}
/**
* 得到一個字符在另一個字符串中出現的次數
*
* @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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲生活片| 成人免费视频 | 日本欧美一区二区三区在线播 | 午夜视频免费播放 | 久久久99精品视频 | 嫩草影院在线观看网站成人 | 澳门一级淫片免费视频 | 亚洲精品动漫在线观看 | 黄色一级视频 | 九九视屏 | 久久福利剧场 | 成人黄色短视频在线观看 | 爱福利视频网 | 中韩毛片 | 免费放黄网站在线播放 | 国产污污视频 | 亚洲一区二区三区在线看 | 国产一有一级毛片视频 | av中文一区 | 免费看综艺策驰影院 | 久久精品视频免费观看 | 午夜视频在线免费观看 | 99久久久久国产精品免费 | 国产视频精品在线 | 欧美成人精品欧美一级 | 成人免费观看49www在线观看 | 久久精品网站视频 | a级在线| 新久久久久久 | 久久国产精品系列 | 特级西西444www大精品视频免费看 | 久久性生活免费视频 | 成人在线视频免费播放 | 国产精品成人一区二区三区电影毛片 | 中文字幕xxx | 九九热精品免费视频 | 日日cao | 717影院理论午夜伦八戒秦先生 | 亚洲精品午夜国产va久久成人 | 九色国产| 久久精品欧美一区二区三区不卡 |