我有一个要求可能有点复杂。想想我有这样的 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)。那应该行得通!






