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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM