Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
jinli gu
JeeSpringCloud
Commits
05beecd0
Commit
05beecd0
authored
Nov 12, 2018
by
Huang
Browse files
no commit message
parent
bc5dd330
Changes
461
Expand all
Hide whitespace changes
Inline
Side-by-side
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/persistence/dialect/DB2Dialect.java
0 → 100644
View file @
05beecd0
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.persistence.dialect
;
import
com.jeespring.common.persistence.dialect.Dialect
;
/**
* DB2的分页数据库方言实现
*
* @author poplar.yfyang
* @version 1.0 2010-10-10 下午12:31
* @since JDK 1.5
*/
public
class
DB2Dialect
implements
Dialect
{
@Override
public
boolean
supportsLimit
()
{
return
true
;
}
private
static
String
getRowNumber
(
String
sql
)
{
StringBuilder
rownumber
=
new
StringBuilder
(
50
)
.
append
(
"rownumber() over("
);
int
orderByIndex
=
sql
.
toLowerCase
().
indexOf
(
"order by"
);
if
(
orderByIndex
>
0
&&
!
hasDistinct
(
sql
))
{
rownumber
.
append
(
sql
.
substring
(
orderByIndex
));
}
rownumber
.
append
(
") as rownumber_,"
);
return
rownumber
.
toString
();
}
private
static
boolean
hasDistinct
(
String
sql
)
{
return
sql
.
toLowerCase
().
contains
(
"select distinct"
);
}
@Override
public
String
getLimitString
(
String
sql
,
int
offset
,
int
limit
)
{
return
getLimitString
(
sql
,
offset
,
Integer
.
toString
(
offset
),
Integer
.
toString
(
limit
));
}
/**
* 将sql变成分页sql语句,提供将offset及limit使用占位符号(placeholder)替换.
* <pre>
* 如mysql
* dialect.getLimitString("select * from user", 12, ":offset",0,":limit") 将返回
* select * from user limit :offset,:limit
* </pre>
*
* @param sql 实际SQL语句
* @param offset 分页开始纪录条数
* @param offsetPlaceholder 分页开始纪录条数-占位符号
* @param limitPlaceholder 分页纪录条数占位符号
* @return 包含占位符的分页sql
*/
public
String
getLimitString
(
String
sql
,
int
offset
,
String
offsetPlaceholder
,
String
limitPlaceholder
)
{
int
startOfSelect
=
sql
.
toLowerCase
().
indexOf
(
"select"
);
StringBuilder
pagingSelect
=
new
StringBuilder
(
sql
.
length
()
+
100
)
.
append
(
sql
.
substring
(
0
,
startOfSelect
))
//add the comment
.
append
(
"select * from ( select "
)
//nest the main query in an outer select
.
append
(
getRowNumber
(
sql
));
//add the rownnumber bit into the outer query select list
if
(
hasDistinct
(
sql
))
{
pagingSelect
.
append
(
" row_.* from ( "
)
//add another (inner) nested select
.
append
(
sql
.
substring
(
startOfSelect
))
//add the main query
.
append
(
" ) as row_"
);
//close off the inner nested select
}
else
{
pagingSelect
.
append
(
sql
.
substring
(
startOfSelect
+
6
));
//add the main query
}
pagingSelect
.
append
(
" ) as temp_ where rownumber_ "
);
//add the restriction to the outer select
if
(
offset
>
0
)
{
// int end = offset + limit;
String
endString
=
offsetPlaceholder
+
"+"
+
limitPlaceholder
;
pagingSelect
.
append
(
"between "
).
append
(
offsetPlaceholder
)
.
append
(
"+1 and "
).
append
(
endString
);
}
else
{
pagingSelect
.
append
(
"<= "
).
append
(
limitPlaceholder
);
}
return
pagingSelect
.
toString
();
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/persistence/dialect/DerbyDialect.java
0 → 100644
View file @
05beecd0
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.persistence.dialect
;
import
com.jeespring.common.persistence.dialect.Dialect
;
/**
* @author poplar.yfyang
* @version 1.0 2010-10-10 下午12:31
* @since JDK 1.5
*/
public
class
DerbyDialect
implements
Dialect
{
@Override
public
boolean
supportsLimit
()
{
return
false
;
}
@Override
public
String
getLimitString
(
String
sql
,
int
offset
,
int
limit
)
{
// return getLimitString(sql,offset,Integer.toString(offset),limit,Integer.toString(limit));
throw
new
UnsupportedOperationException
(
"paged queries not supported"
);
}
/**
* 将sql变成分页sql语句,提供将offset及limit使用占位符号(placeholder)替换.
* <pre>
* 如mysql
* dialect.getLimitString("select * from user", 12, ":offset",0,":limit") 将返回
* select * from user limit :offset,:limit
* </pre>
*
* @param sql 实际SQL语句
* @param offset 分页开始纪录条数
* @param offsetPlaceholder 分页开始纪录条数-占位符号
* @param limit 分页每页显示纪录条数
* @param limitPlaceholder 分页纪录条数占位符号
* @return 包含占位符的分页sql
*/
public
String
getLimitString
(
String
sql
,
int
offset
,
String
offsetPlaceholder
,
int
limit
,
String
limitPlaceholder
)
{
throw
new
UnsupportedOperationException
(
"paged queries not supported"
);
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/persistence/dialect/Dialect.java
0 → 100644
View file @
05beecd0
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.persistence.dialect
;
/**
* 类似hibernate的Dialect,但只精简出分页部分
*
* @author poplar.yfyang
* @version 1.0 2011-11-18 下午12:31
* @since JDK 1.5
*/
public
interface
Dialect
{
/**
* 数据库本身是否支持分页当前的分页查询方式
* 如果数据库不支持的话,则不进行数据库分页
*
* @return true:支持当前的分页查询方式
*/
boolean
supportsLimit
();
/**
* 将sql转换为分页SQL,分别调用分页sql
*
* @param sql SQL语句
* @param offset 开始条数
* @param limit 每页显示多少纪录条数
* @return 分页查询的sql
*/
String
getLimitString
(
String
sql
,
int
offset
,
int
limit
);
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/persistence/dialect/H2Dialect.java
0 → 100644
View file @
05beecd0
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.persistence.dialect
;
import
com.jeespring.common.persistence.dialect.Dialect
;
/**
* A dialect compatible with the H2 database.
*
* @author JeeSpring
* @version 1.0 2010-10-10 下午12:31
* @since JDK 1.5
*/
public
class
H2Dialect
implements
Dialect
{
@Override
public
boolean
supportsLimit
()
{
return
true
;
}
/**
* 将sql变成分页sql语句,提供将offset及limit使用占位符号(placeholder)替换.
* <pre>
* 如mysql
* dialect.getLimitString("select * from user", 12, ":offset",0,":limit") 将返回
* select * from user limit :offset,:limit
* </pre>
*
* @param sql 实际SQL语句
* @param offset 分页开始纪录条数
* @param offsetPlaceholder 分页开始纪录条数-占位符号
* @param limit 分页每页显示纪录条数
* @param limitPlaceholder 分页纪录条数占位符号
* @return 包含占位符的分页sql
*/
private
String
getLimitString
(
String
sql
,
int
offset
,
String
offsetPlaceholder
,
int
limit
,
String
limitPlaceholder
)
{
return
sql
+
((
offset
>
0
)
?
" limit "
+
limitPlaceholder
+
" offset "
+
offsetPlaceholder
:
" limit "
+
limitPlaceholder
);
}
@Override
public
String
getLimitString
(
String
sql
,
int
offset
,
int
limit
)
{
return
getLimitString
(
sql
,
offset
,
Integer
.
toString
(
offset
),
limit
,
Integer
.
toString
(
limit
));
}
}
\ No newline at end of file
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/persistence/dialect/HSQLDialect.java
0 → 100644
View file @
05beecd0
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.persistence.dialect
;
import
com.jeespring.common.persistence.dialect.Dialect
;
/**
* Dialect for HSQLDB
*
* @author poplar.yfyang
* @version 1.0 2010-10-10 下午12:31
* @since JDK 1.5
*/
public
class
HSQLDialect
implements
Dialect
{
@Override
public
boolean
supportsLimit
()
{
return
true
;
}
@Override
public
String
getLimitString
(
String
sql
,
int
offset
,
int
limit
)
{
return
getLimitString
(
sql
,
offset
,
Integer
.
toString
(
offset
),
Integer
.
toString
(
limit
));
}
/**
* 将sql变成分页sql语句,提供将offset及limit使用占位符号(placeholder)替换.
* <pre>
* 如mysql
* dialect.getLimitString("select * from user", 12, ":offset",0,":limit") 将返回
* select * from user limit :offset,:limit
* </pre>
*
* @param sql 实际SQL语句
* @param offset 分页开始纪录条数
* @param offsetPlaceholder 分页开始纪录条数-占位符号
* @param limitPlaceholder 分页纪录条数占位符号
* @return 包含占位符的分页sql
*/
public
String
getLimitString
(
String
sql
,
int
offset
,
String
offsetPlaceholder
,
String
limitPlaceholder
)
{
boolean
hasOffset
=
offset
>
0
;
return
new
StringBuffer
(
sql
.
length
()
+
10
)
.
append
(
sql
)
.
insert
(
sql
.
toLowerCase
().
indexOf
(
"select"
)
+
6
,
hasOffset
?
" limit "
+
offsetPlaceholder
+
" "
+
limitPlaceholder
:
" top "
+
limitPlaceholder
)
.
toString
();
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/persistence/dialect/MySQLDialect.java
0 → 100644
View file @
05beecd0
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.persistence.dialect
;
import
com.jeespring.common.persistence.dialect.Dialect
;
/**
* Mysql方言的实现
*
* @author poplar.yfyang
* @version 1.0 2010-10-10 下午12:31
* @since JDK 1.5
*/
public
class
MySQLDialect
implements
Dialect
{
@Override
public
String
getLimitString
(
String
sql
,
int
offset
,
int
limit
)
{
return
getLimitString
(
sql
,
offset
,
Integer
.
toString
(
offset
),
Integer
.
toString
(
limit
));
}
@Override
public
boolean
supportsLimit
()
{
return
true
;
}
/**
* 将sql变成分页sql语句,提供将offset及limit使用占位符号(placeholder)替换.
* <pre>
* 如mysql
* dialect.getLimitString("select * from user", 12, ":offset",0,":limit") 将返回
* select * from user limit :offset,:limit
* </pre>
*
* @param sql 实际SQL语句
* @param offset 分页开始纪录条数
* @param offsetPlaceholder 分页开始纪录条数-占位符号
* @param limitPlaceholder 分页纪录条数占位符号
* @return 包含占位符的分页sql
*/
public
String
getLimitString
(
String
sql
,
int
offset
,
String
offsetPlaceholder
,
String
limitPlaceholder
)
{
StringBuilder
stringBuilder
=
new
StringBuilder
(
sql
);
stringBuilder
.
append
(
" limit "
);
if
(
offset
>
0
)
{
stringBuilder
.
append
(
offsetPlaceholder
).
append
(
","
).
append
(
limitPlaceholder
);
}
else
{
stringBuilder
.
append
(
limitPlaceholder
);
}
return
stringBuilder
.
toString
();
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/persistence/dialect/OracleDialect.java
0 → 100644
View file @
05beecd0
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.persistence.dialect
;
/**
* Oracle的方言实现
* @author poplar.yfyang
* @version 1.0 2010-10-10 下午12:31
* @since JDK 1.5
*/
public
class
OracleDialect
implements
Dialect
{
@Override
public
boolean
supportsLimit
()
{
return
true
;
}
@Override
public
String
getLimitString
(
String
sql
,
int
offset
,
int
limit
)
{
return
getLimitString
(
sql
,
offset
,
Integer
.
toString
(
offset
),
Integer
.
toString
(
limit
));
}
/**
* 将sql变成分页sql语句,提供将offset及limit使用占位符号(placeholder)替换.
* <pre>
* 如mysql
* dialect.getLimitString("select * from user", 12, ":offset",0,":limit") 将返回
* select * from user limit :offset,:limit
* </pre>
*
* @param sql 实际SQL语句
* @param offset 分页开始纪录条数
* @param offsetPlaceholder 分页开始纪录条数-占位符号
* @param limitPlaceholder 分页纪录条数占位符号
* @return 包含占位符的分页sql
*/
public
String
getLimitString
(
String
sql
,
int
offset
,
String
offsetPlaceholder
,
String
limitPlaceholder
)
{
sql
=
sql
.
trim
();
boolean
isForUpdate
=
false
;
if
(
sql
.
toLowerCase
().
endsWith
(
" for update"
))
{
sql
=
sql
.
substring
(
0
,
sql
.
length
()
-
11
);
isForUpdate
=
true
;
}
StringBuilder
pagingSelect
=
new
StringBuilder
(
sql
.
length
()
+
100
);
if
(
offset
>
0
)
{
pagingSelect
.
append
(
"select * from ( select row_.*, rownum rownum_ from ( "
);
}
else
{
pagingSelect
.
append
(
"select * from ( "
);
}
pagingSelect
.
append
(
sql
);
if
(
offset
>
0
)
{
String
endString
=
offsetPlaceholder
+
"+"
+
limitPlaceholder
;
pagingSelect
.
append
(
" ) row_ where rownum <= "
+
endString
+
") where rownum_ > "
).
append
(
offsetPlaceholder
);
}
else
{
pagingSelect
.
append
(
" ) where rownum <= "
+
limitPlaceholder
);
}
if
(
isForUpdate
)
{
pagingSelect
.
append
(
" for update"
);
}
return
pagingSelect
.
toString
();
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/persistence/dialect/PostgreSQLDialect.java
0 → 100644
View file @
05beecd0
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.persistence.dialect
;
import
com.jeespring.common.persistence.dialect.Dialect
;
/**
* Postgre Sql的方言实现
* @author poplar.yfyang
* @version 1.0 2010-10-10 下午12:31
* @since JDK 1.5
*/
public
class
PostgreSQLDialect
implements
Dialect
{
@Override
public
boolean
supportsLimit
()
{
return
true
;
}
@Override
public
String
getLimitString
(
String
sql
,
int
offset
,
int
limit
)
{
return
getLimitString
(
sql
,
offset
,
Integer
.
toString
(
offset
),
Integer
.
toString
(
limit
));
}
/**
* 将sql变成分页sql语句,提供将offset及limit使用占位符号(placeholder)替换.
* <pre>
* 如mysql
* dialect.getLimitString("select * from user", 12, ":offset",0,":limit") 将返回
* select * from user limit :offset,:limit
* </pre>
*
* @param sql 实际SQL语句
* @param offset 分页开始纪录条数
* @param offsetPlaceholder 分页开始纪录条数-占位符号
* @param limitPlaceholder 分页纪录条数占位符号
* @return 包含占位符的分页sql
*/
public
String
getLimitString
(
String
sql
,
int
offset
,
String
offsetPlaceholder
,
String
limitPlaceholder
)
{
StringBuilder
pageSql
=
new
StringBuilder
().
append
(
sql
);
pageSql
=
offset
<=
0
?
pageSql
.
append
(
" limit "
).
append
(
limitPlaceholder
)
:
pageSql
.
append
(
" limit "
).
append
(
limitPlaceholder
).
append
(
" offset "
).
append
(
offsetPlaceholder
);
return
pageSql
.
toString
();
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/persistence/dialect/SQLServer2005Dialect.java
0 → 100644
View file @
05beecd0
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.persistence.dialect
;
import
org.apache.commons.lang3.StringUtils
;
import
com.jeespring.common.persistence.dialect.Dialect
;
/**
* Sql 2005的方言实现
* @author poplar.yfyang
* @version 1.0 2010-10-10 下午12:31
* @since JDK 1.5
*/
public
class
SQLServer2005Dialect
implements
Dialect
{
@Override
public
boolean
supportsLimit
()
{
return
true
;
}
@Override
public
String
getLimitString
(
String
sql
,
int
offset
,
int
limit
)
{
return
getLimitString
(
sql
,
offset
,
limit
,
Integer
.
toString
(
limit
));
}
/**
* Add a LIMIT clause to the given SQL SELECT
* <p/>
* The LIMIT SQL will look like:
* <p/>
* WITH query AS
* (SELECT TOP 100 percent ROW_NUMBER() OVER (ORDER BY CURRENT_TIMESTAMP) as __row_number__, * from table_name)
* SELECT *
* FROM query
* WHERE __row_number__ BETWEEN :offset and :lastRows
* ORDER BY __row_number__
*
* @param querySqlString The SQL statement to base the limit query off of.
* @param offset Offset of the first row to be returned by the query (zero-based)
* @param limit Maximum number of rows to be returned by the query
* @param limitPlaceholder limitPlaceholder
* @return A new SQL statement with the LIMIT clause applied.
*/
private
String
getLimitString
(
String
querySqlString
,
int
offset
,
int
limit
,
String
limitPlaceholder
)
{
StringBuilder
pagingBuilder
=
new
StringBuilder
();
String
orderby
=
getOrderByPart
(
querySqlString
);
String
distinctStr
=
""
;
String
loweredString
=
querySqlString
.
toLowerCase
();
String
sqlPartString
=
querySqlString
;
if
(
loweredString
.
trim
().
startsWith
(
"select"
))
{
int
index
=
6
;
if
(
loweredString
.
startsWith
(
"select distinct"
))
{
distinctStr
=
"DISTINCT "
;
index
=
15
;
}
sqlPartString
=
sqlPartString
.
substring
(
index
);
}
pagingBuilder
.
append
(
sqlPartString
);
// if no ORDER BY is specified use fake ORDER BY field to avoid errors
if
(
StringUtils
.
isEmpty
(
orderby
))
{
orderby
=
"ORDER BY CURRENT_TIMESTAMP"
;
}
StringBuilder
result
=
new
StringBuilder
();
result
.
append
(
"WITH query AS (SELECT "
)
.
append
(
distinctStr
)
.
append
(
"TOP 100 PERCENT "
)
.
append
(
" ROW_NUMBER() OVER ("
)
.
append
(
orderby
)
.
append
(
") as __row_number__, "
)
.
append
(
pagingBuilder
)
.
append
(
") SELECT * FROM query WHERE __row_number__ BETWEEN "
)
.
append
(
offset
+
1
).
append
(
" AND "
).
append
(
offset
+
limit
)
.
append
(
" ORDER BY __row_number__"
);
return
result
.
toString
();
}
static
String
getOrderByPart
(
String
sql
)
{
String
loweredString
=
sql
.
toLowerCase
();
int
orderByIndex
=
loweredString
.
indexOf
(
"order by"
);
if
(
orderByIndex
!=
-
1
)
{
// if we find a new "order by" then we need to ignore
// the previous one since it was probably used for a subquery
return
sql
.
substring
(
orderByIndex
);
}
else
{
return
""
;
}
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/persistence/dialect/SQLServerDialect.java
0 → 100644
View file @
05beecd0
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.persistence.dialect
;
import
com.jeespring.common.persistence.dialect.Dialect
;
/**
* MSSQLServer 数据库实现分页方言
*
* @author poplar.yfyang
* @version 1.0 2010-10-10 下午12:31
* @since JDK 1.5
*/
public
class
SQLServerDialect
implements
Dialect
{
@Override
public
boolean
supportsLimit
()
{
return
true
;
}
static
int
getAfterSelectInsertPoint
(
String
sql
)
{
int
selectIndex
=
sql
.
toLowerCase
().
indexOf
(
"select"
);
final
int
selectDistinctIndex
=
sql
.
toLowerCase
().
indexOf
(
"select distinct"
);
return
selectIndex
+
(
selectDistinctIndex
==
selectIndex
?
15
:
6
);
}
@Override
public
String
getLimitString
(
String
sql
,
int
offset
,
int
limit
)
{
return
getLimit
(
sql
,
offset
,
limit
);
}
/**
* 将sql变成分页sql语句,提供将offset及limit使用占位符号(placeholder)替换.
* <pre>
* 如mysql
* dialect.getLimitString("select * from user", 12, ":offset",0,":limit") 将返回
* select * from user limit :offset,:limit
* </pre>
*
* @param sql 实际SQL语句
* @param offset 分页开始纪录条数
* @param limit 分页每页显示纪录条数
* @return 包含占位符的分页sql
*/
public
String
getLimit
(
String
sql
,
int
offset
,
int
limit
)
{
if
(
offset
>
0
)
{
throw
new
UnsupportedOperationException
(
"sql server has no offset"
);
}
return
new
StringBuffer
(
sql
.
length
()
+
8
)
.
append
(
sql
)
.
insert
(
getAfterSelectInsertPoint
(
sql
),
" top "
+
limit
)
.
toString
();
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/persistence/dialect/SybaseDialect.java
0 → 100644
View file @
05beecd0
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.persistence.dialect
;
import
com.jeespring.common.persistence.dialect.Dialect
;
/**
* Sybase数据库分页方言实现。
* 还未实现
*
* @author poplar.yfyang
* @version 1.0 2010-10-10 下午12:31
* @since JDK 1.5
*/
public
class
SybaseDialect
implements
Dialect
{
@Override
public
boolean
supportsLimit
()
{
return
false
;
}
@Override
public
String
getLimitString
(
String
sql
,
int
offset
,
int
limit
)
{
return
null
;
}
/**
* 将sql变成分页sql语句,提供将offset及limit使用占位符号(placeholder)替换.
* <pre>
* 如mysql
* dialect.getLimitString("select * from user", 12, ":offset",0,":limit") 将返回
* select * from user limit :offset,:limit
* </pre>
*
* @param sql 实际SQL语句
* @param offset 分页开始纪录条数
* @param offsetPlaceholder 分页开始纪录条数-占位符号
* @param limit 分页每页显示纪录条数
* @param limitPlaceholder 分页纪录条数占位符号
* @return 包含占位符的分页sql
*/
public
String
getLimitString
(
String
sql
,
int
offset
,
String
offsetPlaceholder
,
int
limit
,
String
limitPlaceholder
)
{
throw
new
UnsupportedOperationException
(
"paged queries not supported"
);
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/persistence/interceptor/BaseInterceptor.java
0 → 100644
View file @
05beecd0
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.persistence.interceptor
;
import
com.jeespring.common.config.Global
;
import
com.jeespring.common.persistence.Page
;
import
com.jeespring.common.persistence.dialect.*
;
import
com.jeespring.common.utils.Reflections
;
import
org.apache.ibatis.logging.Log
;
import
org.apache.ibatis.logging.LogFactory
;
import
org.apache.ibatis.plugin.Interceptor
;
import
java.io.Serializable
;
import
java.util.Properties
;
/**
* Mybatis分页拦截器基类
*
* @author poplar.yfyang / HuangBingGui
* @version 2013-8-28
*/
public
abstract
class
BaseInterceptor
implements
Interceptor
,
Serializable
{
private
static
final
long
serialVersionUID
=
1L
;
protected
static
final
String
PAGE
=
"page"
;
protected
static
final
String
DELEGATE
=
"delegate"
;
protected
static
final
String
MAPPED_STATEMENT
=
"mappedStatement"
;
protected
Log
log
=
LogFactory
.
getLog
(
this
.
getClass
());
protected
Dialect
DIALECT
;
/**
* 对参数进行转换和检查
*
* @param parameterObject 参数对象
* @param page 分页对象
* @return 分页对象
* @throws NoSuchFieldException 无法找到参数
*/
@SuppressWarnings
(
"unchecked"
)
protected
static
Page
<
Object
>
convertParameter
(
Object
parameterObject
,
Page
<
Object
>
page
)
{
try
{
if
(
parameterObject
instanceof
Page
)
{
return
(
Page
<
Object
>)
parameterObject
;
}
else
{
return
(
Page
<
Object
>)
Reflections
.
getFieldValue
(
parameterObject
,
PAGE
);
}
}
catch
(
Exception
e
)
{
return
null
;
}
}
/**
* 设置属性,支持自定义方言类和制定数据库的方式
* <code>dialectClass</code>,自定义方言类。可以不配置这项
* <ode>dbms</ode> 数据库类型,插件支持的数据库
* <code>sqlPattern</code> 需要拦截的SQL ID
*
* @param p 属性
*/
protected
void
initProperties
(
Properties
p
)
{
Dialect
dialect
=
null
;
String
dbType
=
Global
.
getJdbcType
();
if
(
"db2"
.
equals
(
dbType
))
{
dialect
=
new
DB2Dialect
();
}
else
if
(
"derby"
.
equals
(
dbType
))
{
dialect
=
new
DerbyDialect
();
}
else
if
(
"h2"
.
equals
(
dbType
))
{
dialect
=
new
H2Dialect
();
}
else
if
(
"hsql"
.
equals
(
dbType
))
{
dialect
=
new
HSQLDialect
();
}
else
if
(
"mysql"
.
equals
(
dbType
))
{
dialect
=
new
MySQLDialect
();
}
else
if
(
"oracle"
.
equals
(
dbType
))
{
dialect
=
new
OracleDialect
();
}
else
if
(
"postgre"
.
equals
(
dbType
))
{
dialect
=
new
PostgreSQLDialect
();
}
else
if
(
"mssql"
.
equals
(
dbType
)
||
"sqlserver"
.
equals
(
dbType
))
{
dialect
=
new
SQLServer2005Dialect
();
}
else
if
(
"sybase"
.
equals
(
dbType
))
{
dialect
=
new
SybaseDialect
();
}
if
(
dialect
==
null
)
{
log
.
error
(
"user the mysql dialect"
);
dialect
=
new
MySQLDialect
();
}
DIALECT
=
dialect
;
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/persistence/interceptor/PaginationInterceptor.java
0 → 100644
View file @
05beecd0
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.persistence.interceptor
;
import
java.util.Properties
;
import
org.apache.ibatis.executor.Executor
;
import
org.apache.ibatis.mapping.BoundSql
;
import
org.apache.ibatis.mapping.MappedStatement
;
import
org.apache.ibatis.mapping.SqlSource
;
import
org.apache.ibatis.plugin.Intercepts
;
import
org.apache.ibatis.plugin.Invocation
;
import
org.apache.ibatis.plugin.Plugin
;
import
org.apache.ibatis.plugin.Signature
;
import
org.apache.ibatis.reflection.MetaObject
;
import
org.apache.ibatis.session.ResultHandler
;
import
org.apache.ibatis.session.RowBounds
;
import
com.jeespring.common.persistence.Page
;
import
com.jeespring.common.utils.Reflections
;
import
com.jeespring.common.utils.StringUtils
;
/**
* 数据库分页插件,只拦截查询语句.
* @author poplar.yfyang / HuangBingGui
* @version 2013-8-28
*/
@Intercepts
({
@Signature
(
type
=
Executor
.
class
,
method
=
"query"
,
args
=
{
MappedStatement
.
class
,
Object
.
class
,
RowBounds
.
class
,
ResultHandler
.
class
})})
public
class
PaginationInterceptor
extends
BaseInterceptor
{
private
static
final
long
serialVersionUID
=
1L
;
@Override
public
Object
intercept
(
Invocation
invocation
)
throws
Throwable
{
final
MappedStatement
mappedStatement
=
(
MappedStatement
)
invocation
.
getArgs
()[
0
];
// //拦截需要分页的SQL
//// if (mappedStatement.getId().matches(_SQL_PATTERN)) {
// if (StringUtils.indexOfIgnoreCase(mappedStatement.getId(), _SQL_PATTERN) != -1) {
Object
parameter
=
invocation
.
getArgs
()[
1
];
BoundSql
boundSql
=
mappedStatement
.
getBoundSql
(
parameter
);
Object
parameterObject
=
boundSql
.
getParameterObject
();
//获取分页参数对象
Page
<
Object
>
page
=
null
;
if
(
parameterObject
!=
null
)
{
page
=
convertParameter
(
parameterObject
,
page
);
}
//如果设置了分页对象,则进行分页
if
(
page
!=
null
&&
page
.
getPageSize
()
!=
-
1
)
{
if
(
StringUtils
.
isBlank
(
boundSql
.
getSql
())){
return
null
;
}
String
originalSql
=
boundSql
.
getSql
().
trim
();
//得到总记录数
page
.
setCount
(
SQLHelper
.
getCount
(
originalSql
,
null
,
mappedStatement
,
parameterObject
,
boundSql
,
log
));
//分页查询 本地化对象 修改数据库注意修改实现
String
pageSql
=
SQLHelper
.
generatePageSql
(
originalSql
,
page
,
DIALECT
);
// if (log.isDebugEnabled()) {
// log.debug("PAGE SQL:" + StringUtils.replace(pageSql, "\n", ""));
// }
invocation
.
getArgs
()[
2
]
=
new
RowBounds
(
RowBounds
.
NO_ROW_OFFSET
,
RowBounds
.
NO_ROW_LIMIT
);
BoundSql
newBoundSql
=
new
BoundSql
(
mappedStatement
.
getConfiguration
(),
pageSql
,
boundSql
.
getParameterMappings
(),
boundSql
.
getParameterObject
());
//解决MyBatis 分页foreach 参数失效 start
if
(
Reflections
.
getFieldValue
(
boundSql
,
"metaParameters"
)
!=
null
)
{
MetaObject
mo
=
(
MetaObject
)
Reflections
.
getFieldValue
(
boundSql
,
"metaParameters"
);
Reflections
.
setFieldValue
(
newBoundSql
,
"metaParameters"
,
mo
);
}
//解决MyBatis 分页foreach 参数失效 end
MappedStatement
newMs
=
copyFromMappedStatement
(
mappedStatement
,
new
BoundSqlSqlSource
(
newBoundSql
));
invocation
.
getArgs
()[
0
]
=
newMs
;
}
// }
return
invocation
.
proceed
();
}
@Override
public
Object
plugin
(
Object
target
)
{
return
Plugin
.
wrap
(
target
,
this
);
}
@Override
public
void
setProperties
(
Properties
properties
)
{
super
.
initProperties
(
properties
);
}
private
MappedStatement
copyFromMappedStatement
(
MappedStatement
ms
,
SqlSource
newSqlSource
)
{
MappedStatement
.
Builder
builder
=
new
MappedStatement
.
Builder
(
ms
.
getConfiguration
(),
ms
.
getId
(),
newSqlSource
,
ms
.
getSqlCommandType
());
builder
.
resource
(
ms
.
getResource
());
builder
.
fetchSize
(
ms
.
getFetchSize
());
builder
.
statementType
(
ms
.
getStatementType
());
builder
.
keyGenerator
(
ms
.
getKeyGenerator
());
if
(
ms
.
getKeyProperties
()
!=
null
)
{
for
(
String
keyProperty
:
ms
.
getKeyProperties
())
{
builder
.
keyProperty
(
keyProperty
);
}
}
builder
.
timeout
(
ms
.
getTimeout
());
builder
.
parameterMap
(
ms
.
getParameterMap
());
builder
.
resultMaps
(
ms
.
getResultMaps
());
builder
.
cache
(
ms
.
getCache
());
builder
.
useCache
(
ms
.
isUseCache
());
return
builder
.
build
();
}
public
static
class
BoundSqlSqlSource
implements
SqlSource
{
BoundSql
boundSql
;
public
BoundSqlSqlSource
(
BoundSql
boundSql
)
{
this
.
boundSql
=
boundSql
;
}
@Override
public
BoundSql
getBoundSql
(
Object
parameterObject
)
{
return
boundSql
;
}
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/persistence/interceptor/PreparePaginationInterceptor.java
0 → 100644
View file @
05beecd0
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.persistence.interceptor
;
import
java.sql.Connection
;
import
java.util.Properties
;
import
org.apache.ibatis.executor.statement.BaseStatementHandler
;
import
org.apache.ibatis.executor.statement.RoutingStatementHandler
;
import
org.apache.ibatis.executor.statement.StatementHandler
;
import
org.apache.ibatis.mapping.BoundSql
;
import
org.apache.ibatis.mapping.MappedStatement
;
import
org.apache.ibatis.plugin.Intercepts
;
import
org.apache.ibatis.plugin.Invocation
;
import
org.apache.ibatis.plugin.Plugin
;
import
org.apache.ibatis.plugin.Signature
;
import
com.jeespring.common.persistence.Page
;
import
com.jeespring.common.utils.Reflections
;
/**
* Mybatis数据库分页插件,拦截StatementHandler的prepare方法
* @author poplar.yfyang / HuangBingGui
* @version 2013-8-28
*/
@Intercepts
({
@Signature
(
type
=
StatementHandler
.
class
,
method
=
"prepare"
,
args
=
{
Connection
.
class
})
})
public
class
PreparePaginationInterceptor
extends
BaseInterceptor
{
private
static
final
long
serialVersionUID
=
1L
;
public
PreparePaginationInterceptor
()
{
super
();
}
@Override
public
Object
intercept
(
Invocation
ivk
)
throws
Throwable
{
if
(
ivk
.
getTarget
().
getClass
().
isAssignableFrom
(
RoutingStatementHandler
.
class
))
{
final
RoutingStatementHandler
statementHandler
=
(
RoutingStatementHandler
)
ivk
.
getTarget
();
final
BaseStatementHandler
delegate
=
(
BaseStatementHandler
)
Reflections
.
getFieldValue
(
statementHandler
,
DELEGATE
);
final
MappedStatement
mappedStatement
=
(
MappedStatement
)
Reflections
.
getFieldValue
(
delegate
,
MAPPED_STATEMENT
);
// //拦截需要分页的SQL
//// if (mappedStatement.getId().matches(_SQL_PATTERN)) {
// if (StringUtils.indexOfIgnoreCase(mappedStatement.getId(), _SQL_PATTERN) != -1) {
BoundSql
boundSql
=
delegate
.
getBoundSql
();
//分页SQL<select>中parameterType属性对应的实体参数,即Mapper接口中执行分页方法的参数,该参数不得为空
Object
parameterObject
=
boundSql
.
getParameterObject
();
if
(
parameterObject
==
null
)
{
log
.
error
(
"参数未实例化"
);
throw
new
NullPointerException
(
"parameterObject尚未实例化!"
);
}
else
{
final
Connection
connection
=
(
Connection
)
ivk
.
getArgs
()[
0
];
final
String
sql
=
boundSql
.
getSql
();
//记录统计
final
int
count
=
SQLHelper
.
getCount
(
sql
,
connection
,
mappedStatement
,
parameterObject
,
boundSql
,
log
);
Page
<
Object
>
page
=
null
;
page
=
convertParameter
(
parameterObject
,
page
);
page
.
setCount
(
count
);
String
pagingSql
=
SQLHelper
.
generatePageSql
(
sql
,
page
,
DIALECT
);
if
(
log
.
isDebugEnabled
())
{
log
.
debug
(
"PAGE SQL:"
+
pagingSql
);
}
//将分页sql语句反射回BoundSql.
Reflections
.
setFieldValue
(
boundSql
,
"sql"
,
pagingSql
);
}
if
(
boundSql
.
getSql
()
==
null
||
""
.
equals
(
boundSql
.
getSql
())){
return
null
;
}
}
// }
return
ivk
.
proceed
();
}
@Override
public
Object
plugin
(
Object
o
)
{
return
Plugin
.
wrap
(
o
,
this
);
}
@Override
public
void
setProperties
(
Properties
properties
)
{
initProperties
(
properties
);
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/persistence/interceptor/SQLHelper.java
0 → 100644
View file @
05beecd0
This diff is collapsed.
Click to expand it.
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/persistence/proxy/PageConfiguration.java
0 → 100644
View file @
05beecd0
/**
* Copyright © 2012-2016 <a href="https://github.com/HuangBingGui/jeespring">jeespring</a> All rights reserved.
*/
package
com.jeespring.common.persistence.proxy
;
import
org.apache.ibatis.binding.MapperRegistry
;
import
org.apache.ibatis.session.Configuration
;
import
org.apache.ibatis.session.SqlSession
;
/**
* <p>
* 自定义Mybatis的配置,扩展.
* </p>
*
* @author poplar.yfyang
* @version 1.0 2012-05-13 上午10:06
* @since JDK 1.5
*/
public
class
PageConfiguration
extends
Configuration
{
protected
MapperRegistry
mapperRegistry
=
new
PaginationMapperRegistry
(
this
);
@Override
public
<
T
>
void
addMapper
(
Class
<
T
>
type
)
{
mapperRegistry
.
addMapper
(
type
);
}
@Override
public
<
T
>
T
getMapper
(
Class
<
T
>
type
,
SqlSession
sqlSession
)
{
return
mapperRegistry
.
getMapper
(
type
,
sqlSession
);
}
@Override
public
boolean
hasMapper
(
Class
<?>
type
)
{
return
mapperRegistry
.
hasMapper
(
type
);
}
}
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/persistence/proxy/PaginationMapperMethod.java
0 → 100644
View file @
05beecd0
This diff is collapsed.
Click to expand it.
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/persistence/proxy/PaginationMapperProxy.java
0 → 100644
View file @
05beecd0
This diff is collapsed.
Click to expand it.
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/persistence/proxy/PaginationMapperRegistry.java
0 → 100644
View file @
05beecd0
This diff is collapsed.
Click to expand it.
JeeSpringCloud/jeespring-framework/src/main/java/com/jeespring/common/redis/JedisUtils.java
0 → 100644
View file @
05beecd0
This diff is collapsed.
Click to expand it.
Prev
1
2
3
4
5
6
7
…
24
Next
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment