我有一个要求可能有点复杂。想想我有这样的 bean 类:

public class A { 
   private String column1; 
   private String column2; 
   private Map<String,String> dynamicColumns = Maps.newHashMap(); 
   .... 
   getter&setter of column1 and column2 
   .... 
   public void addExtraColumnValue(String column, String value) { 
     dynamicColumns.put(column, value); 
   } 
 
} 

dynamicColumns 由映射器 sql 确定,如下所示:

<select id="queryDynamicColumns" parameterType="java.util.Map" 
    resultMap="aResultMap"> 
         select colum1,colum2, ${dynamicColumns} from table_1 
</select> 

这个resultMap怎么写?

我想知道mybatis是否可以在映射器配置中支持这种映射?( 动态列值将放入 map 中。 ) 我没有从官方网站得到好的答案,我也尝试了拦截 resultSetHandler 的插件,通过查看 DefaultResultSetHandler 的源代码,它似乎对我的情况没有帮助。

请您参考如下方法:

你试过ResultHandler了吗?

问题 MyBatis - ResultHandler is not invoked可能会有用。

在 mybatis 3 中,您可以看到方法 SqlSession#select(String statement, ResultHandler handler)

您可以在自定义 ResultHandler 中做任何您想做的事。

如果有任何问题,请告诉我。


我想到,如果您从 DefaultResultSetHandler 派生并查看以下内容:

public List<Object> handleResultSets(Statement stmt) throws SQLException { 
  final List<Object> multipleResults = new ArrayList<Object>(); 
 
  int resultSetCount = 0; 
  ResultSetWrapper rsw = getFirstResultSet(stmt); 
 
  List<ResultMap> resultMaps = mappedStatement.getResultMaps(); 
  int resultMapCount = resultMaps.size(); 
  validateResultMapsCount(rsw, resultMapCount); 
  while (rsw != null && resultMapCount > resultSetCount) { 
    ResultMap resultMap = resultMaps.get(resultSetCount); 
    handleResultSet(rsw, resultMap, multipleResults, null); 
    rsw = getNextResultSet(stmt); 
    cleanUpAfterHandlingResultSet(); 
    resultSetCount++; 
  } 
 
  while (rsw != null && resultSetCount < mappedStatement.getResulSets().length) { 
    ResultMapping parentMapping = nextResultMaps.get(mappedStatement.getResulSets()[  resultSetCount]); 
    if (parentMapping != null) { 
      String nestedResultMapId = parentMapping.getNestedResultMapId(); 
      ResultMap resultMap = configuration.getResultMap(nestedResultMapId); 
      handleResultSet(rsw, resultMap, null, parentMapping); 
    } 
    rsw = getNextResultSet(stmt); 
    cleanUpAfterHandlingResultSet(); 
    resultSetCount++; 
  } 
 
  return collapseSingleResultList(multipleResults); 
} 

可以更新resultMaps运行时信息,比如更新它的ResultMapping#column,然后做动态绑定(bind)。那应该行得通!


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!