飞道的博客

MyBatis入门七:多表关联查询一:获取多表关联查询结果;(查询结果包括多张表的字段,使用Map去承载存储查询结果)

596人阅读  评论(0)

本篇博客的内容很简单:就是当查询结果包括多张表的字段的时候,可以使用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标签

然后实际调用测试:


  
  1. package com.imooc.mybatis;
  2. import com.imooc.mybatis.entity.Goods;
  3. import com.imooc.mybatis.utils.MyBatisUtils;
  4. import org.apache.ibatis.io.Resources;
  5. import org.apache.ibatis.session.SqlSession;
  6. import org.apache.ibatis.session.SqlSessionFactory;
  7. import org.apache.ibatis.session.SqlSessionFactoryBuilder;
  8. import org.junit.Test;
  9. import java.io.IOException;
  10. import java.io.Reader;
  11. import java.sql.Connection;
  12. import java.util.HashMap;
  13. import java.util.List;
  14. import java.util.Map;
  15. /**
  16. * JUnit单元测试类
  17. */
  18. public class MyBatisTestor {
  19. @Test
  20. public void testSelectGoodsMap() throws Exception {
  21. SqlSession session = null;
  22. try {
  23. session = MyBatisUtils.openSession();
  24. List<Map> list = session.selectList( "goods.selectGoodsMap");
  25. for (Map map : list) {
  26. System.out.println(map);
  27. }
  28. } catch (Exception e) {
  29. throw e;
  30. } finally {
  31. MyBatisUtils.closeSession(session);
  32. }
  33. }
  34. }

说明:

(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并不是最好的一种解决方案;

运行结果:

 

 


转载:https://blog.csdn.net/csucsgoat/article/details/116455134
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场