ResultHandler,顾名思义,对返回的结果进行处理,最终得到自己想要的数据格式或类型。也就是说,可以自定义返回类型。下面通过一个例子讲解它的使用方法:

创建Goods实体类:

public class Goods implements Serializable{

    /**
*
*/
private static final long serialVersionUID = 1L;
private String id;
private String name;
private String remark;
private String detail;
private BigDecimal price;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
} }

创建Mapper接口:

public interface GoodsDao {

    public void selectGoods(ResultHandler resultHandler);

}

创建映射文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="com.yht.mybatisTest.dao.GoodsDao"> <select id="selectGoods" resultType="map">
select price,name from goods
</select> </mapper>

mybatis配置文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration> <properties resource="db.properties">
<property name="age" value="26" />
</properties> <!-- settings是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。 -->
<settings>
<!-- <setting name="localCacheScope" value="STATEMENT"/> -->
<setting name="logImpl" value="STDOUT_LOGGING" />
<setting name="cacheEnabled" value="true"/>
</settings> <typeAliases>
<typeAlias alias="goods" type="com.yht.mybatisTest.entity.Goods" />
</typeAliases> <environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments> <!-- 映射文件 -->
<mappers>
<!-- 通过resource指定Mapper文件 -->
<mapper resource="com/yht/mybatisTest/dao/goods.xml" />
</mappers> </configuration>

根据以上这些代码,我们知道,selectGoods方法的查询结果是List<Map>,假如现在有这么一个需求:想统计价格低于50的书籍有哪些,价格高于50的书籍有哪些,该怎么处理呢?这个时候就用到了ResultHandler,我们创建一个SelectGoodsResultHandler:

/**
* @author chenyk
* @date 2018年9月11日
* 假如price<50的书为低价书,price>=50的书为高价书
*/ public class SelectGoodsResultHandler implements ResultHandler{ private Map<String, List<String>> resultMap = new HashMap<String, List<String>>(); @SuppressWarnings("unchecked")
public void handleResult(ResultContext context) {
if(resultMap.get("lowPrice") == null && resultMap.get("highPrice") == null){
List<String> lowList = new ArrayList<String>();
List<String> highList = new ArrayList<String>();
resultMap.put("lowPrice", lowList);
resultMap.put("highPrice", highList);
}
@SuppressWarnings("unchecked")
Map<String,Object> resultObject = (Map<String, Object>)context.getResultObject();
BigDecimal price = (BigDecimal) resultObject.get("price");
String name = (String) resultObject.get("name");
if(price.intValue() < 50){
((List<String>)resultMap.get("lowPrice")).add(name);
}else{
((List<String>)resultMap.get("highPrice")).add(name);
} } public Map<String, List<String>> getResults(){
return resultMap;
} }

然后写一个测试demo运行:

public class GoodsDaoTest {

    private static SqlSessionFactory sqlSessionFactory = null;

    @Test
public void selectGoodsTest(){ SqlSession sqlSession = getSqlSessionFactory().openSession(true);
GoodsDao goodsMapper = sqlSession.getMapper(GoodsDao.class);
SelectGoodsResultHandler resultHandler = new SelectGoodsResultHandler();
goodsMapper.selectGoods(resultHandler);
System.out.println(resultHandler.getResults().toString());; } public static SqlSessionFactory getSqlSessionFactory() {
String resource = "spring-ibatis.xml";
if(sqlSessionFactory == null){
try {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources
.getResourceAsReader(resource));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return sqlSessionFactory;
} }

打印的结果:{highPrice=[c++从入门到放弃], lowPrice=[java从入门到放弃, php从入门到放弃, golang从入门到放弃, c从入门到放弃, python从入门到放弃]}

对于源码部分,在SQL的执行过程这篇文章中将进行分析。

最新文章

  1. DOM 事件深入浅出(二)
  2. 使用 AForge.NET 做视频采集
  3. 调优Java virtual machine常见问题汇总整理
  4. ASP.NET Web API 的简单示例
  5. Appium环境搭建Java篇
  6. PHP学习笔记01——基础语法
  7. Javascript delete 引用类型对象
  8. js数组操作的常用方法
  9. block 做参数
  10. mysql utf8 中文
  11. HDU 4716 A Computer Graphics Problem
  12. Linux服务器建站基础-选择何种配置和安装环境项目
  13. python笔记一(正则表达式)
  14. git 解决每次更新代码都要输入用户名密码的解决方案
  15. Contest Setting 2018 ICPC Pacific Northwest Regional Contest dp
  16. Redis之路
  17. Java执行shell遇到的各种问题
  18. Android项目实战(三十二):圆角对话框Dialog
  19. POJ 3278 Catch That Cow(赶牛行动)
  20. 一天学习两个设计模式之Facade模式(外观模式,结构型模式)

热门文章

  1. ab和jmeter进行GET/POST压力测试的使用心得和比较
  2. GUNS后台管理框架部署与发布
  3. KazaQ&#39;s Socks (找规律)
  4. 【转】ffmpeg 常用命令
  5. Linux:Day7(下) 磁盘管理、文件系统管理
  6. bak
  7. nodejs部署智能合约的方法-web3 0.20版本
  8. day23 Pythonpython 本文re模块
  9. ORA-16433 The database must be opened in read write mode故障解决
  10. 封装自己的dapper lambda扩展-设计篇