MyBatis 高级查询环境准备(八)
MyBatis 高级查询
之前在学习 Mapper XML 映射文件时,说到 resultMap 标记是 MyBatis 中最重要最强大也是最复杂的标记,而且还提到后面会详细介绍它的高级用法。
听到高级用法不要觉得有多高级,说白了就是联表查询。
MyBatis 支持四种联表查询方式:
一对一联表查询
一对多联表查询
多对一联表查询
多对多联表查询
联表查询需要用到 resultMap 标记两个子标记:
- association 标记:用于映射关联查询单个对象的信息
- collection 标记:用于映射关联查询多个对象的信息
环境准备
创建数据库表
为了演示高级查询,我准备了四张表,想必大家都喜欢玩游戏,那么这四张表和游戏有关,分别是:
- 玩家表(tb_player)
- 游戏表(tb_game)
- 账号表(tb_account)
- 角色表(tb_role)
简单分析一下这四张表的关系如下:
- 玩家表->游戏表:多对多(一个玩家有多个游戏,一个游戏有多个玩家)
- 游戏表->账号表:一对多(一个游戏有多个账号,一个账号有一个游戏)
- 账号表->游戏表:多对一(一个游戏有多个账号,一个账号有一个游戏)
- 账号表->角色表:一对一(一个账号有一个角色,一个角色有一个账号)
编写 SQL 语句分别创建四张表,如下:
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `tb_account`
-- ----------------------------
DROP TABLE IF EXISTS `tb_account`;
CREATE TABLE `tb_account` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_name` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`game_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `game_id` (`game_id`) USING BTREE,
CONSTRAINT `tb_account_ibfk_1` FOREIGN KEY (`game_id`) REFERENCES `tb_game` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of tb_account
-- ----------------------------
INSERT INTO `tb_account` VALUES ('1', '潇洒哥', '12345', '1');
INSERT INTO `tb_account` VALUES ('4', '进击巨人', '11111', '1');
INSERT INTO `tb_account` VALUES ('5', '征服者', '12315', '2');
-- ----------------------------
-- Table structure for `tb_game`
-- ----------------------------
DROP TABLE IF EXISTS `tb_game`;
CREATE TABLE `tb_game` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`type` varchar(255) DEFAULT NULL,
`operator` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of tb_game
-- ----------------------------
INSERT INTO `tb_game` VALUES ('1', '英雄联盟', 'MOBA', '腾讯游戏');
INSERT INTO `tb_game` VALUES ('2', '绝地求生', 'TPS', '蓝洞游戏');
-- ----------------------------
-- Table structure for `tb_player`
-- ----------------------------
DROP TABLE IF EXISTS `tb_player`;
CREATE TABLE `tb_player` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`sex` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of tb_player
-- ----------------------------
INSERT INTO `tb_player` VALUES ('1', '张三', '23', '1');
INSERT INTO `tb_player` VALUES ('2', '李四', '24', '1');
-- ----------------------------
-- Table structure for `tb_player_game`
-- ----------------------------
DROP TABLE IF EXISTS `tb_player_game`;
CREATE TABLE `tb_player_game` (
`player_id` int(11) NOT NULL DEFAULT '0',
`game_id` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`player_id`,`game_id`),
KEY `game_id` (`game_id`),
CONSTRAINT `tb_player_game_ibfk_2` FOREIGN KEY (`game_id`) REFERENCES `tb_game` (`id`),
CONSTRAINT `tb_player_game_ibfk_1` FOREIGN KEY (`player_id`) REFERENCES `tb_player` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of tb_player_game
-- ----------------------------
INSERT INTO `tb_player_game` VALUES ('1', '1');
INSERT INTO `tb_player_game` VALUES ('1', '2');
INSERT INTO `tb_player_game` VALUES ('2', '2');
-- ----------------------------
-- Table structure for `tb_role`
-- ----------------------------
DROP TABLE IF EXISTS `tb_role`;
CREATE TABLE `tb_role` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`profession` varchar(255) DEFAULT NULL,
`rank` int(11) DEFAULT NULL,
`money` int(11) DEFAULT NULL,
`account_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `account_id` (`account_id`) USING BTREE,
CONSTRAINT `tb_role_ibfk_1` FOREIGN KEY (`account_id`) REFERENCES `tb_account` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of tb_role
-- ----------------------------
INSERT INTO `tb_role` VALUES ('1', '战士', '10', '2000', '1');
INSERT INTO `tb_role` VALUES ('2', '法师', '30', '100000', '4');
INSERT INTO `tb_role` VALUES ('4', '刺客', '1', '100', '5');
数据库显示如下:
这张图是通过 Navicat 工具的逆向表模型功能得到的,可以直观方便查看表与表之间的关系,操作步骤如下:
你可能会问,不是说四张表,怎么数据库里有五张表呀,原因是多对多的关联关系在数据库中无法直接实现,只能间接实现;具体而言,就是通过添加一张中间表,将多对多的关联关系转化为两个一对多的关联关系。
如果还没搞明白,建议你去复习一下数据库的相关知识。
MyBatis 高级查询环境准备(八)的更多相关文章
- MyBatis高级查询
-------------------------siwuxie095 MyBatis 高级查询 1.MyBatis 作为一个 ORM 框架,也对 SQL 的高级查询做了支持, MyBatis 高级查 ...
- MyBatis 高级查询之多对多查询(十一)
高级查询之多对多查询 查询条件:根据玩家名,查询游戏信息 我们在之前创建的映射器接口 GameMapper.java 中添加接口方法,如下: /** * 根据玩家名查询游戏 * @param name ...
- MyBatis 高级查询之一对多查询(十)
高级查询之一对多查询 查询条件:根据游戏名称,查询游戏账号信息 我们在之前创建的映射器接口 GameMapper.java 中添加接口方法,如下: /** * 根据游戏名查询游戏账号 * @param ...
- MyBatis 高级查询之一对一查询(九)
高级查询之一对一查询 查询条件:根据游戏角色ID,查询账号信息 我们在之前创建的映射器接口 GameMapper.java 中添加接口方法,如下: /** * 根据角色ID查询账号信息 * @para ...
- Mybatis 高级查询的小整理
高级查询的整理 // resutlType无法帮助我们自动的去完成映射,所以只有使用resultMap手动的进行映射 resultMap: type 结果集对应的数据类型 id 唯一标识,被引用的时候 ...
- Mybatis高级查询之关联查询
learn from:http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#Result_Maps 关联查询 准备 关联结果查询(一对一) resul ...
- MyBatis从入门到精通(第6章):MyBatis 高级查询->6.1.2高级结果映射之一对多映射
jdk1.8.MyBatis3.4.6.MySQL数据库5.6.45.IntelliJ IDEA 2019.3.1 本章主要包含的内容为 MyBatis 的高级结果映射,主要处理数据库一对一.一对多的 ...
- MyBatis从入门到精通(第6章):MyBatis 高级查询->6.1.1高级结果映射之一对一映射
jdk1.8.MyBatis3.4.6.MySQL数据库5.6.45.IntelliJ IDEA 2019.2.4 本章主要包含的内容为 MyBatis 的高级结果映射,主要处理数据库一对一.一对多的 ...
- Mybatis高级查询之一对一查询的四种方法
目录 1. 一对一查询 1.1 一对一嵌套结果查询 1.2 使用resultMap配置一对一映射 1.3 使用resultMap的association标签配置一对一映射 1.4 associatio ...
随机推荐
- 自学PHP笔记(五) PHP运算符
本文转发来自:自学PHP笔记(五) PHP运算符 首先我们需要了解运算符是什么,运算符是指的对变量.常量或者数据进行计算的一个符号,比如数学中学到的加减乘除等用来运算的代表符号,PHP中的运算符也是这 ...
- 如果要做优化,CSS提高性能的方法有哪些?
一.前言 每一个网页都离不开css,但是很多人又认为,css主要是用来完成页面布局的,像一些细节或者优化,就不需要怎么考虑,实际上这种想法是不正确的 作为页面渲染和内容展现的重要环节,css影响着用户 ...
- 聊聊 OAuth 2.0 的 token expire_in 使用
问题背景 有同学私信问了这样的问题,访问 pig4cloud 的演示环境 查看登录请求 network 返回报文如下: { "access_token":"16d3579 ...
- Arch! 从安装开始
Arch! 从安装开始 事实上Arch的安装Arch Wiki Installation Guide,已经非常详细了 但是初次面对这些东西时肯定非常迷茫,根本不知道这些东西是在干嘛?为什么要这么干? ...
- 【ORM】Mybatis与JPA的区别
Mybatis与JPA的区别: 1.ORM映射不同: Mybatis是半自动的ORM框架,提供数据库与结果集的映射: JPA(Hibernate)是全自动的ORM框架,提供对象与数据库的映射: 2.可 ...
- hdu2155 小黑的镇魂曲(dp)
题意: 小黑的镇魂曲 Problem Description 这个事情发生在某一天,当小黑和SSJ正在约会的时候,邪恶的Guner抓走了SSJ, ...
- POJ2528线段树段更新逆序异或(广告牌)
题意: 可以这样理解,有一条直线,然后用n条线段去覆盖,最后问全部都覆盖完之后还有多少是没有被完全覆盖的. 思路: 一开始想的有点偏,想到起点排序,然后..失败了,原因是忘记了题目 ...
- 半自动二进制协议模糊工具 Peach 使用
链接:https://bbs.ichunqiu.com/thread-54487-1-1.html
- 第六部分 数据搜索之使用HBASE的API实现条件查询
题目 使用HADOOP的MAPReduce,实现以下功能: (1)基于大数据计算技术的条件查询:使用mapreduce框架,实现类似Hbase六个字段查询的功能 (2)时段流量统计:以hh:mm:ss ...
- yum makecache: error: argument timer: invalid choice: ‘fast’ (choose from ‘timer’)
这是因为版本问题,centos8没有该参数,解决办法为:去掉fast参数,就可以了 sudo yum makecache