隨筆 - 6  文章 - 129  trackbacks - 0
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(14)

          隨筆檔案(6)

          文章分類(467)

          文章檔案(423)

          相冊

          收藏夾(18)

          JAVA

          搜索

          •  

          積分與排名

          • 積分 - 827218
          • 排名 - 49

          最新評論

          閱讀排行榜

          評論排行榜

          以下內(nèi)容來自:
          http://zhaohe162.blog.163.com/blog/static/38216797201131262952990/

          1.把hibernate下的dialect包全部拷貝到mybatis包的jdbc目錄下,如下圖所示:

          mybatis下的分頁,支持所有的數(shù)據(jù)庫 - 斷塵傷痕 - 斷塵居
           



          2.定義一個ResultSetHandler  Interceptor

          package cn.machi.utils;

          import java.sql.Statement;
          import java.util.Properties;

          import org.apache.ibatis.executor.resultset.FastResultSetHandler;
          import org.apache.ibatis.executor.resultset.ResultSetHandler;
          import org.apache.ibatis.plugin.Interceptor;
          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.session.RowBounds;

          @Intercepts( {@Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class})})
          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)
              {
              }
          }

           

          3.定義一個StatementHandler的Interceptor

          package cn.machi.utils;

          import java.sql.Connection;
          import java.util.Properties;

          import org.apache.ibatis.executor.statement.PreparedStatementHandler;
          import org.apache.ibatis.executor.statement.RoutingStatementHandler;
          import org.apache.ibatis.executor.statement.StatementHandler;
          import org.apache.ibatis.jdbc.dialect.OracleDialect;
          import org.apache.ibatis.mapping.BoundSql;
          import org.apache.ibatis.plugin.Interceptor;
          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.session.RowBounds;

          @Intercepts( {@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class})})
          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)
              {
              }
          }

          4.定義工具類ReflectUtil

          package cn.machi.utils;

          import java.lang.reflect.Field;
          import java.lang.reflect.InvocationTargetException;
          import java.lang.reflect.Method;
          import java.lang.reflect.Modifier;

          import org.apache.log4j.Logger;


          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();
                      // 獲得對象的所有屬性 
                      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(); // 獲得和屬性對應(yīng)的getXXX()方法的名字 
                              if ("set".equals(type))
                              {
                                  String setMethodName = "set" + firstLetter
                                          + fieldName.substring(1); // 獲得和屬性對應(yīng)的getXXX()方法 
                                  Method setMethod = classType.getMethod(setMethodName,
                                          new Class[] {field.getType()}); // 調(diào)用原對象的getXXX()方法 
                                  ret = setMethod.invoke(obj, new Object[] {fieldVal});
                              }
                              if ("get".equals(type))
                              {
                                  String getMethodName = "get" + firstLetter
                                          + fieldName.substring(1); // 獲得和屬性對應(yīng)的setXXX()方法的名字 
                                  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 不在當(dāng)前類定義, 繼續(xù)向上轉(zhuǎn)型
                      }
                  }
                 
                  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 不在當(dāng)前類定義, 繼續(xù)向上轉(zhuǎn)型
                      }
                  }
                  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;
              }
             
          }

          5.更新mapper configuration文件,添加如下幾條,注意plugins在整個configuration文件中的順序

          <plugins>
          <plugin interceptor="functionPoint.db.DiclectStatementHandlerInterceptor"/>
          <plugin interceptor="functionPoint.db.DiclectResultSetHandlerInterceptor"/>
          </plugins>

          6.使用方法同mybatis邏輯分頁,攔截器會自動攔截執(zhí)行SQL的地方,加上分頁代碼:

          getSqlSession().selectList(mapId, queryKey,new RowBounds(pageId, pageSize));


          ==============================================================
          按照上面的做了,但運行時卻拋出缺少 IN OUT參數(shù)之類的錯誤.
          後來換了Dialect類文件就OK了.OracleDialect內(nèi)容參考自:
          http://rapid-framework.googlecode.com/svn/trunk/rapid-framework/src/rapid_framework_common/cn/org/rapid_framework/jdbc/dialect/




          posted on 2011-08-03 17:15 Ke 閱讀(2537) 評論(0)  編輯  收藏 所屬分類: paginationmyBatis
          主站蜘蛛池模板: 佳木斯市| 吉水县| 耿马| 开化县| 泾阳县| 长海县| 古田县| 武陟县| 霞浦县| 贵溪市| 岫岩| 民丰县| 古田县| 顺义区| 西青区| 拉萨市| 金阳县| 即墨市| 乐东| 甘孜县| 龙江县| 平南县| 勃利县| 中宁县| 庄河市| 泸溪县| 宁城县| 稻城县| 科技| 昌邑市| 黄梅县| 博罗县| 德江县| 沙雅县| 吉木萨尔县| 依安县| 右玉县| 阿城市| 武清区| 靖远县| 五台县|