如何使用MyBatis将值从ResultSet映射到pojo

时间:2015-09-24 08:15:55

标签: java mybatis

我有一个遗留系统,它使用普通的旧JDBC和MyBatis混合。我已经学会了如何使用MyBatis(Can I use MyBatis to generate Dynamic SQL without executing it?)生成SQL,但无法找到如何手动将java.sql.ResultSet的当前行映射到POJO。

我不能使用MyBatis来完成全程往返,因为SQL查询作为字符串被提供给遗留部分,但当我得到ResultSet时,我知道它应该映射到哪个POJO至。 (以及resultmap id)。在手工完成的那一刻,重用mybatis配置文件中的映射会很棒。 (因此映射逻辑是重复的。)

1 个答案:

答案 0 :(得分:1)

弗洛里安的评论让我走向正确的方向,谢谢!我确实设法让它工作 - 不是最干净的解决方案,但它确实有效。

给定包含x结果的java.sql.ResultSet rs,可以使用以下代码获取 current

Object parameterObject = new Object();

RowBounds rb = new RowBounds(0, 1);
MappedStatement ms = sqlSession.getConfiguration().getMappedStatement("myBatisSelectId");
BoundSql boundSql = ms.getBoundSql(parameterObject);
ParameterHandler ph = new DefaultParameterHandler(ms, parameterObject, boundSql);
SimpleExecutor se = new SimpleExecutor(sqlSession.getConfiguration(), null);

DefaultResultHandler resultHandler = new DefaultResultHandler(sqlSession.getConfiguration().getObjectFactory());
DefaultResultSetHandler drsh = new DefaultResultSetHandler(se, ms, ph, resultHandler, boundSql, rb);

drsh.handleResultSets(new FakeStatement(new DelegatingNonClosingResultSet(rs)));
if (resultHandler.getResultList() == null || resultHandler.getResultList().isEmpty()) {
    return null;
}
return (T) resultHandler.getResultList().get(0);

请注意,您确实需要select id和参数对象。省略的代码包括FakeStatement来携带ResultSet并委托ResultSet委托除之外的所有方法,所以我们可以在关闭ResultSet时管理自己。

要获得下一个结果,可以调用rs.next()并再次执行上述所有操作。当然,许多项目都可以重复使用。