本篇博客的内容很简单:就是当查询结果包括多张表的字段的时候,可以使用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并不是最好的一种解决方案;
运行结果: