2015-09-24 80 views
1

我有一個遺留系統,它使用簡單的舊JDBC和MyBatis混合。我已經學會了如何使用MyBatis生成SQL(Can I use MyBatis to generate Dynamic SQL without executing it?),但無法找到我如何手動將java.sql.ResultSet的當前行映射到POJO。如何使用MyBatis將結果集中的值映射到pojo

我不能使用MyBatis來完成整個往返行程,因爲SQL查詢是以字符串的形式輸入到遺留部分,但是當我返回ResultSet時,我知道它應該映射到哪個POJO 。 (和結果圖ID)。手動完成後,重新使用mybatis配置文件中的映射將是非常好的。 (因此映射邏輯被複制。)

+0

我建議有一個看'ResultSetHandler'接口的'handleResultSets'方法,它的實現類,例如'FastResultSetHandler',這似乎處理結果集。儘管如此,從來沒有更徹底地看過。 –

回答

1

Florian的評論讓我朝正確的方向發展,謝謝!我設法讓它工作 - 不是最乾淨的解決方案,但它工作。包含x結果

鑑於java.sql.ResultSet中的RS,可以得到當前一個用下面的代碼:

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); 

請注意,你需要選擇id和參數對象。省略代碼包括FakeStatement以攜帶ResultSet並委派結果集,該結果集委託除了之外的所有方法,因此我們可以在結果集關閉時自行管理。

爲了得到下一個結果一會再打電話rs.next()和做上述所有。當然,許多物品都可以重複使用。