2016年8月28日星期日

使用mybatis的resultmap,将native 的ResultSet变成VO

混用mybatis和native jdbc时,一直考虑能否直接使用定义在mybatis里面定义的resultmap,发愁
了很久。

今天终于找到了方法,旧的版本是不支持的,用了新的3.4.1。

代码如下
    @SuppressWarnings("unchecked")
    public static <T> List<T> getListFromResultSet(ResultSet rs, String resultMapId) throws SQLException
    {
        List<Object> l;
        Configuration cfg = getSqlSession().getConfiguration();       
        ResultMap resultMap = cfg.getResultMap(resultMapId);       
        MappedStatement ms = cfg.getMappedStatements().iterator().next();//get first MappedStatement       
        DefaultResultSetHandler drsh = new DefaultResultSetHandler(null, ms, null, null, null, null);           
        ResultSetWrapper rsw = new ResultSetWrapper(rs, cfg);;
        DefaultResultHandler resultHandler = new DefaultResultHandler(cfg.getObjectFactory()) {
            @Override
            public void handleResult(ResultContext<? extends Object> context)
            {
                super.handleResult(context);
                //log.debug("{}", context.getResultObject());               
            }
        };
        drsh.handleRowValues(rsw, resultMap, resultHandler, new RowBounds(), null);
        l = (List<Object>)resultHandler.getResultList();
        for (Object o: l)
        {
            log.debug("{}", o);
        }
       
        return (List<T>)(List<?>)l;       
    }

handleRowValues这个函数,在以前的版本是private的。

参考了下面的url,但是他们都没给出答案
                 //http://www.codeproject.com/Tips/372152/Mapping-JDBC-ResultSet-to-Object-using-Annotations
                //http://resultsetmapper.sourceforge.net
                //http://nvry.iteye.com/blog/876076
                //http://stackoverflow.com/questions/32756530/how-to-use-mybatis-to-map-values-from-resultset-to-pojo

没有评论:

发表评论