<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

    搜索

    •  

    積分與排名

    • 積分 - 825755
    • 排名 - 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 閱讀(2535) 評論(0)  編輯  收藏 所屬分類: paginationmyBatis
    主站蜘蛛池模板: 4444www免费看| 一级做受视频免费是看美女| 99re这里有免费视频精品| 国产精品网站在线观看免费传媒| 91视频精品全国免费观看| 亚洲一级片免费看| 成年免费a级毛片| 91精品国产免费久久久久久青草 | 国产亚洲精午夜久久久久久| 免费的黄色的网站| 免费毛片a在线观看67194| 91亚洲精品自在在线观看| 国产成人免费高清激情视频| 亚洲va无码专区国产乱码| 四虎国产精品永久免费网址| 亚洲乱亚洲乱少妇无码| 一区二区三区免费精品视频 | 亚洲毛片在线免费观看| 亚洲国产精品xo在线观看| 大地资源二在线观看免费高清| 亚洲成a人片在线观看日本| 久9热免费精品视频在线观看| 国产亚洲午夜高清国产拍精品 | 中国在线观看免费高清完整版| 亚洲人成色7777在线观看| 久久免费观看国产精品| 亚洲一级片内射网站在线观看| 极品色天使在线婷婷天堂亚洲| 2021免费日韩视频网| 亚洲乱码无人区卡1卡2卡3| 国产人成免费视频网站| 亚洲av无码片vr一区二区三区| 成熟女人特级毛片www免费| 免费国产污网站在线观看不要卡| 国内一级一级毛片a免费| xxxx日本在线播放免费不卡| 亚洲日本中文字幕区| 插鸡网站在线播放免费观看| 亚洲成无码人在线观看| 五月婷婷亚洲综合| 精品无码人妻一区二区免费蜜桃 |