本篇博客的内容很简单:就是当查询结果包括多张表的字段的时候,可以使用Map类承载存储查询结果。
目录
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并不是最好的一种解决方案;
运行结果:
转载:https://blog.csdn.net/csucsgoat/article/details/116455134