Mybatis中表关系查询结果集映射

news2024/11/28 22:37:29

文章目录

  • 前言
  • 1. 实体类设计
    • 1.1 用户表
    • 1.2 地址表
    • 1.3 博客表
    • 1.4 粉丝互关表
  • 2.插入数据
  • 3.表关联查询
    • 3.1 一对一关系
    • 3.2 一对多关系
    • 3.3 多对多关系

前言

resultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作。实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份 resultMap 能够代替实现同等功能的数千行代码。ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。

ER实体关系:

  • 一对一
  • 一对多
  • 多对多

1. 实体类设计

1.1 用户表

建表sql:

CREATE TABLE `User` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

java实体类:

public class User implements Serializable {
    private static final long serialVersionUID = 741077730204987800L;
    
    private Long id;
    
    private String name;
    
    private Integer age;
}

1.2 地址表

建表的sql


CREATE TABLE `Address` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) DEFAULT NULL,
  `province` varchar(100) DEFAULT NULL,
  `city` varchar(100) DEFAULT NULL,
  `county` varchar(100) DEFAULT NULL,
  `detail` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='地址表';

java代码

public class Address implements Serializable {
    private static final long serialVersionUID = 960792204085182238L;
    
    private Long id;
    
    private Long userId;
    
    private String province;
    
    private String city;
    
    private String county;
    
    private String detail;
    }

1.3 博客表

建表的sql

CREATE TABLE `Blogs` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) DEFAULT NULL,
  `title` varchar(100) DEFAULT NULL,
  `content` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

java实体类:

public class Blogs implements Serializable {
    private static final long serialVersionUID = -82344806309770256L;
    
    private Long id;
    
    private Long userId;
    
    private String title;
    
    private String content;
 }

1.4 粉丝互关表

建表的sql

-- test.Fans definition

CREATE TABLE `Fans` (
  `id` varchar(100) DEFAULT NULL,
  `user_id` bigint(20) DEFAULT NULL,
  `fan_id` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='粉丝互关表';

实体类

public class Fans implements Serializable {
    private static final long serialVersionUID = -76540062746539253L;
    
    private String id;
    
    private Long userId;
    
    private String fanId;
    }

2.插入数据

INSERT INTO `User`(id, name, age)VALUES(11, 'elite', 20);
INSERT INTO `User`(id, name, age)VALUES(12, 'bob', 19);
INSERT INTO `User`(id, name, age)VALUES(13, 'johon', 22);
INSERT INTO `User`(id, name, age)VALUES(14, 'smith', 21);
INSERT INTO `User`(id, name, age)VALUES(15, 'jackon', 20);
INSERT INTO Address(id, user_id, province, city, county, detail)VALUES(1, 11, 'bj', 'xx', 'xx', '北京西路');
INSERT INTO Address(id, user_id, province, city, county, detail)VALUES(2, 12, 'sh', 'xx', 'xx', '上海路');
INSERT INTO Address(id, user_id, province, city, county, detail)VALUES(3, 13, 'sz', 'xx', 'xx', '深圳南山路');
INSERT INTO Address(id, user_id, province, city, county, detail)VALUES(4, 14, 'gz', 'xx', 'xx', '广州路');
INSERT INTO Address(id, user_id, province, city, county, detail)VALUES(5, 15, 'hz', 'xx', 'xx', '杭州');
INSERT INTO Blogs(id, user_id, title, content)VALUES(1, 11, 'java', 'java数据类型...');
INSERT INTO Blogs(id, user_id, title, content)VALUES(2, 11, 'python', '大数据开发..');
INSERT INTO Blogs(id, user_id, title, content)VALUES(3, 11, 'c#', '桌面应用开发...');
INSERT INTO Fans(id, user_id, fan_id)VALUES(1, 11, 12);
INSERT INTO Fans(id, user_id, fan_id)VALUES(2, 11, 13);
INSERT INTO Fans(id, user_id, fan_id)VALUES(3, 12, 11);
INSERT INTO Fans(id, user_id, fan_id)VALUES(4, 12, 14);
INSERT INTO Fans(id, user_id, fan_id)VALUES(5, 12, 15);

3.表关联查询

3.1 一对一关系

表user和address是一对一的关系,可以直接定义一个dto来接收数据。
定义数据传输对象:

public class UADTO {

    private Long id;

    private String name;

    private Integer age;

    private String province;

    private String city;

    private String county;

    private String detail;
    }

定义resultmap结果集以及查询

<!--定义用户地址结果集-->
    <resultMap type="com.elite.mybatis.dto.UADTO" id="UAMap">
        <result property="id" column="id" jdbcType="INTEGER"/>
        <result property="name" column="name" jdbcType="VARCHAR"/>
        <result property="age" column="age" jdbcType="INTEGER"/>
        <result property="userId" column="user_id" jdbcType="INTEGER"/>
        <result property="province" column="province" jdbcType="VARCHAR"/>
        <result property="city" column="city" jdbcType="VARCHAR"/>
        <result property="county" column="county" jdbcType="VARCHAR"/>
        <result property="detail" column="detail" jdbcType="VARCHAR"/>
    </resultMap>

   <!--用户与地址的查询-->
    <sql id="uasql">
        select
            u.id,
            u.name,
            u.age,
            a.province,
            a.city,
            a.county,
            a.detail
        from
            User u,
            Address a
        where
            u.id = a.user_id
    </sql>
   <select id="getUAInfo" resultMap="UAMap">
       <include refid="uasql"></include>
   </select>

测试:

 /**
     * 测试一对一关系的查询
     */
    @Test
    public void testOne2One(){
        CollectionMapper c = sqlSession.getMapper(CollectionMapper.class);
        List<UADTO> uadtoList = c.getUAInfo();
        uadtoList.forEach(uadto -> {
            System.out.println(uadto.toString());
        });
    }

查询结果

3.2 一对多关系

用户和发表的博客ER关系属于一对多关系。
定义传输的DTO对象

/**
 * 用户表和博客发布的记录
 */
public class UBDTO {

    private Long id;

    private String name;

    private Integer age;

    private List<Blogs> blogs;
    }

定义结果集

 <!--定义用户与博客-->
    <resultMap id="UBMap" type="com.elite.mybatis.dto.UBDTO">
        <id property="id" column="id" jdbcType="INTEGER"/>
        <result property="name" column="name" jdbcType="VARCHAR"/>
        <result property="age" column="age" jdbcType="INTEGER"/>
        <collection property="blogs" ofType="com.elite.mybatis.entity.Blogs">
            <id property="id" column="id" jdbcType="INTEGER"/>
            <id property="userId" column="user_id" jdbcType="INTEGER"/>
            <result property="title" column="title" jdbcType="VARCHAR"/>
            <result property="content" column="content" jdbcType="VARCHAR"/>
        </collection>
    </resultMap>
    <!--用户与地址的查询-->
    <sql id="ubsql">
        select
            u.id,
            u.name,
            u.age,
            b.id,
            b.user_id,
            b.title,
            b.content
        from
            User u inner join Blogs b on (u.id = b.user_id)
    </sql>
    <select id="getUBInfo" resultMap="UBMap">
        <include refid="ubsql"></include>
    </select>

测试

/**
     * 测试一对多关系的查询
     */
    @Test
    public void testOne2Multi(){
        CollectionMapper c = sqlSession.getMapper(CollectionMapper.class);
        List<UBDTO> ubInfo = c.getUBInfo();
        ubInfo.forEach(ubdto -> {
            System.out.println(ubdto.toString());
        });
    }

一对多查询结果

3.3 多对多关系

用户表和粉丝表之间关系
定义dto

/**
 * 粉丝互关表
 */
public class UFDTO {
    private Long id;

    private String name;

    private Integer age;

    private List<User> fans;
    }

定义查询的结果集

 <!--定义用户与粉丝互关表-->
    <resultMap id="UFMap" type="com.elite.mybatis.dto.UFDTO">
        <id property="id" column="id" jdbcType="INTEGER"/>
        <result property="name" column="name" jdbcType="VARCHAR"/>
        <result property="age" column="age" jdbcType="INTEGER"/>
        <collection property="fans" ofType="com.elite.mybatis.entity.User">
            <id property="id" column="id" jdbcType="INTEGER"/>
            <result property="name" column="name" jdbcType="VARCHAR"/>
            <result property="age" column="age" jdbcType="INTEGER"/>
        </collection>
    </resultMap>
    <!--用户与粉丝查询-->
    <sql id="ufsql">
        select
            u.id,
            u.name,
            u.age,
            f1.id,
            f1.name,
            f1.age
        from
            User u,
            Fans f,
            User f1
        where
            u.id = f.user_id
          and f.fan_id  = f1.id
    </sql>
    <select id="getUFInfo" resultMap="UFMap">
        <include refid="ufsql"></include>
    </select>

测试

 /**
     * 测试多对多关系的查询
     */
    @Test
    public void testMulti2Multi(){
        CollectionMapper c = sqlSession.getMapper(CollectionMapper.class);
        List<UFDTO> ufdtoList = c.getUFInfo();
        ufdtoList.forEach(ufdto -> {
            System.out.println(ufdto.toString());
        });
    }

测试结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/763677.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能数学基础--概率与统计15:多维随机变量/向量

一、多维随机变量定义 一般地,设X(X1,X2,,X,)为一个n维向量&#xff0c;其每个分量,即X1、、Xn都是一维随机变量&#xff0c;则称X是一个n维随机向量或n 维随机变量。 与随机变量一样&#xff0c;随机向量也有离散型和连续型之分。 二、离散型多维随机向量 一个随机向量X(X…

程序环境和预处理超详细讲解

目录 程序的翻译环境和执行环境 详解编译链接 翻译环境 编译本身也分为几个阶段 运行环境 预处理&#xff08;预编译&#xff09;详解 预定义符号 #define #define 定义标识符 #define 定义宏 #define 替换规则 #和## ## 的作用 带副作用的宏参数 宏和函数对比 …

git如何撤销commit(未push)

文章目录 前言undo commitreset current branch to here Undo Commit&#xff0c;Revert Commit&#xff0c;Drop Commit的区别 是否删除对代码的修改是否删除Commit记录是否会新增Commit记录Undo Commit不会未Push会&#xff0c;已Push不会不会Revert Commit会不会会Drop Com…

看看去年蓝桥考了什么,第十三届蓝桥杯省赛(C/C++ 大学B组)题解

文章目录 A&#xff1a;九进制转十进制问题描述运行限制题目思路代码演示 B&#xff1a;顺子日期问题描述运行限制题目思路代码演示 C&#xff1a;刷题统计问题描述评测用例规模与约定运行限制题目思路代码演示 D&#xff1a;修剪灌木问题描述评测用例规模与约定运行限制题目思…

【广州华锐互动】VR地铁消防逃生路线演练系统

随着城市轨道交通的不断发展&#xff0c;事故应急演练的重要性也越来越受到重视。而VR技术的应用&#xff0c;为地铁消防逃生路线演练带来了许多亮点&#xff0c;包括以下几个方面&#xff1a; 首先&#xff0c;VR技术可以提供高度真实的模拟场景。在传统的事故应急演练中&…

t-date-time-picker如何默认当前年月

打开小程序展示当前年月&#xff0c;效果图如下 实现方法&#xff1a;使用new Date().toISOString().slice(0, 7)截取7位即可

卡尔曼滤波:再也不用瑟瑟发抖了

本文来自公众号“AI大道理” —————— 目标跟踪中&#xff0c;在数据关联后往往要进行卡尔曼滤波。 数据关联算法得到了每个目标的观测数据。 卡尔曼滤波使用关联的观测数据来估计目标的状态&#xff0c;并预测目标的未来位置和速度等信息。 目标跟踪过程中&#xff0c;…

0基础学习VR全景平台篇 第62篇:基本功能-如何发布VR视频

戳我先了解“全景视频上传规范” 1、点击【上传】按钮&#xff0c;打开本地文件夹&#xff0c;上传符合要求的全景视频素材&#xff0c;可以选择单个或多个视频同时上传。 2、视频上传成功以后&#xff0c;需要处理一段时间&#xff0c;请耐心等待。 视频处理好以后&#xff0…

编程语言有哪些?介绍常见的编程语言

&#xff08;又是水文章的一天&#xff09;&#xff1a;&#xff09; 在当今数字化时代&#xff0c;编程语言成为了连接人类与计算机的关键工具。无论是网页开发、移动应用程序还是大规模软件开发&#xff0c;选择合适的编程语言对于开发人员来说至关重要。本文将介绍一些常见的…

Cesium-源码打包1.106

在有Cesium源码打包的需求下&#xff0c;可以这样进行&#xff0c; 1.106的源码目录结构如下&#xff1a; 1.在下载的源码目录中运行 npm install 出现node_modules文件夹&#xff0c;然后我们就可以根据需求去修改源码&#xff0c;本文用的版本是1.106&#xff0c; packag…

C语言--动态内存管理(图解)

文章目录 C程序的内存开辟为什么存在动态内存分配动态内存分配函数malloc和freecallocrealloc 常见的动态内存错误对空指针的解引用操作对动态开辟空间的越界访问对非动态开辟内存使用free释放使用free释放一块动态开辟内存的一部分对同一块动态内存多次释放动态开辟内存忘记释…

浅析电力企业一体化云运维管理平台

摘要&#xff1a;电力的发展,关系着我国社会和谐和稳定,在当今科学技术不断向前发展的时代,在电力企业发展中须要结合现今的科学技术,保证电力企业的信息化建设水平能够符合时代的发展趋势。本文主要分析当前电力企业一体化云运维管理的重要性,并就云运维管理中存在的问题进行有…

Spring 6【BeanFactory代码演示、实例化Bean的两种方式】(三)-全面详解(学习总结---从入门到深化)

目录 六、BeanFactory代码演示 七、实例化Bean的两种方式 六、BeanFactory代码演示 上面的案例代码就是我们平时使用Spring Framework的代码。 为了让小伙伴们能感受到BeanFactory&#xff0c;我们还是用实际代码来进行演示一下。毕竟 ApplicationContext在牛&#xff0c;对…

hadoop学习之hdfs学习

HDFS 文件系统,可以说是分布式数据库吧 结构是 目录树 适用场景:一次写入,多次读出.好像不太支持改删 优点: 1.高容错: 因为他会备份,所以一份出问题了,并不影响其他几份 如果副本丢失后,定时恢复.应该是定时检查然后恢复 每次启动,DN向NN汇报备份的存储情况.默认每个6个小时重…

波奇学Linux:git和gdb调试

git用来版本控制&#xff0c;同样是版本控制的软件还有svn等。 git的特定是具有网络功能的版本控制器&#xff0c;开源&#xff0c;client和server是一体的。(去中心化分布式管理) client和server一体意味着远程仓库和本地仓库是平等地位&#xff0c;远程仓库是特殊的仓库而已…

rtmp推流

目录 1、解压代码工程2、进入工程文件夹3、修改Makefile中的交叉编译路径4、编译5、板子上6、window上打开ffplay进行拉流注意:推流之前要先搭建好nginx服务器 1、解压代码工程 sudo unzip ffmpeg_rv1126_network_project_mark_finally.zip 2、进入工程文件夹 cd ffmpeg_rv…

AudioFocus源码分析

使用情景 在音视频app开发中一般会遵循音频焦点的机制&#xff0c;播放时申请音频焦点&#xff0c;丢失焦点后暂停播放&#xff0c;恢复焦点后继续播放等。尤其在车载开发时&#xff0c;涉及到三方应用和自研应用&#xff0c;导致经常出现音频焦点混乱混音等问题。 private f…

分享几个不常用的web api

分享几个不常用的web api 屏幕捕获 顾名思义&#xff0c;屏幕捕获 API 允许我们捕获屏幕内容&#xff0c;从而使构建屏幕录制的过程变得轻而易举。 在示例中我们使用video标签来显示捕获屏幕内容。 <video id"preview" autoplay>不支持HTML5 </video>…

Jmeter(119)-函数threadNum妙用

今天的接口场景是&#xff1a;有N个用户需要每隔5秒去查询一次数据&#xff0c;也就是说N个用户会去循环执行同一个接口。一开始的时候将用户参数化时使用了counter&#xff0c; 要执行2个线程3次循环&#xff0c;发现每次循环时&#xff0c;接口中用户参数的数据就会不一样&am…

统计页面左右+上下自适应布局

1:如果需要调整分栏数量,那么只需要删除对应数据,修改百分比即可. <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style type"text/css" lang"less" >body{margin: 0px ;}.box…