<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 6  文章 - 129  trackbacks - 0
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(14)

    隨筆檔案(6)

    文章分類(467)

    文章檔案(423)

    相冊

    收藏夾(18)

    JAVA

    搜索

    •  

    積分與排名

    • 積分 - 825498
    • 排名 - 49

    最新評論

    閱讀排行榜

    評論排行榜

    以下內容來自:
    http://zhaohe162.blog.163.com/blog/static/38216797201131262952990/

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

    mybatis下的分頁,支持所有的數據庫 - 斷塵傷痕 - 斷塵居
     



    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(); // 獲得和屬性對應的getXXX()方法的名字 
                        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()方法的名字 
                            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;
        }
       
    }

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

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

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

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


    ==============================================================
    按照上面的做了,但運行時卻拋出缺少 IN OUT參數之類的錯誤.
    後來換了Dialect類文件就OK了.OracleDialect內容參考自:
    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 閱讀(2534) 評論(0)  編輯  收藏 所屬分類: paginationmyBatis
    主站蜘蛛池模板: 美女扒开尿口给男人爽免费视频| 亚洲国产婷婷综合在线精品| 国产亚洲成av片在线观看 | 国产精品1024永久免费视频| 久久久久亚洲精品无码蜜桃| 97av免费视频| 亚洲国产精品成人综合色在线婷婷| 99久久人妻精品免费一区| 777亚洲精品乱码久久久久久| 114级毛片免费观看| 91亚洲性爱在线视频| 国产精品成人免费一区二区 | 高清国语自产拍免费视频国产 | eeuss免费影院| 亚洲午夜久久久影院| 久久免费国产精品| 亚洲综合一区二区精品导航| 2021免费日韩视频网| 久久无码av亚洲精品色午夜| 亚洲高清成人一区二区三区| 羞羞视频免费网站在线看| 亚洲色av性色在线观无码| 女人与禽交视频免费看| 免费人成大片在线观看播放| 精品国产综合成人亚洲区| 1000部拍拍拍18免费网站| 亚洲国产成人久久一区二区三区| 大胆亚洲人体视频| 免费A级毛片无码专区| 国产成人亚洲精品影院| 国产乱人免费视频| 午夜福利不卡片在线播放免费| 亚洲人成电影在线天堂| 四虎成人免费网址在线| 七次郎成人免费线路视频| 亚洲成色999久久网站| 日韩a在线观看免费观看| 久久久国产精品福利免费| 最新国产成人亚洲精品影院| 亚洲人成色77777在线观看大| 18级成人毛片免费观看|