本篇博客的内容很简单:就是当查询结果包括多张表的字段的时候,可以使用Map类承载存储查询结果。

目录

0.问题描述

1.实际演示

首先,在goods.xml中增加一个select标签

然后实际调用测试:

说明:


0.问题描述

以前的查询都是在一张表上进行查询,自然查询结果可以只是用一个实体类的对象去承载和保存:如下,都是在t_goods一张表上查询的,又因为在写Goods实体类的时候,人为有意让Goods类和t_goods表对应,所以Goods类的属性故意按照t_goods表的字段来设置属性,所以,只查询t_goods表的时候,其查询结果自然可以使用Goods类型的对象去对应接受和承载。。。。。。

但是,如果涉及多表查询的时候,如果某次查询的结果的字段包括了多张表的字段,单纯使用一个实体类对象去对应接受查询结果,就够呛了,就无法承载了。


底层的操作仍然离不开Map,即在实际中不仅参数可以指定为Map类型(parameterType=“java.util.Map”),结果resultType也可以使用Map类型。

1.实际演示

首先,在goods.xml中增加一个select标签

然后实际调用测试:

package com.imooc.mybatis;

import com.imooc.mybatis.entity.Goods;
import com.imooc.mybatis.utils.MyBatisUtils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.Reader;
import java.sql.Connection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * JUnit单元测试类
 */
public class MyBatisTestor {

    @Test
    public void testSelectGoodsMap() throws Exception {
        SqlSession session = null;
        try {
            session = MyBatisUtils.openSession();
            List<Map> list = session.selectList("goods.selectGoodsMap");
            for (Map map : list) {
                System.out.println(map);
            }
        } catch (Exception e) {
            throw e;
        }finally {
            MyBatisUtils.closeSession(session);
        }
    }
}

说明:

(1) 如果resultType=“java.util.Map”的时候(背后的实现是HashMap啦)。其把查询到的每一条数据(或者说查询的每一条记录)都封装成一个Map,Map中的key都是字段的原始名称,Value就是对应字段的数据;

(2) 如果resultType=“java.util.Map”的时候(背后的实现是HashMap啦)。其把查询到的每一条数据都封装成一个Map,其Value的数据的类型,mybatis会根据数据库表的定义来获知;

(3) 如果resultType=“java.util.Map”的时候(背后的实现是HashMap啦)。其把查询到的每一条数据都封装成一个Map。Map中的字段的前后顺序是“混乱”的:

这是因为HashMap自身的机制决定的,HashMap里面的Key是按照key的hash值进行的排序,hash值是一个不稳定的数据,因此Map中Key的排序结果是一个乱序;

(4) 为了保证Map中的字段的前后顺序和查询语句中的保持一致,就需要resultType=“java.util.LinkedHashMap”:

LinkedHashMap是采用链表形式的HashMap,其进行数据提取的时候是按照插入的顺序进行的保存,因此不会出现乱序的情况。

(5) Map非常灵活,可以自由囊括新的字段。(这背后是Map这种数据结构的性质在支撑)

(6) LinkedHashMap十分擅长保存多表关联结果,在实际中使用挺多的,非常容易进行数据扩展,使用灵活。Mybatis会将每一条查询的结果包装成LinkedHashMap对象。

(7) LinkedHashMap的优点:易于扩展,易于使用

我们不用创建任何的实体类,只需设置resultType=“java.util.LinkedHashMap”,查询的结果就能获取到了;(即查询的结果会被一个LinkedHashMap对象承载);

(8) LinkedHashMap的缺点:太过灵活,任何查询结果都可以被LinkedHashMap承载,相对于【resultType=实体类】的情况,【resultType=LinkedHashMap】无法进行编译时检查,更容易出错;

所以,在大型项目,需要多人合作的情况下,使用resultType设置成实体类(即使用实体类来承载保存结果)更不容易出错,也容易配合。即,究竟使用实体类来保存查询结果还是使用Map来保存查询结果,需要根据不同的情况来决定。

(9)由于Map在多人配合开发的时候,体验不好,所以Map并不是最好的一种解决方案;

运行结果: