Map保存查询结果

<select id="selectBlogMap" resultType="java.util.Map">select b.* , u.nick_name from t_blog b , t_user uwhere b.user_id = u.user_id
</select>
package com.cd.blog.config;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 java.io.IOException;
import java.io.InputStream;/*** @Author: 落叶无痕* @Date: 2020/5/15 16:45*/
public class MyBatisUtils {/*MyBatisUtils工具类,目的是创建全局唯一的SqlSessionFactory对象*///static属于类不属于对象,且全局唯一private static SqlSessionFactory sqlSessionFactory = null;//利用静态块在初始化类时初始化SqlSessionFactorystatic {InputStream input = null;try {// 使用字节流方式加载classpath下的mybatis-config.xml核心配置文件input = Resources.getResourceAsStream("mybatis-config.xml");// 初始化SqlSessionFactory对象,并解析mybatis-config.xml文件sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);} catch (IOException e) {e.printStackTrace();//初始化错误时,抛出ExceptionInInitializerError异常通知调用者throw new ExceptionInInitializerError(e);}}// 创建SqlSession对象(SqlSession是JDBC的扩展类,专门用于与数据库交互)public static SqlSession openSession(){return sqlSessionFactory.openSession();}// 释放一个有效的SqlSession对象public static void closeSession(SqlSession sqlSession){if(sqlSession != null){sqlSession.close();}}}
package com.cd.blog.config;import org.apache.ibatis.session.SqlSession;
import org.junit.Test;import java.util.List;
import java.util.Map;/*** @Author: 落叶无痕* @Date: 2020/5/17 21:42*/
public class TestMyBatisUtils {@Testpublic void demo(){SqlSession sqlSession = null;try{sqlSession = MyBatisUtils.openSession();List<Map> list = sqlSession.selectList("selectBlogMap");for(Map map : list){System.out.println(map);}}catch (Exception e){throw e;}finally {MyBatisUtils.closeSession(sqlSession);}}}

1. 以java.util.Map作为查询结果,返回的数据是以键值对的格式返回的,键名是表字段名,键值是表字段的值。并且java.util.Map接口默认实现类是HashMap,根据HashMap的底层是hash表,HashMap的Key是根据Key的hash值来进行排序,hash值是一个不稳定的数字,所以各字段排序的结果就会出现乱序。

2. 为保证返回结果的个字段的前后顺序一致,需要将resultType查询结果类型改为java.util.LinkedHashMap,LinkedHashMap底层是链表,在进行数据提取时,是按照我们往里插入数据时的先后顺序进行保存,因此不会像HashMap一样出现乱序现象。

<select id="selectBlogMap" resultType="java.util.LinkedHashMap">select b.* , u.nick_name from t_blog b , t_user uwhere b.user_id = u.user_id
</select>

总结:

  • 使用java.util.LinkedHashMap来接收数据,在我们的开发中是非常常见的。针对于多个表的关联查询,LinkedHashMap可以有效地帮助我们进行数据的扩展,使用起来非常灵活。

  • 关于javaType:

    • resultType的接收类型可以是实体类,实体类与表结构字段一致时可以自动封装数据到实体类中
    • 当resultType为Map时,查询出来的数据是无序的。
    • resultType的类型为Map / LinkedHashMap时多用于多表关联查询。

ResultMap结果集映射

1. ResultMap适用于java对象保存多表关联查询结果,可以将查询结果映射为复杂类型的java对象。

2. 我们在获取多表关联查询结果时,一般都会涉及到多个表的字段。这个时候,普通的实体类就无法满足我们的需求了(普通实体类对象的属性都是和对应表的字段一一对应的),当然我们也可以在实体类的基础上进行扩展。
例如:

public class Product {//商品idprivate Long productId;//商品名private String productName;//商品描述private String productDesc;//商品缩略图private String imgAddress;//原价private Double normalPrice;//折扣价private Double promotionPrice;//积分private Integer point;//权重private Integer priority;//状态 0:下架 1:在前端展示系统展示private Integer enableStatus;//创建时间@DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss")private Date createTime;//修改时间/* 使用@JsonFormat注解格式化日期,才能按指定格式在前端页面,具体参考:https://www.jb51.net/article/144235.htm */@JsonFormat(pattern = "yyyy-MM-dd", timezone="GMT+8")private Date lastEditTime;/*---------下面是扩充的关联对象---------------------------------*/// 店铺实体类,标明商品属于哪个店铺private Shop shop;// 商品类别,一件商品仅属于一个商品类别private ProductCategory productCategory;// 图片详情图列表,跟商品是多对一的关系private List<ProductImg> productImgList;}
<!--配置实体类属性与表字段的关系映射,结果集-->
<resultMap id="product" type="Product"><!--主键字段用id配置,非主键字段用result配置 【property:实体类属性名,column:表字段名】--><id property="productId" column="product_id"/><result property="productName" column="product_name"/><result property="productDesc" column="product_desc"/><result property="imgAddress" column="img_address"/><result property="normalPrice" column="normal_price"/><result property="promotionPrice" column="promotion_price"/><result property="point" column="point"/><result property="priority" column="priority"/><result property="enableStatus" column="enable_status"/><result property="createTime" column="create_time"/><result property="lastEditTime" column="last_edit_time"/><!--association: 多对一的关系--><association property="productCategory" column="product_category_id" javaType="ProductCategory"><id property="productCategoryId" column="product_category_id"/><result property="productCategoryName" column="product_category_name"/></association><!--association: 多对一的关系--><association property="shop" column="shop_id" javaType="Shop"><id property="shopId" column="shop_id"/><result property="shopName" column="shop_name"/><result property="ownerId" column="owner_id"/></association><!--collection: 一对多的关系--><collection property="productImgList" column="product_id" ofType="ProductImg"><id property="productImgId" column="product_img_id"/><result property="productDetailImg" column="product_detail_img"/><result property="productId" column="product_id"/></collection>
</resultMap>

总结:

关于ResultMap:

  • resultMap主要用于保存多表关联查询结果,将查询结果映射为复杂类型的java对象(dto数据传输对象)。

  • resultMap使用<id>标签匹配主键字段;使用<result>标签匹配非主键字段。

  • <id> / <result>标签中的property属性对应实体类的属性;column属性对应数据库。表的字段

  • <association>标签用于多对一关联查询关系映射;<collection>标签用于一对多关联查询关系映射。

MyBatis复习(五):获取多表关联查询结果相关推荐

  1. asp多表查询并显示_SpringBoot系列(五):SpringBoot整合Mybatis实现多表关联查询

    本文我们将继续分享介绍Spring Boot在整合Mybatis开发企业级应用时其他典型的业务场景,即Mybatis是如何实现多表关联查询时将查询结果集与对象进行映射的,主要的内容包含"一对 ...

  2. jpa多表关联查询_Spring Boot 整合mybatis如何自定义 mapper 实现多表关联查询

    上一篇文章已经介绍了自定义 mapper 实现自定义的方法,其实实现了通过自定义的mapper就可以做多表关联等复杂查询.但是很多朋友还是反馈说没有实现多表关联查询,所以,今天把文章又重新修改了,增加 ...

  3. Mybatis的多表关联查询(多对多)

    Mybatis的多表关联查询(多对多) 项目目录结构 实现 Role 到 User 多对多 业务要求 用户与角色的关系模型 编写角色实体类 编写 Role 持久层接口 实现的 SQL 语句 编写映射文 ...

  4. MyBatis多表关联查询

    本文将向大家介绍 MyBatis 中的多表关联查询 主要通过两个示例来说明在 MyBatis 中如何实现 一对多,多对一 和 多对多 查询 第一个示例:老师和学生关联 ​ 老师和学生是一对多的关系,一 ...

  5. mybatis 多表关联查询_Java修行第041天--MyBatis框架(下)--多表查询

    1 解决列名和属性名不一致问题 如果查询时使用 resultType 属性, 表示采用 MyBatis 的Auto-Mapping(自动映射)机制, 即相同的列名和属性名会自动匹配. 因此, 当数据库 ...

  6. MyBatis实现中间表关联查询

    MyBatis实现中间表关联查询 通常构建数据多对多模型的关系时,我们需要再建立一张中间表来关联另外两张表. 下面介绍一下,怎么用MyBatis来实现中间表关联查询并封装到实体类对象中. 现在有三张表 ...

  7. (探讨)MyBatis中的N+1问题,多表关联查询效率高点还是多次单表查询效率高

    MySQL多表关联查询效率高点还是多次单表查询效率高,为什么? https://blog.csdn.net/weixin_33869377/article/details/86265527 MyBat ...

  8. MySql的复习(五):联表查询和子查询

    MySql的复习(五):联表查询和子查询 查询结果去重 关于查询结果的去重:distinct关键字 select distinct job from emp; // distinct关键字去除重复记录 ...

  9. MYSQL多表关联查询与子查询

    多表关联查询 关联查询又名连接查询,其主要包括了内连接,外连接,自连接,交叉连接等四个大类. 首先我们要清楚我们为什么要使用多表关联查询,肯定是因为我们想要显示的数据来自于两个或多个数据表内部,我们想 ...

最新文章

  1. cocos2d-x学习笔记(十)android自动化打包bat脚本
  2. python语言写九九乘法表_【酷叮课堂】--Python语言完成99乘法表
  3. 二级指针读取文件(显示行数、读取、释放内存)
  4. 两种获取Stream流的方式
  5. 好文推荐 | 分布式锁用Redis好,还是Zookeeper好?
  6. matlab中欠定方程组超定方程组_七年级下册第10章:认识二元一次方程组(1课时)...
  7. wamp php 安装redis,wampServer的php安装Redis 扩展
  8. python支持esc退出_听说你不会用mac电脑装Python?看了这篇文章,秒懂!
  9. 3. HTML DOM Attribute 对象
  10. [UNIX]The UNIXHATERS Handbook
  11. MATLAB实现Otsu算法
  12. Python小白入门--(域名whois查询为例)
  13. wifi共享大师,去除弹窗广告。
  14. 托福艺术导向(纪录片《文明》单词总结)PART1
  15. ArcGis将2000国家大地坐标系转WGS84
  16. 精尽Spring MVC源码分析 - 一个请求的旅行过程
  17. Chrome的无痕浏览实现初探
  18. 记录Google被和谐的日子
  19. 斩赤红之瞳变革 第一章:贪玩不一定是坏事
  20. 《Java入门从笨鸟到菜鸟》读后感(三)

热门文章

  1. vue中在data中写入img地址 引入问题
  2. 使用Navicat计划任务备份数据库
  3. 搭建自己的博客(二十六):优化点赞功能,并添加模态登录框
  4. 制作 macOS High Sierra U盘USB启动安装盘方法教程 (全新安装 Mac 系统)
  5. trie树 Codeforces Round #367 D Vasiliy's Multiset
  6. iOS compare 字符串比较
  7. web开发中不同设备浏览器的区分
  8. python对象的复制问题
  9. nodejs 设置网络代理
  10. 如何判断一颗二叉树为完全二叉树