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

文章目录

  • 前言
  • 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 definitionCREATE 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">selectu.id,u.name,u.age,a.province,a.city,a.county,a.detailfromUser u,Address awhereu.id = a.user_id</sql><select id="getUAInfo" resultMap="UAMap"><include refid="uasql"></include></select>

测试:

 /*** 测试一对一关系的查询*/@Testpublic 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">selectu.id,u.name,u.age,b.id,b.user_id,b.title,b.contentfromUser u inner join Blogs b on (u.id = b.user_id)</sql><select id="getUBInfo" resultMap="UBMap"><include refid="ubsql"></include></select>

测试

/*** 测试一对多关系的查询*/@Testpublic 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">selectu.id,u.name,u.age,f1.id,f1.name,f1.agefromUser u,Fans f,User f1whereu.id = f.user_idand f.fan_id  = f1.id</sql><select id="getUFInfo" resultMap="UFMap"><include refid="ufsql"></include></select>

测试

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

测试结果

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IMU+激光雷达实现大规模动作捕捉

VR技术的兴起&#xff0c;使得动作捕捉这门让人们可以使用肢体语言在虚拟世界中进行互动和交流的技术逐渐成为热门。随着科技的进步&#xff0c;如今的动作捕捉技术已经十分成熟&#xff0c;但在大规模场景中准确地捕捉人体运动仍然具有挑战性。它对于体育大型赛事、舞台表演、…

WPF Prims框架详解

文章目录 前言Prism基本使用Prism选择&#xff0c;DryIoc还是UnityPrism基本框架搭建Prism动态更新View和ViewModel对应关系参数动态更新函数动态绑定 prism新建项目模板region使用事例测试是否限制空间 消息订阅如何使用消息订阅使用建议 路由导航对话框/弹窗功能实现代码 前言…

C#开发的OpenRA游戏之维修按钮

C#开发的OpenRA游戏之维修按钮 前面分析物品的变卖按钮,如果理解这个流程,再看其它按钮的流程,其实是一样的,所以前面的文章是关键,只有理解通透的基础之上,才能继续往下。 维修按钮的存在价值,就是当建筑物受到敌方破坏,还没有完全倒掉之前,可以使用金币来进行修理。…

Redis学习(四)Redis原理:底层数据结构、网络模型、内存回收策略

文章目录 Redis底层数据结构SDS 动态字符串IntSet 整数集合Dict 字典Dict伸缩中的渐进式再哈希 ZipList 压缩列表QuickLisk 快速列表SkipList 跳表动态索引建立 RedisObject变量类型与数据结构实现StringListSetZSetHash Redis网络模型Redis是单线程还是多线程&#xff1f;为什…

用vscode远程连接Linux服务器后,如何创建自己的账号

1. 打开终端&#xff08;Terminal&#xff09;窗口 2. 在终端中创建新的用户账号 &#xff08;假设您要创建的用户名为 “newuser”&#xff09;&#xff0c;在命令执行期间&#xff0c;需要提供新用户的密码。按照提示进行操作。 先输入登录的管理员账号密码。 再输入创建的…

CMS系统访问权限限制

创建一些全局的通用方法 const USER_KEY "USER_KEY" const TOKEN_KEY "JWT_TOKEN_KEY"class Auth {constructor() {this.token nullthis.user nullthis.token localStorage.getItem(TOKEN_KEY)const userJson localStorage.getItem(USER_KEY)if (use…

大华监控前端实时预览(踩坑)

难点在后端&#xff0c;前端主要是文档太少了&#xff0c;前端难点主要是接入摄像头&#xff0c;摄像头接入了&#xff0c;剩下什么对讲、调整方向、变焦之类的就简单了。 大华官网&#xff1a;https://open-icc.dahuatech.com/#/home 1.到官网下载插件或者demo&#xff0c;我是…

SpringBoot + WebSocket+STOMP指定推送消息

目录 一、前提条件1.2 环境要求1.3 依赖 二、相关工具类准备2.1 发送消息载体2.2 接收消息载体2.3 消息处理接口2.4 为 STOMP 消息传递配置 Spring 三、前端部分四、效果 一、前提条件 本文将简单的描述SpringBoot WebSocketSTOMP指定推送消息场景&#xff0c;不包含信息安全加…

实时监测与报警,探索CMS系统在半导体设备安全管理中的作用

在半导体制造行业&#xff0c;设备的安全管理对于保障生产运行和员工安全至关重要。中央设备状态监控系统CMS&#xff08;central monitoring system&#xff09;是一种关键的解决方案&#xff0c;为企业提供实时监测和报警功能&#xff0c;有效应对设备安全管理的挑战。本文将…

网页动态表单 ,网页动态参数

有的时候因为参数太多 无法 一一 创建 所有采用动态创建 自己遇到的一个实际情况今天写个例子 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>form demo</title><link rel"stylesheet" href&quo…

Vit 实战营 Class2:图像与Transformer基础

文章目录 数组图像&#xff1a;图像与像素图像分类&#xff1a;机器如何学习&#xff1f;NMT&#xff1a;Neuron Machine TranslationTransformerVision Transformer代码实战 数组图像&#xff1a;图像与像素 什么是数字图像&#xff1f;在计算机图像的图像格式。每一个点叫pix…

工欲善其事,必先利其器之—react-native-debugger调试react native应用

调试react应用通常利用chrome的inspector的功能和两个最常用的扩展 1、React Developer Tools &#xff08;主要用于debug组件结构) 2、Redux DevTools &#xff08;主要用于debug redux store的数据&#xff09; 对于react native应用&#xff0c;我们一般就使用react-nativ…