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的執行過程這篇文章中將進行分析。