锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 1.鎶奾ibernate涓嬬殑dialect鍖呭叏閮ㄦ嫹璐濆埌mybatis鍖呯殑jdbc鐩綍涓嬶紝濡備笅鍥炬墍紺猴細 2.瀹氫箟涓涓猂esultSetHandler Interceptor imp imp @Intercepts( {@Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class})}) 3.瀹氫箟涓涓猄tatementHandler鐨処nterceptor imp imp @Intercepts( {@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class})}) 4.瀹氫箟宸ュ叿綾籖eflectUtil imp imp 5.鏇存柊mapper configuration鏂囦歡錛屾坊鍔犲涓嬪嚑鏉★紝娉ㄦ剰plugins鍦ㄦ暣涓猚onfiguration鏂囦歡涓殑欏哄簭 <plugins> 6.浣跨敤鏂規硶鍚宮ybatis閫昏緫鍒嗛〉錛屾嫤鎴櫒浼氳嚜鍔ㄦ嫤鎴墽琛孲QL鐨勫湴鏂癸紝鍔犱笂鍒嗛〉浠g爜錛?/strong> getSqlSession().selectList(mapId, queryKey,new RowBounds(pageId, pageSize)); 鍒嗛〉鏀寔綾伙細
鎶借薄涓氬姟綾? 鐢ㄦ埛鍦╳eb灞傛瀯閫犳煡璇㈡潯浠禿etachedCriteria錛屽拰鍙夌殑startIndex錛岃皟鐢ㄤ笟鍔ean鐨勭浉搴攆indByCriteria鏂規硶錛岃繑鍥炰竴涓狿aginationSupport鐨勫疄渚媝s銆?/p>
ps.getItems()寰楀埌宸插垎欏靛ソ鐨勭粨鏋滈泦
package cn.machi.utils;
imp
imp
imp
imp
imp
imp
imp
imp
public class DiclectResultSetHandlerInterceptor implements Interceptor
{
public Object intercept(Invocation invocation) throws Throwable
{
FastResultSetHandler resultSet = (FastResultSetHandler)invocation.getTarget();
RowBounds rowBounds = (RowBounds)ReflectUtil.getFieldValue(resultSet,
"rowBounds");
if (rowBounds.getLimit() > 0
&& rowBounds.getLimit() < RowBounds.NO_ROW_LIMIT)
{
ReflectUtil.setFieldValue(resultSet, "rowBounds", new RowBounds());
}
return invocation.proceed();
}
public Object plugin(Object target)
{
return Plugin.wrap(target, this);
}
public void setProperties(Properties properties)
{
}
}
package cn.machi.utils;
imp
imp
imp
imp
imp
imp
imp
imp
imp
imp
imp
public class DiclectStatementHandlerInterceptor implements Interceptor
{
private static final String DIALECT = "org.apache.ibatis.jdbc.dialect.OracleDialect";
public Object intercept(Invocation invocation) throws Throwable
{
RoutingStatementHandler statement = (RoutingStatementHandler)invocation.getTarget();
PreparedStatementHandler handler = (PreparedStatementHandler)ReflectUtil.getFieldValue(statement,
"delegate");
RowBounds rowBounds = (RowBounds)ReflectUtil.getFieldValue(handler,
"rowBounds");
if (rowBounds.getLimit() > 0
&& rowBounds.getLimit() < RowBounds.NO_ROW_LIMIT)
{
BoundSql boundSql = statement.getBoundSql();
String sql = boundSql.getSql();
OracleDialect dialect = (OracleDialect)Class.forName(DIALECT)
.newInstance();
sql = dialect.getLimitString(sql,
rowBounds.getOffset(),
rowBounds.getLimit());
ReflectUtil.setFieldValue(boundSql, "sql", sql);
}
return invocation.proceed();
}
public Object plugin(Object target)
{
return Plugin.wrap(target, this);
}
public void setProperties(Properties properties)
{
}
}
package cn.machi.utils;
imp
imp
imp
public class ReflectUtil
{
private static Logger log = Logger.getLogger(ReflectUtil.class);
private static Object operate(Object obj, String fieldName,
Object fieldVal, String type)
{
Object ret = null;
try
{
// 鑾峰緱瀵硅薄綾誨瀷
Class<? extends Object> classType = obj.getClass();
// 鑾峰緱瀵硅薄鐨勬墍鏈夊睘鎬?nbsp;
Field fields[] = classType.getDeclaredFields();
for (int i = 0; i < fields.length; i++)
{
Field field = fields[i];
if (field.getName().equals(fieldName))
{
String firstLetter = fieldName.substring(0, 1)
.toUpperCase(); // 鑾峰緱鍜屽睘鎬у搴旂殑getXXX()鏂規硶鐨勫悕瀛?nbsp;
if ("set".equals(type))
{
String setMethodName = "set" + firstLetter
+ fieldName.substring(1); // 鑾峰緱鍜屽睘鎬у搴旂殑getXXX()鏂規硶
Method setMethod = classType.getMethod(setMethodName,
new Class[] {field.getType()}); // 璋冪敤鍘熷璞$殑getXXX()鏂規硶
ret = setMethod.invoke(obj, new Object[] {fieldVal});
}
if ("get".equals(type))
{
String getMethodName = "get" + firstLetter
+ fieldName.substring(1); // 鑾峰緱鍜屽睘鎬у搴旂殑setXXX()鏂規硶鐨勫悕瀛?nbsp;
Method getMethod = classType.getMethod(getMethodName,
new Class[] {});
ret = getMethod.invoke(obj, new Object[] {});
}
return ret;
}
}
}
catch (Exception e)
{
log.warn("reflect error:" + fieldName, e);
}
return ret;
}
public static Object getVal(Object obj, String fieldName)
{
return operate(obj, fieldName, null, "get");
}
public static void setVal(Object obj, String fieldName, Object fieldVal)
{
operate(obj, fieldName, fieldVal, "set");
}
private static Method getDeclaredMethod(Object object, String methodName,
Class<?>[] parameterTypes)
{
for (Class<?> superClass = object.getClass(); superClass != Object.class; superClass = superClass.getSuperclass())
{
try
{
//superClass.getMethod(methodName, parameterTypes);
return superClass.getDeclaredMethod(methodName, parameterTypes);
}
catch (NoSuchMethodException e)
{
//Method 涓嶅湪褰撳墠綾誨畾涔? 緇х畫鍚戜笂杞瀷
}
}
return null;
}
private static void makeAccessible(Field field)
{
if (!Modifier.isPublic(field.getModifiers()))
{
field.setAccessible(true);
}
}
private static Field getDeclaredField(Object object, String filedName)
{
for (Class<?> superClass = object.getClass(); superClass != Object.class; superClass = superClass.getSuperclass())
{
try
{
return superClass.getDeclaredField(filedName);
}
catch (NoSuchFieldException e)
{
//Field 涓嶅湪褰撳墠綾誨畾涔? 緇х畫鍚戜笂杞瀷
}
}
return null;
}
public static Object invokeMethod(Object object, String methodName,
Class<?>[] parameterTypes, Object[] parameters)
throws InvocationTargetException
{
Method method = getDeclaredMethod(object, methodName, parameterTypes);
if (method == null)
{
throw new IllegalArgumentException("Could not find method ["
+ methodName + "] on target [" + object + "]");
}
method.setAccessible(true);
try
{
return method.invoke(object, parameters);
}
catch (IllegalAccessException e)
{
}
return null;
}
public static void setFieldValue(Object object, String fieldName,
Object value)
{
Field field = getDeclaredField(object, fieldName);
if (field == null)
throw new IllegalArgumentException("Could not find field ["
+ fieldName + "] on target [" + object + "]");
makeAccessible(field);
try
{
field.set(object, value);
}
catch (IllegalAccessException e)
{
e.printStackTrace();
}
}
public static Object getFieldValue(Object object, String fieldName)
{
Field field = getDeclaredField(object, fieldName);
if (field == null)
throw new IllegalArgumentException("Could not find field ["
+ fieldName + "] on target [" + object + "]");
makeAccessible(field);
Object result = null;
try
{
result = field.get(object);
}
catch (IllegalAccessException e)
{
e.printStackTrace();
}
return result;
}
}
<plugin interceptor="functionPoint.db.DiclectStatementHandlerInterceptor"/>
<plugin interceptor="functionPoint.db.DiclectResultSetHandlerInterceptor"/>
</plugins>
==============================================================
鎸夌収涓婇潰鐨勫仛浜?浣嗛亱琛屾檪鍗繪媼鍑虹己灝?IN OUT鍙冩暩涔嬮鐨勯尟瑾?
寰屼締鎻涗簡Dialect欏炴枃浠跺氨OK浜?OracleDialect鍏у鍙冭冭嚜:
]]>
銆銆
銆銆package com.deity.ranking.util;
import java.util.List;
銆銆import org.springframework.jdbc.core.JdbcTemplate;
銆銆import org.springframework.jdbc.core.support.JdbcDaoSupport;
銆銆/** * 鍒嗛〉鍑芥暟 *銆
* @author allenpan */
public class Pagination extends JdbcDaoSupport{
銆銆public static final int NUMBERS_PER_PAGE = 10;
銆銆//涓欏墊樉紺虹殑璁板綍鏁?br />
銆銆private int numPerPage;
銆銆//璁板綍鎬繪暟
銆銆private int totalRows;
銆銆//鎬婚〉鏁?br />
銆銆private int totalPages;
銆銆//褰撳墠欏電爜
銆銆private int currentPage;
銆銆//璧峰琛屾暟
銆銆private int startIndex;
銆銆//緇撴潫琛屾暟
銆銆private int lastIndex;
銆銆//緇撴灉闆嗗瓨鏀綥ist
銆銆private List resultList;
銆銆//JdbcTemplate jTemplate
銆銆private JdbcTemplate jTemplate;
銆銆/**
銆銆* 姣忛〉鏄劇ず10鏉¤褰曠殑鏋勯犲嚱鏁?浣跨敤璇ュ嚱鏁板繀欏誨厛緇橮agination璁劇疆currentPage錛宩Template鍒濆?br />
銆銆* @param sql oracle璇彞
銆銆*/
銆銆public Pagination(String sql){
銆銆if(jTemplate == null){
銆銆throw new IllegalArgumentException("com.deity.ranking.util.Pagination.jTemplate is null,please initial it first. ");
銆銆}else if(sql.equals("")){
銆銆throw new IllegalArgumentException("com.deity.ranking.util.Pagination.sql is empty,please initial it first. ");
銆銆}
銆銆new Pagination(sql,currentPage,NUMBERS_PER_PAGE,jTemplate);
銆銆}
銆銆/**鍒嗛〉鏋勯犲嚱鏁?br />
銆銆* @param sql 鏍規嵁浼犲叆鐨剆ql璇彞寰楀埌涓浜涘熀鏈垎欏典俊鎭?br />
銆銆* @param currentPage 褰撳墠欏?br />
銆銆* @param numPerPage 姣忛〉璁板綍鏁?br />
銆銆* @param jTemplate JdbcTemplate瀹炰緥
銆銆*/
銆銆public Pagination(String sql,int currentPage,int numPerPage,JdbcTemplate jTemplate){
銆銆if(jTemplate == null){
銆銆throw new IllegalArgumentException("com.deity.ranking.util.Pagination.jTemplate is null,please initial it first. ");
銆銆}else if(sql == null || sql.equals("")){
銆銆throw new IllegalArgumentException("com.deity.ranking.util.Pagination.sql is empty,please initial it first. ");
銆銆}
銆銆//璁劇疆姣忛〉鏄劇ず璁板綍鏁?br />
銆銆setNumPerPage(numPerPage);
銆銆//璁劇疆瑕佹樉紺虹殑欏墊暟
銆銆setCurrentPage(currentPage);
銆銆//璁$畻鎬昏褰曟暟
銆銆StringBuffer totalSQL = new StringBuffer(" SELECT count(*) FROM ( ");
銆銆totalSQL.append(sql);
銆銆totalSQL.append(" ) totalTable ");
銆銆//緇橨dbcTemplate璧嬪?br />
銆銆setJdbcTemplate(jTemplate);
銆銆//鎬昏褰曟暟
銆銆setTotalRows(getJdbcTemplate().queryForInt(totalSQL.toString()));
銆銆//璁$畻鎬婚〉鏁?br />
銆銆setTotalPages();
銆銆//璁$畻璧峰琛屾暟
銆銆setStartIndex();
銆銆//璁$畻緇撴潫琛屾暟
銆銆setLastIndex();
銆銆System.out.println("lastIndex="+lastIndex);//////////////////
銆銆//鏋勯爋racle鏁版嵁搴撶殑鍒嗛〉璇彞
銆銆StringBuffer paginationSQL = new StringBuffer(" SELECT * FROM ( ");
銆銆paginationSQL.append(" SELECT temp.* ,ROWNUM num FROM ( ");
銆銆paginationSQL.append(sql);
銆銆paginationSQL.append("銆) temp where ROWNUM <= " + lastIndex);
銆銆paginationSQL.append(" ) WHERE銆num > " + startIndex);
銆銆//瑁呭叆緇撴灉闆?br />
銆銆setResultList(getJdbcTemplate().queryForList(paginationSQL.toString()));
銆銆}
銆銆/**
銆銆* @param args
銆銆*/
銆銆public static void main(String[] args) {
銆銆// TODO Auto-generated method stub銆銆銆銆}
銆銆public int getCurrentPage() {
銆銆return currentPage;
銆銆}
銆銆public void setCurrentPage(int currentPage) {
銆銆this.currentPage = currentPage;
銆銆}
銆銆public int getNumPerPage() {
銆銆return numPerPage;
銆銆}
銆銆public void setNumPerPage(int numPerPage) {
銆銆this.numPerPage = numPerPage;
銆銆}
銆銆public List getResultList() {
銆銆return resultList;銆銆銆銆}
銆銆public void setResultList(List resultList) {
銆銆this.resultList = resultList;
銆銆}
銆銆public int getTotalPages() {
銆銆return totalPages;
銆銆}
銆銆//璁$畻鎬婚〉鏁?br />
銆銆public void setTotalPages() {
銆銆if(totalRows % numPerPage == 0){
銆銆this.totalPages = totalRows / numPerPage;
銆銆}else{
銆銆this.totalPages銆= (totalRows / numPerPage) + 1;
銆銆}
銆銆}
銆銆public int getTotalRows() {
銆銆return totalRows;
銆銆}
銆銆public void setTotalRows(int totalRows) {
銆銆this.totalRows = totalRows;
銆銆}
銆銆public int getStartIndex() {
銆銆return startIndex;
銆銆}
銆銆public void setStartIndex() {
銆銆this.startIndex = (currentPage - 1) * numPerPage;
銆銆}
銆銆public int getLastIndex() {
銆銆return lastIndex;
銆銆}
銆銆public JdbcTemplate getJTemplate() {
銆銆return jTemplate;
銆銆}
銆銆public void setJTemplate(JdbcTemplate template) {
銆銆jTemplate = template;
銆銆}
銆銆//璁$畻緇撴潫鏃跺欑殑绱㈠紩
銆銆public void setLastIndex() {
銆銆System.out.println("totalRows="+totalRows);///////////
銆銆System.out.println("numPerPage="+numPerPage);///////////
銆銆if( totalRows < numPerPage){
銆銆this.lastIndex = totalRows;
銆銆}else if((totalRows % numPerPage == 0) || (totalRows % numPerPage != 0 && currentPage < totalPages)){
銆銆this.lastIndex = currentPage * numPerPage;
銆銆}else if(totalRows % numPerPage != 0 && currentPage == totalPages){//鏈鍚庝竴欏?br />
銆銆this.lastIndex = totalRows ;
銆銆}
銆銆}}鍦ㄦ垜鐨勪笟鍔¢昏緫浠g爜涓細
銆銆/**
銆銆* find season ranking list from DC
銆銆* @param areaId 閫夋墜鍖哄煙id
銆銆* @param rankDate 璧涘
銆銆* @param category 綾誨埆
銆銆* @param characterName 瑙掕壊鍚?br />
銆銆* @return List
銆銆*/
銆銆public List findSeasonRankingList(Long areaId, int rankYear,int rankMonth,
銆銆Long categoryId,String characterName) {
銆銆//SQL璇彞
銆銆StringBuffer sql = new StringBuffer(" SELECT C.USERID userid,D.POSNAME posname,C.GAMEID gameid,C.AMOUNT amount,C.RANK rank FROM ");
銆銆//琛ㄣ銆銆銆銆銆銆銆銆銆銆銆sql.append(" (SELECT B.USERID USERID,");
銆銆sql.append(" B.POSID POSID,");
銆銆sql.append(" A.DISTRICT_CODE DISTRICTCODE,");
銆銆sql.append(" A.GAMEID GAMEID,");
銆銆sql.append(" AMOUNT AMOUNT,");
銆銆sql.append(" RANK RANK ");
銆銆sql.append(" FROM TB_FS_RANK A ");
銆銆sql.append(" LEFT JOIN TB_CHARACTER_INFO B ");
銆銆sql.append(" ON A.DISTRICT_CODE = B.DISTRICT_CODE ");
銆銆sql.append(" AND A.GAMEID = B.GAMEID ");
銆銆//闄勫姞鏉′歡
銆銆if(areaId != null && areaId.intValue() != 0){
銆銆sql.append(" and A.DISTRICT_CODE = " + areaId.intValue());
銆銆}
銆銆if( rankYear > 1970 && rankMonth > 0){
銆銆//hql.append(" and sas.id.dt >= to_date('" + rankYear + "-" + rankMonth + "-01 00:00:00'," + "YYYY-MM-DD HH24:MI:SS");
銆銆//hql.append(" and sas.id.dt <= to_date('" + rankYear + "-" + rankMonth + "-" + TimeTool.findMaxDateInMonth(rankYear,rankMonth) + " 23:59:59'," + "YYYY-MM-DD HH24:MI:SS");
銆銆sql.append(" and A.DT = fn_time_convert(to_date('" + rankYear + "-" + rankMonth + "'," + "'YYYY-MM')) ");
銆銆}
銆銆if(categoryId != null && categoryId.intValue() != 0){
銆銆sql.append(" and A.CID = " + categoryId.intValue());
銆銆}
銆銆if(characterName != null && !characterName.trim().equals("")){
銆銆sql.append(" and A.GAMEID = '" + characterName.trim()+"' ");
銆銆}
銆銆sql.append(" ORDER BY RANK ASC) C ");
銆銆sql.append(" LEFT JOIN TB_FS_POSITION D ");
銆銆sql.append(" ON C.POSID = D.POSID ");
銆銆sql.append(" ORDER BY C.RANK ");
銆銆System.out.println("hql="+sql.toString());////////////////
銆銆//浣跨敤鑷繁鐨勫垎欏電▼搴忔帶鍒剁粨鏋滈泦
銆銆Pagination pageInfo = new Pagination(sql.toString(),1,10,getJdbcTemplate());
銆銆return pageInfo.getResultList();
銆銆//return getJdbcTemplate().queryForList(sql.toString());
銆銆}
鏂囩珷渚嗘簮錛歨ttp://java.chinaitlab.com/Spring/38091.html
]]>
]]>
]]>
ps.getIndexes()寰楀埌鍒嗛〉绱㈠紩鐨勬暟緇?
ps.getTotalCount()寰楀埌鎬葷粨鏋滄暟
ps.getStartIndex()褰撳墠鍒嗛〉绱㈠紩
ps.getNextIndex()涓嬩竴欏電儲寮?
ps.getPreviousIndex()涓婁竴欏電儲寮?br />
鏂囩珷鍑哄:http://www.javaeye.com/topic/14657
]]>
//鍒嗛〉鏄劇ず
public class Pager {
private int currentPage; //褰撳墠欏?/span>
private int pageSize = 5; //姣忛〉鏄劇ず鐨勮褰曟暟
private int totalSize; //鎬昏褰曟暟
private int totalPage; //鎬婚〉鏁?br />
private boolean hasFirst; //鏄惁鏈夐欏?/span>
private boolean hasPrevious; // 鏄惁鏈変笂涓欏?/span>
private boolean hasNext; // 鏄惁鏈変笅涓欏?/span>
private boolean hasLast; // 鏄惁鏈夊熬欏?br />
/**鏋勯犲嚱鏁板繀欏諱紶鍏ヤ袱涓弬鏁板綋鍓嶉〉鍜屾昏褰曟暟
鏍規嵁褰撳墠欏靛彲浠ュ垽鏂槸鍚︽湁涓婁竴欏典笅涓欏電瓑絳?
鏍規嵁鎬昏褰曟暟鍙互綆楀嚭鎬婚〉鏁?/
public Pager(int currentPage,int totalSize){
this.currentPage = currentPage;
this.totalSize = totalSize;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public boolean isHasFirst() {
if(currentPage == 1)
return false;
return true;
}
public void setHasFirst(boolean hasFirst) {
this.hasFirst = hasFirst;
}
public boolean isHasLast() {
if(currentPage == getTotalPage())
return false;
return true;
}
public void setHasLast(boolean hasLast) {
this.hasLast = hasLast;
}
public boolean isHasNext() {
if(isHasLast())
return true;
return false;
}
public void setHasNext(boolean hasNext) {
this.hasNext = hasNext;
}
public boolean isHasPrevious() {
if(isHasFirst())
return true;
return false;
}
public void setHasPrevious(boolean hasPrevious) {
this.hasPrevious = hasPrevious;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalPage() {
//璁$畻鍑烘婚〉鏁?/span>
totalPage = totalSize / pageSize;
if(totalSize % pageSize != 0)
totalPage++;
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public int getTotalSize() {
return totalSize;
}
public void setTotalSize(int totalSize) {
this.totalSize = totalSize;
}
}