另一种选择是使用创建一个 ResultHandler,这是一个 MyBatis 接口,您可以将其传递给SqlSession#select
方法来处理从查询返回的数据。
以下是如何使用它来解决您的问题。
首先定义一个 PriceResultHandler,如下所示:
import org.apache.ibatis.session.ResultContext;
import org.apache.ibatis.session.ResultHandler;
public class PriceResultHandler implements ResultHandler {
// keep a list, assuming you have multiple Price objects to handle
List<Price> lp = new ArrayList<Price>();
@Override
public void handleResult(ResultContext rc) {
// the result object is map with column names mapped to values like so:
// {price1=11.32, qty1=15500, price2=2.62, qty2=234, etc.}
HashMap<?,?> m = (HashMap<?,?>) rc.getResultObject();
Price p = new Price();
double[] prices = new double[]{ ((Number)m.get("price1")).doubleValue(),
((Number)m.get("price2")).doubleValue(),
((Number)m.get("price3")).doubleValue() };
int[] qty = new int[]{ ((Number)m.get("qty1")).intValue(),
((Number)m.get("qty2")).intValue(),
((Number)m.get("qty3")).intValue() };
p.setPrices(prices);
p.setQty(qty);
lp.add(p);
}
public List<Price> getPrices() {
return lp;
}
ResultHandler 接收 HashMap 的原因是您将像这样设置映射:
<select id="getPrices" resultType="hashmap">
SELECT price1, price2, price3, qty1, qty2, qty3
FROM table
WHERE ...
</select>
然后在 Java 代码中调用它,如下所示:
PriceResultHandler rh = new PriceResultHandler();
session.select("getPrices", rh);
// or
session.select("getPrices", arg, rh);
// where arg is a value to pass to the getPrices query mapping
Price p = rh.getPrices().get(0);
这个模型与我在另一个答案中给出的另一个选项的工作量大致相同。MyBatis 只是简单地将 JDBC ResultSet 映射到一个 Map 中,然后你用它来创建你认为合适的域对象。
这种方法的一个警告是您必须处理地图中列名的区分大小写问题。你不能通过 MyBatis 来控制它。这取决于底层 JDBC 驱动程序的行为:https ://stackoverflow.com/a/11732674/871012