【Spring Boot】MyBatis多表查询的操作:注解和XML实现SQL语句

news2025/5/10 9:48:20

1.准备工作

1.1创建数据库

(1)创建数据库:

CREATE DATABASE mybatis_test DEFAULT CHARACTER SET utf8mb4;

(2)使用数据库

-- 使⽤数据数据
USE mybatis_test;

1.2 创建用户表和实体类

创建用户表


-- 创建表[⽤⼾表]

CREATE TABLE `user_info` (
 `id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
 `username` VARCHAR ( 127 ) NOT NULL,
 `password` VARCHAR ( 127 ) NOT NULL,
 `age` TINYINT ( 4 ) NOT NULL,
 `gender` TINYINT ( 4 ) DEFAULT '0' COMMENT '1-男 2-⼥ 0-默认',
 `phone` VARCHAR ( 15 ) DEFAULT NULL,
 `delete_flag` TINYINT ( 4 ) DEFAULT 0 COMMENT '0-正常, 1-删除',
 `create_time` DATETIME DEFAULT now(),
 `update_time` DATETIME DEFAULT now() ON UPDATE now(),
 PRIMARY KEY ( `id` ) 
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4; 

添加用户信息

-- 添加⽤⼾信息
INSERT INTO user_info( username, `password`, age, gender, phone )
VALUES ( 'admin', 'admin', 18, 1, '18612340001' );
INSERT INTO user_info( username, `password`, age, gender, phone )
VALUES ( 'zhangsan', 'zhangsan', 18, 1, '18612340002' );
INSERT INTO user_info( username, `password`, age, gender, phone )
VALUES ( 'lisi', 'lisi', 18, 1, '18612340003' );
INSERT INTO user_info( username, `password`, age, gender, phone )
VALUES ( 'wangwu', 'wangwu', 18, 1, '18612340004' );

实体类的属性名与表中的字段名⼀⼀对应

@Data
public class UserInfo {

    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private Integer gender;
    private String phone;
    private Integer deleteFlag;
    private Date createTime;
    private Date updateTime;

}

1.3 创建文章表和实体类

上⾯建了⼀张⽤⼾表, 我们再来建⼀张⽂章表, 进⾏多表关联查询.
⽂章表的uid, 对应⽤⼾表的id.

创建文章表:

-- 创建⽂章表
DROP TABLE IF EXISTS articleinfo;
CREATE TABLE articleinfo (
id INT PRIMARY KEY auto_increment, title VARCHAR ( 100 ) NOT NULL,
content TEXT NOT NULL, uid INT NOT NULL,
delete_flag TINYINT ( 4 ) DEFAULT 0 COMMENT '0-正常, 1-删除',
create_time DATETIME DEFAULT now(), update_time DATETIME DEFAULT now()
) DEFAULT charset 'utf8mb4';

插入数据

-- 插⼊测试数据
INSERT INTO articleinfo ( title, content, uid ) VALUES ( 'Java', 'Java正文', 1
);
INSERT INTO articleinfo ( title, content, uid ) VALUES ( 'MySQL', 'MySQL正文', 1
);
INSERT INTO articleinfo ( title, content, uid ) VALUES ( 'C', 'C正文', 2
);

实体类的属性名与表中的字段名⼀⼀对应

@Data
public class ArticleInfo { 
	private Integer id; 
	private String title; 
	private String content; 
	private Integer uid; 
	private Integer deleteFlag; 
	private Date createTime; 
	private Date updateTime;
}

1.4 配置文件

Application.yml文件中配置:

# 数据库连接配置
spring:
  datasource:
    
    # MySQL在远程服务器上
    url: jdbc:mysql://x.x.x.x:3306/mybatis_test?characterEncoding=utf8&useSSL=false
    username: root  #MySQL账号
    password: root  #MySQL密码
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis:
  configuration: # 配置打印 MyBatis⽇志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true #配置驼峰⾃动转换
    
  # 配置 mybatis xml 的⽂件路径,在 resources/mapper 创建所有表的 xml ⽂件
  mapper-locations: classpath:mapper/**Mapper.xml

2.多表查询

2.1 需求: 根据uid查询书的作者等相关信息

2.1.1 注解实现

SQL命令:

SELECT
	a.id,
	a.title,
	a.content,
	a.uid,
	b.username,
	b.age,
	b.gender
FROM
	articleinfo a
	LEFT JOIN user_info b ON a.uid = b.id
WHERE
	a.id =1;

根据查询的结果在ArticleInfo 类补充相关的属性:

@Data
public class ArticleInfo {
	private Integer id;
	private String title;
	private String content;
	private Integer uid;
	private Integer deleteFlag;
	private Date createTime;
	private Date updateTime;
	// 补充⽤⼾相关信息
	private String username;
	private Integer age;
	private Integer gender;
 }

ArticleInfoMapper接口:

@Mapper
public interface ArticleInfoMapper {

    @Select("select a.id,a.title,a.content,a.uid, b.username, b.age, b.gender " + // 注意最后的空格
            "from articleinfo a left join user_info b on a.uid=b.id " +
            "where a.id = #{id}")
    ArticleInfo queryArticleAndUser(Integer id);
}

测试代码:

@Slf4j
@SpringBootTest
class ArticleInfoMapperTest {

    @Autowired
    private ArticleInfoMapper articleInfoMapper;

    @Test
    void queryArticleAndUser() {
        articleInfoMapper.queryArticleAndUser(1);
    }
}

运行结果:
在这里插入图片描述
如果名称不⼀致的, 采⽤Results, 或者别名的⽅式解决, 和单表查询⼀样 Mybatis 不分单表还是多表, 主要就是三部分: SQL, 映射关系和实体类

2.1.2 XML实现

SQL命令:

SELECT
	a.id,
	a.title,
	a.content,
	a.uid,
	b.username,
	b.age,
	b.gender
FROM
	articleinfo a
	LEFT JOIN user_info b ON a.uid = b.id
WHERE
	a.id =1;

根据查询的结果在ArticleInfo 类补充相关的属性:

@Data
public class ArticleInfo {
	private Integer id;
	private String title;
	private String content;
	private Integer uid;
	private Integer deleteFlag;
	private Date createTime;
	private Date updateTime;
	// 补充⽤⼾相关信息
	private String username;
	private Integer age;
	private Integer gender;
 }

ArticleInfoMapper接口:

@Mapper
public interface ArticleInfoXMLMapper {
    ArticleInfo queryArticleAndUser(Integer id);
}

ArticleInfoXMLMapper.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.mybatis.mapper.ArticleInfoXMLMapper">


    <select id ="queryArticleAndUser" resultType="org.example.mybatis.model.ArticleInfo">
        select a.id,a.title,a.content,a.uid, b.username, b.age, b.gender
            from articleinfo a left join user_info b on a.uid=b.id
            where a.id = #{id}
    </select>

</mapper>

测试代码:

@Slf4j
@SpringBootTest
class ArticleInfoXMLMapperTest {

    @Autowired
    private ArticleInfoXMLMapper articleInfoXMLMapper;

    @Test
    void queryArticleAndUser() {
        articleInfoXMLMapper.queryArticleAndUser(1);
    }
}

运行结果:
在这里插入图片描述

如果名称不⼀致的, 采⽤ResultMap, 或者别名的⽅式解决, 和单表查询⼀样 Mybatis 不分单表还是多表, 主要就是三部分: SQL, 映射关系和实体类

2.2 需求: 根据user_in的id查询作者创作的书相关信息

2.1.1 注解实现

SQL命令:

SELECT
	b.username,
	b.age,
	b.gender,
	a.id,
	a.title,
	a.content,
	a.uid
FROM
	articleinfo a
	RIGTH JOIN user_info  b ON b.uid = a.id
WHERE
	b.id =1;

根据查询的结果在ArticleInfo 类补充相关的属性:

@Data
public class ArticleInfo {
	private Integer id;
	private String title;
	private String content;
	private Integer uid;
	private Integer deleteFlag;
	private Date createTime;
	private Date updateTime;
	// 补充⽤⼾相关信息
	private String username;
	private Integer age;
	private Integer gender;
 }

ArticleInfoMapper接口:

@Mapper
public interface ArticleInfoMapper {
    @Select("select b.username, b.age,b.gender,a.id,a.title,a.content,a.uid " + // 注意最后的空格
            "from articleinfo a right join user_info b on a.uid=b.id " +
            "where b.id = #{id}")
    List<ArticleInfo> queryArticleAndUser(Integer id);
}

测试代码:

@Slf4j
@SpringBootTest
class ArticleInfoMapperTest {

    @Autowired
    private ArticleInfoMapper articleInfoMapper;

    @Test
    void queryArticleAndUser() {
        articleInfoMapper.queryArticleAndUser(1);
    }
}

运行结果:
在这里插入图片描述

如果名称不⼀致的, 采⽤Results, 或者别名的⽅式解决, 和单表查询⼀样 Mybatis 不分单表还是多表, 主要就是三部分: SQL, 映射关系和实体类

2.1.2 XML实现

SQL命令:

SELECT
	b.username,
	b.age,
	b.gender,
	a.id,
	a.title,
	a.content,
	a.uid
FROM
	articleinfo a
	RIGHT JOIN user_info b ON a.uid = b.id
WHERE
	a.id =1;

根据查询的结果在ArticleInfo 类补充相关的属性:

@Data
public class ArticleInfo {
	private Integer id;
	private String title;
	private String content;
	private Integer uid;
	private Integer deleteFlag;
	private Date createTime;
	private Date updateTime;
	// 补充⽤⼾相关信息
	private String username;
	private Integer age;
	private Integer gender;
 }

ArticleInfoMapper接口:

@Mapper
public interface ArticleInfoXMLMapper {
    List<ArticleInfo> queryArticleAndUser(Integer id);
}

ArticleInfoXMLMapper.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.mybatis.mapper.ArticleInfoXMLMapper">


    <select id ="queryArticleAndUser" resultType="org.example.mybatis.model.ArticleInfo">
        select b.username, b.age, b.gender,a.id,a.title,a.content,a.uid
            from articleinfo a right join user_info b on a.uid=b.id
            where b.id = #{id}
    </select>

</mapper>

测试代码:

@Slf4j
@SpringBootTest
class ArticleInfoXMLMapperTest {

    @Autowired
    private ArticleInfoXMLMapper articleInfoXMLMapper;

    @Test
    void queryArticleAndUser() {
        articleInfoXMLMapper.queryArticleAndUser(1);
    }
}

运行结果:
在这里插入图片描述

如果名称不⼀致的, 采⽤ResultMap, 或者别名的⽅式解决, 和单表查询⼀样 Mybatis 不分单表还是多表, 主要就是三部分: SQL, 映射关系和实体类

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

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

相关文章

[Android]豆包爱学v4.5.0小学到研究生 题目Ai解析

拍照解析答案 【应用名称】豆包爱学 【应用版本】4.5.0 【软件大小】95mb 【适用平台】安卓 【应用简介】豆包爱学&#xff0c;一般又称河马爱学教育平台app,河马爱学。 关于学习&#xff0c;你可能也需要一个“豆包爱学”这样的AI伙伴&#xff0c;它将为你提供全方位的学习帮助…

Qt开发:软件崩溃时,如何生成dump文件

文章目录 一、程序崩溃时如何自动生成 Dump 文件二、支持多线程中的异常捕获三、在 DLL 中使用 Dump 捕获四、封装成可复用类五、MiniDumpWriteDump函数详解 一、程序崩溃时如何自动生成 Dump 文件 步骤一&#xff1a;包含必要的头文件 #include <Windows.h> #include …

普罗米修斯Prometheus监控安装(mac)

普罗米修斯是后端数据监控平台&#xff0c;通过Node_exporter/mysql_exporter等收集数据&#xff0c;Grafana将数据用图形的方式展示出来 官网各平台下载 Prometheus安装&#xff08;mac&#xff09; &#xff08;1&#xff09;通过brew安装 brew install prometheus &…

Python SQL 工具包:SQLAlchemy介绍

SQLAlchemy 是一个功能强大且灵活的 Python SQL 工具包和对象关系映射&#xff08;ORM&#xff09;库。它被广泛用于与关系型数据库进行交互&#xff0c;提供了从低级 SQL 表达式到高级 ORM 的完整工具链。SQLAlchemy 的设计目标是让开发者能够以 Pythonic 的方式操作数据库&am…

Shader属性讲解+Cg语言讲解

CPU调用GPU传递数据 修改Render组件的material属性 在脚本中更改游戏物体材质颜色代码示例&#xff1a; using System.Collections; using System.Collections.Generic; using UnityEngine;public class TestFixedColor : MonoBehaviour {void Start(){//创建预制体GameObjec…

基于LightGBM-TPE算法对交通事故严重程度的分析与可视化

基于LightGBM-TPE算法对交通事故严重程度的分析与可视化 原文&#xff1a; Analysis and visualization of accidents severity based on LightGBM-TPE 1. 引言部分 文章开篇强调了道路交通事故作为意外死亡的主要原因&#xff0c;引起了多学科领域的关注。分析事故严重性特…

什么是CRM系统,它的作用是什么?CRM全面指南

CRM&#xff08;Customer Relationship Management&#xff0c;客户关系管理&#xff09;系统是一种专门用于集中管理客户信息、优化销售流程、提升客户满意度、支持精准营销、驱动数据分析决策、加强跨部门协同、提升客户生命周期价值的业务系统工具。其中&#xff0c;优化销售…

MYSQL之库的操作

创建数据库 语法很简单, 主要是看看选项(与编码相关的): CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name 1. 语句中大写的是…

Linux 下的网络管理(附加详细实验案例)

一、简单了解 NM&#xff08;NetworkManager&#xff09; 在 Linux 中&#xff0c;NM 是 NetworkManager 的缩写。它是一个用于管理网络连接的守护进程和工具集。 在 RHEL9 上&#xff0c;使用 NM 进行网络配置&#xff0c;ifcfg &#xff08;也称为文件&#xff09;将不再…

基于SpringBoot的疫情居家检测管理系统(源码+数据库)

514基于SpringBoot的疫情居家检测管理系统&#xff0c;系统包含三种角色&#xff1a;管理员、用户、医生&#xff0c;主要功能如下。 【用户功能】 1. 首页&#xff1a;获取系统信息。 2. 论坛&#xff1a;参与居民讨论和分享信息。 3. 公告&#xff1a;查看社区发布的各类公告…

MATLAB 控制系统设计与仿真 - 35

MATLAB鲁棒控制器分析 所谓鲁棒性是指控制系统在一定(结构&#xff0c;大小)的参数扰动下&#xff0c;维持某些性能的特征。 根据对性能的不同定义&#xff0c;可分为稳定鲁棒性(Robust stability)和性能鲁棒性(Robust performance)。 以闭环系统的鲁棒性作为目标设计得到的…

性能比拼: Nginx vs Caddy

本内容是对知名性能评测博主 Anton Putra Nginx vs Caddy Performance 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 引言 在本期视频中&#xff0c;我们将对比 Nginx 和 Caddy---一个用 Go 编写的 Web 服务器和反向代理。 在第一个测试中&#xff0c;我们会使用…

C++项目-衡码云判项目演示

衡码云判项目是什么呢&#xff1f;简单来说就是这是一个类似于牛客、力扣等在线OJ系统&#xff0c;用户在网页编写代码&#xff0c;点击提交后传递给后端云服务器&#xff0c;云服务器将用户的代码和测试用例进行合并编译&#xff0c;返回结果到网页。 项目最大的两个亮点&…

李宏毅NLP-6-seq2seqHMM

比较seq2seq和HMM Hidden Markov Model(HMM) 隐马尔可夫模型&#xff08;HMM&#xff09;在语音识别中的应用&#xff0c;具体内容如下&#xff1a; 整体流程&#xff1a; 左侧为语音信号&#xff08;标记为 “speech”&#xff09;&#xff0c;其特征表示为 X X X。中间蓝色模…

百度暑期实习岗位超3000个,AI相关岗位占比87%,近屿智能携AIGC课程加速人才输出

今年3月&#xff0c;百度重磅发布3000暑期实习岗位&#xff0c;聚焦大模型、机器学习、自动驾驶等AI方向的岗位比例高达87%。此次实习岗位涉及技术研发、产品策划、专业服务、管理支持、政企解决方案等四大类别&#xff0c;覆盖超300个岗位细分方向。值得一提的是&#xff0c;百…

【技术派后端篇】基于 Redis 实现网站 PV/UV 数据统计

在网站的数据分析中&#xff0c;PV&#xff08;Page View&#xff0c;页面浏览量&#xff09;和 UV&#xff08;Unique Visitor&#xff0c;独立访客数&#xff09;是两个重要的指标&#xff0c;几乎每个网站都需要对其进行统计。市面上有很多成熟的统计产品&#xff0c;例如百…

JAVA:利用 Apache Tika 提取文件内容的技术指南

1、简述 Apache Tika 是一个强大的工具,用于从各种文件中提取内容和元数据。📄Tika 支持解析文档、📸图像、🎵音频、🎥视频文件以及其他多种格式,非常适合构建🔍搜索引擎、📂内容管理系统和📊数据分析工具。 样例代码:https://gitee.com/lhdxhl/springboot-…

【AI】SpringAI 第二弹:接入 DeepSeek 官方服务

一、接入 DeepSeek 官方服务 通过一个简单的案例演示接入 DeepSeek 实现简单的问答功能 1.添加依赖 <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-openai</artifactId> </dependency> 2…

XMLXXE 安全无回显方案OOB 盲注DTD 外部实体黑白盒挖掘

# 详细点&#xff1a; XML 被设计为传输和存储数据&#xff0c; XML 文档结构包括 XML 声明、 DTD 文档类型定义&#xff08;可 选&#xff09;、文档元素&#xff0c;其焦点是数据的内容&#xff0c;其把数据从 HTML 分离&#xff0c;是独立于软件和硬件的 信息传输…

SQL之DML(查询语句:select、where)

&#x1f3af; 本文专栏&#xff1a;MySQL深入浅出 &#x1f680; 作者主页&#xff1a;小度爱学习 select查询语句 在开发中&#xff0c;查询语句是使用最多&#xff0c;也是CRUD中&#xff0c;复杂度最高的sql语句。 查询的语法结构 select *|字段1 [, 字段2 ……] from 表…