利用拦截器Interceptor对结果进行处理

公司的ERP强于业务逻辑,疏于技术。数据库查询竟然是继承了javax.swing.table.DefaultTableModel的鬼东西
尽管不能容忍,但全盘重构得要one year。这样的活谁愿意干,原有的程序员也都已经喜欢躺在这种模式中了。
那就先利用Mybatis对新的代码开发、维护想点办法吧。
DefaultTableModel中包含数据的列信息和数据信息。MyBatis通过resultType或者resultMap 或者自定义TypeHandler都无法满足。需要使用MyBatis的Interceptor进行处理。其使用步骤有两步:
1.定义拦截器插件
2.注册拦截器

定义拦截器:(以下用自定义的类型MyType01进行了模拟)

public class ResultPlugin implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        Object[] args = invocation.getArgs();
        Statement statement = (Statement) args[0];
        ResultSet rs = statement.getResultSet();
        ResultSetMetaData rsMetaData = rs.getMetaData();
        MyType01 myType01 = new MyType01();
        Map<String, String> fieldInfo = new HashMap<String, String>();
        myType01.setFieldInfo(fieldInfo);
        System.out.println(rsMetaData);
        for (int i = 0; i < rsMetaData.getColumnCount(); i++) {
            String columnName = rsMetaData.getColumnName(i + 1);
            String columnClassName = rsMetaData.getColumnClassName(i + 1);
            fieldInfo.put(columnName, columnClassName);
            System.out.println(columnName + ":" + columnClassName);
        }
        while (rs == null) {
            if (statement.getMoreResults()) {
                rs = statement.getResultSet();
            } else {
                if (statement.getUpdateCount() == -1) {
                    break;
                }
            }
        }
        Set<String> keySet = fieldInfo.keySet();

        List<Map<String, ?>> result = new ArrayList<Map<String, ?>>();
        myType01.setResult(result);
        if (rs != null) {
            while (rs.next()) {
                Map<String, String> row = new HashMap<String, String>();
                result.add(row);
                Iterator<String> fieldNames = keySet.iterator();
                while (fieldNames.hasNext()) {
                    String fieldName = fieldNames.next();
                    String fieldValue = rs.getString(fieldName);
                    row.put(fieldName, fieldValue);
                    System.out.print(fieldName + "=" + fieldValue);
                }
                System.out.println();
            }
        }
        return Arrays.asList(myType01);
    }

    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {
    }
}

注册拦截器
<configuration>
<plugins>
<plugin interceptor="com.ebitg.mybatis.ResultPlugin">
</plugin>
</plugins>
</configuration>


image.png

打完收工....

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,708评论 0 4
  • 1 Mybatis入门 1.1 单独使用jdbc编程问题总结 1.1.1 jdbc程序 上边使...
    哇哈哈E阅读 3,342评论 0 38
  • MyBatis 理论篇 [TOC] 什么是MyBatis  MyBatis是支持普通SQL查询,存储过程和高级映射...
    有_味阅读 2,972评论 0 26
  • 外面雷声滚动,雨点密集地敲打着树叶,发出沙沙的声音。 随着雨水的来临,室内的温度明显低了许多,听着一阵紧似一阵的雨...
    野百合的春天阅读 665评论 3 3
  • 对于这个城市 我们都是异乡人 每天奔波忙碌 只为一席之地 对于明亮的白天 我们都是异乡人 努力追逐阳光 有时却只留...
    沙鸥_f44c阅读 259评论 1 8