ResultHandler的用法
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的用法的更多相关文章
- Java EE开发平台随手记5——Mybatis动态代理接口方式的原生用法
为了说明后续的Mybatis扩展,插播一篇广告,先来简要说明一下Mybatis的一种原生用法,不过先声明:下面说的只是Mybatis的其中一种用法,如需要更深入了解Mybatis,请参考官方文档,或者 ...
- flex sqlite基本用法
flex sqlite基本用法 页面 <?xml version="1.0" encoding="utf-8"?> <s:WindowedAp ...
- Mybatis基本用法--中
Mybatis基本用法--中 第四部分 动态 SQL 动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似.MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素 ...
- EditText 基本用法
title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...
- jquery插件的用法之cookie 插件
一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...
- Java中的Socket的用法
Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...
- [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法
一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...
- python enumerate 用法
A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...
- [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...
随机推荐
- MySQL高级知识(十四)——行锁
前言:前面学习了表锁的相关知识,本篇主要介绍行锁的相关知识.行锁偏向InnoDB存储引擎,开销大,加锁慢,会出现死锁,锁定粒度小,发生锁冲突的概率低,但并发度高. 0.准备 #1.创建相关测试表tb_ ...
- No such property: FOR_RUNTIME for class: org.gradle.api.attributes.Usage
自从Android studio升级到3.1版本,谷歌又折腾出让你意想不到的错误.... 从github上下了个项目用来学习,却出现了如下错误: No such property: FOR_RUNTI ...
- vue组件详解——组件通信
每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 组件之间通信可以用下图表示: 组件关系可分为父子组件通信.兄弟组件通信.跨级组件通信. ...
- 【转】如何修改 video 样式
我们这里说的“修改 video 样式”并不是要自己实现一套 controls,而是尝试修改 video 的默认样式 隐藏全屏按钮 这个很容易查到 video::-webkit-media-contro ...
- Python:Day24 类、类的三大特性
Python有两种编程方式:函数式+面向对象 函数式编程可以做所有的事情,但是否合适? 面向对象: 一.定义 函数: def + 函数名(参数) 面象对象: class bar---> 名字 ...
- java爬虫代理
public static Document getDocByJsoups(String href) { String ip = "124.47.7.38"; int port = ...
- ODOO(ERP源码安装)
cat /etc/centos-release CentOS Linux release 7.4.1708 (Core) uname -r 3.10.0-693.el7.x86_64 IP:192.1 ...
- 从code review到Git commit log
最近在读一本技术类的书:朱赟——<跃迁:从技术到管理的硅谷路径>,其中聊了很多很有趣的观点,比如:技术管理.技术实践.硅谷文化.个人成长等. 读到关于硅谷人如何做code review这一 ...
- IOException: Sharing violation on path *****
Unity代码中删除文件或者文件夹时,可能会报这个错.翻译成白话文就是:你在其它地方打开了这个文件/文件夹 把打开的地方关了就是了.
- 爬虫(二)之scrapy框架
01-scrapy介绍 02-项目的目录结构: scrapy.cfg 项目的主配置信息.(真正爬虫相关的配置信息在settings.py 文件中) items.py 设置数据存储模板,用于结构化数据, ...