<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年7月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    常用鏈接

    留言簿(14)

    隨筆檔案(6)

    文章分類(467)

    文章檔案(423)

    相冊

    收藏夾(18)

    JAVA

    搜索

    •  

    積分與排名

    • 積分 - 829306
    • 排名 - 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 閱讀(2543) 評論(0)  編輯  收藏 所屬分類: pagination 、myBatis
    主站蜘蛛池模板: 久草免费福利视频| 情人伊人久久综合亚洲| 亚洲酒色1314狠狠做| 青青在线久青草免费观看| 亚洲欧洲精品无码AV| 黄色网页在线免费观看| 亚洲日本韩国在线| 国产精品永久免费| 国产国拍亚洲精品福利| 成人免费ā片在线观看| 亚洲啪啪AV无码片| 性xxxxx大片免费视频| 亚洲欧洲自拍拍偷综合| 免费AA片少妇人AA片直播| 亚洲人成电影在线观看青青| 97免费人妻无码视频| 亚洲综合欧美色五月俺也去| 日韩免费一区二区三区| 亚洲日韩精品一区二区三区无码| 波霸在线精品视频免费观看| 亚洲色婷婷一区二区三区| 精品国产免费一区二区三区香蕉| 亚洲国产精品人久久| 91免费播放人人爽人人快乐| 亚洲日韩精品A∨片无码加勒比| 女人毛片a级大学毛片免费| 国产午夜亚洲精品不卡| 亚洲中久无码永久在线观看同| 黄色免费在线网站| 亚洲精品国产精品国自产网站 | 亚洲精品国产啊女成拍色拍| 日本免费网址大全在线观看| 亚洲日韩精品国产3区| 国外亚洲成AV人片在线观看 | 亚洲大香人伊一本线| 中文字幕免费视频精品一| 亚洲综合成人网在线观看| 午夜电影免费观看| 最近免费字幕中文大全| 亚洲人成网国产最新在线| 亚洲日本中文字幕一区二区三区|