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的执行过程这篇文章中将进行分析。

ResultHandler的用法的更多相关文章

  1. Java EE开发平台随手记5——Mybatis动态代理接口方式的原生用法

    为了说明后续的Mybatis扩展,插播一篇广告,先来简要说明一下Mybatis的一种原生用法,不过先声明:下面说的只是Mybatis的其中一种用法,如需要更深入了解Mybatis,请参考官方文档,或者 ...

  2. flex sqlite基本用法

    flex sqlite基本用法 页面 <?xml version="1.0" encoding="utf-8"?> <s:WindowedAp ...

  3. Mybatis基本用法--中

    Mybatis基本用法--中 第四部分 动态 SQL 动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似.MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素 ...

  4. EditText 基本用法

    title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...

  5. jquery插件的用法之cookie 插件

    一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...

  6. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  7. [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法

    一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...

  8. python enumerate 用法

    A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...

  9. [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...

随机推荐

  1. JavaScript 浮点数运算的精度问题

    问题描述 在 JavaScript 中整数和浮点数都属于 Number 数据类型,所有数字都是以 64 位浮点数形式储存,即便整数也是如此. 所以我们在打印 1.00 这样的浮点数的结果是 1 而非 ...

  2. Jenkins以root用户运行的方法

    以centOS系统为例,记录下修改Jenkins以root用户运行的方法. 修改Jenkins配置文件 # 打开配置文件 vim /etc/sysconfig/jenkins # 修改$JENKINS ...

  3. WiFi-ESP8266入门http(2-2)文件系统-复杂结构的网页 + 文本框交互WIFI信息

    网友教程:https://blog.csdn.net/solar_Lan/article/details/74231360 通过网友教程,我们搭建了文件系统.在此基础上,我们增加WIFI交互. 现有功 ...

  4. 修复XSS跨站漏洞

    XSS跨站漏洞最终形成的原因是对输入与输出没有严格过滤. 1.输入与输出 在HTML中,<,>,",',&都有比较特殊的意义.HTML标签,属性就是由这几个符合组成的.P ...

  5. Java 数据类型总结

    Java 中提供了八种数据类型:6个数字类型(四个整数型,两个浮点型).字符类型.布尔型. 依次分别是 : byte.int.short.long.float.double.char.boolean. ...

  6. ESP8266开发综合篇第十四节(LUA)-8266作为TCP服务器,Android客户端连接,显示温湿度,控制继电器

    前几节先略过,我先补充上大部分人迫切的需求 编写Android TCP客户端  用Android Studio 先做一下界面 然后放一个输入对话框,因为没有显示出来这个控件.所以就手写 剩下的自己研究 ...

  7. java 变量 final 小结

    通过查看hashCode发现,变量声明final后,不能修改,上级修改时候,重新获得对象hashCode变化 public static void main(String[] args) { // T ...

  8. CentOS7 安装MySQL5.6

    1.  检查是否有MariaDB和MySQL,如果有则卸载掉 [root@--- ~]# rpm -qa | egrep "mariadb|mysql" mariadb-serve ...

  9. vue编程式导航

    vue项目中使用到了组件间传值,通过路由跳转实现从产品页进入产品详情页查看功能. 使用了this.$router.push(编程式导航) product页面中:因为只需要遮住产品列表页来显示产品详情页 ...

  10. 如何在同一台电脑上启动多个Tomcat服务器

    安装第二个tomcat完成后,到安装目录下的conf子目录中打开server.xml文件,查找以下三处: (1)修改http范围端口(默认为8080端口) <Connector port=&qu ...