MyBatis(4)—多表查询

多表查询:

建数据库的表名字段名全部是小写,windows系统下对于大小写不敏感,但是在linux上对于大小写就是敏感的;

一对一:一篇博客对应着一个作者, 博客表{一个作者User属性}使用assocation属性
一对多:一个作者对应着多篇博客,用户表{List
ResultMap和ResultType的区别:
1)字段映射不同:resultType适用于数据库字段名和实体类的名字是相同的,但是假设实体类的名字叫做username,但是数据库的名字是name,这时候数据库字段名和实体类的名字是不一样的,所以我们需要使用ResultMap,当我们对数据库表中的字段映射到一个对象里面的属性,MYSQL表中的字段名和类中字段名不一致的时候进行映射的处理;
2)多表查询不同:多表查询适用于ResultMap,resultType不能使用;

1)resultMap里面还是做的是数据库表中的属性到类中的字段的一个映射,有可能是类中的一个属性对应着表中的一个属性,或者是类中的一个属性对应着表中的多个字段;
2)如果多表联查中两个表对应的两个类属性是相同的,那么后面的表的字段的值将会被前一个表中的相同的字段值所覆盖,况且设置前缀尽量在后面的类中的一个属性进行设置;

指定别名的作用:通常给第二张表的相同字段指定别名

如果说进行连表查询的时候两张表有相同的字段,那么在你不指定别名的情况下,第二张表重复的字段将会被第一张表重复的字段属性所覆盖,如果多张表的两张表的字段全部不一样,那么此时设置前缀不会有任何问题

下面我们来进行演示一下一对一,多表查询:

1)在上面我们已经完成了多表查询,现在我们在进行创建一张表,叫做blog表,博客表
我们既然要进行一对一的多表查询,一对一映射,因为一篇博客值对应着一个作者
2)设置前缀的作用:因为我们知道,在实际的工作环境中,我们的博客表和用户表很有可能是存在相同的字段名的,很有可能是说我们的User表里面,有一个唯一的用户身份标识叫做ID,还有一个唯一的博客身份标识也叫做ID,那么这时候我们进行连表查询的时候就会出现严重的问题,所以我们要进行设置一个别名, 前缀是用来解决多张表中相同字段覆盖的问题
3)因为一篇博客对应着唯一的作者,所以我们在博客列表对应的Java代码中,我们要进行设置一个User属性,下面是我们的数据库建表操作和创建实体类,我们还要安装MyBatisX这个插件

 create table blog(
       blogID int primary key auto_increment,
       userID int,
       title varchar(30),
       content varchar(30));
@Data
public class Blog {
    int blogID;
    int userIDl
    String title;
    String content;
    User user;
}

MyBatis(4)---多表查询

MyBatis(4)---多表查询

MyBatis(4)---多表查询

1)我们写的BlogController里面的代码:


@Controller
public class BlogController {
    @Autowired
    BlogService blogService;
   @RequestMapping("/GetAll")
   @ResponseBody
    public List GetAll()
    {
        return blogService.GetAll();
    }

}

2)我们写的BlogService里面的代码:


@Service
public class BlogService {
    @Autowired
    BlogMapper mapper;
    public List GetAll() {
        return mapper.GetAll();
    }
}

3)我们写的BlogMapper接口里面的代码和blogMapper.XML文件里面的代码:

这个是BlogMapper接口里面的代码:
@Mapper
public interface BlogMapper {
    List GetAll();
}
这个是XML文件里面的代码:

        select * from blog left join user on user.userID=blog.userID;

1)我们在这个XML文件里面我们用namespace指定了我们实现接口的位置换句话来说就是实现接口的路径;
2)我们用resultType表示了我们要返回的类型,换句话说就是我们数据库表对应的实体类的路径;
3)注意一下在整个XML文件里面,我们都没有进行指定User实体类的路径,因为在我们blog类中还有User这样的属性,由于XML文件中没有这样的指定位置,所以我们无法得到User对象,所以我们看到当我们使用浏览器进行访问的时候,我们无法得到user对象

4)所以我们使用resultType指定实体类的路径的方法是不行的,我们尝试用一下resultMap

第一个字段 property的参数指定的是我们blog表中要进行关联的属性
第二个字段 resultMap,表示User表中的resultMap的位置:
第三个参数表示 前缀,我们想要查询User对象的所有字段的属性都要加上前缀:

blogMapper.xml文件里面的代码:

        select blog.*,user.userID as u_userID,user.classID as u_classID,user.password as u_password,user.username as u_username
        from blog left join user on user.userID=blog.userID;

MyBatis(4)---多表查询

我们写的UserMapper.xml里面的代码:


我们此时进行创建方法,我们进行返回的是一个List

1)resultMap:所以说我们一定要在我们所关联对象的XML文件里面建立一个resultMap,是不能指定一个resultType,所以说我们要存放管理属性的字典映射;
2)别忘了写前缀,如果说我们在进行多表查询的时候两张表出现了相同的字段,如果没设置前缀,那么查询的结果就是错误的,防止多张表出现相同字段查询问题;

MyBatis(4)---多表查询

现在我们使用一下一对多查询:

1)咱们说上面我们进行多表查询的时候,我们的一篇博客是对应着一个作者,这是一对一的关系,但是从另一个角度来说:我们的一个作者又是对应着多篇博客的,所以我们针对一对多来进行查询;
2)因为一个作者是对应着多篇博客的,所以我们要在user表里面加上一个字段List

@Setter
@Getter
@ToString
public class User {
    private int ClassID;
    private int userID;
    private String username;
    private String password;
    List list;
}

我们可以先写一个SQL语句进行验证一下:

展示代码:
1)我们写的UserController里面的代码:

public class UserController {
    @Autowired
    UserService userService;
      @RequestMapping("/Get")
      @ResponseBody
     public List GetAll()
     {
         return userService.GetAll();
     }

}

2)咱们的UserService和UserMapper里面的代码如下:

@Service
public class UserService {
        @Autowired
        private UserMapper mapper;
    public List GetAll() {
        return mapper.GetAll();
    }
}

@Mapper
public interface UserMapper {
    List GetAll();
}

3)咱们的blogXML文件中的代码如下:


        select blog.*,user.userID as u_userID,user.classID as u_classID,user.password as u_password,user.username as u_username
        from blog left join user on user.userID=blog.userID;

4)在们的blogMapper.xml中的代码如下:


        select user.*,blog.blogID as u_blogID,blog.userID as u_userID,blog.title as u_title,blog.content as u_content from user join blog on blog.userID=user.userID;

结果:

MyBatis(4)---多表查询
MyBatis(4)---多表查询
logging.level.com.example.demo=debug

Original: https://blog.csdn.net/weixin_61518137/article/details/127794647
Author: 神人燕双鹰
Title: MyBatis(4)—多表查询

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/653939/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 霍夫变换——HoughLines、HoughLinesP和HoughCircles

    一、霍夫变换 1、霍夫变换是一种在图像中寻找直线、圆形及其他简单形状的方法。2、笛卡尔空间与霍夫空间映射关系 笛卡尔空间内的一条直线确定了霍夫空间内的一个点。 霍夫空间内的一个点确…

    人工智能 2023年6月20日
    065
  • 图表数据分析怎么做,举实例给你说清楚

    现在工作离不开图表数据分析,但是图表数据分析却容易出错。而且容易出现错误的地方不是在对数据的处理上,而是在对图表的选择上。 要正确的做好图表数据分析就要选择合适的图表再进行分析。下…

    人工智能 2023年7月16日
    066
  • 【JAVA】基础语法

    【JAVA】基础语法 JAVA面向对象三大特征: 封装、继承、多态 1 类型转换 1.1 自动类型转换 自动类型转换: 类型范围小的变量,可以直接赋值给类型范围大的变量。 ; 1….

    人工智能 2023年6月27日
    068
  • 前端面试–贡献给刚毕业的你们

    对于刚毕业准备找工作的你,来看看最近面试的一些问题,都是问的基础知识点,对于一些公司的工作岗位面试题还是很简单的,对于一些大厂招聘或许会问一些框架类,基本上下面举例的面试题中,对于…

    人工智能 2023年6月29日
    063
  • 【python数据分析】数据如何进行合并

    数据的合并 在拥有了数据基本筛选能力后,我们还要有更加nb的操作,接下来就学习如何利用Pandas合并多个DataFrame数据,以及筛选我们心仪的数据。在数据合并里面主要讲两个函…

    人工智能 2023年6月19日
    074
  • 服务器安装pytorch

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、前言 二、安装步骤 1.安装anaconda 2.pytorch安装 三、总结 一、前言 本文记录深…

    人工智能 2023年7月23日
    048
  • 本周总结—-ResNet 模型

    一、Resnet论文解读 以resnet34为例介绍* 图一 :res34层整体结构 图二: resnet的尺寸通道数表 1、残差结构 主通道上输入x进入一个卷积层后做BN,做re…

    人工智能 2023年7月14日
    041
  • 《ASV-Subtools 声纹识别实战》课程

    ASV-Subtools简介 近年来,随着深度学习的快速发展, 简单易用、性能稳定、开发高效的深度学习框架越来越被科研和工业界人员所需要。其中,TensorFlow和Pytorch…

    人工智能 2023年5月25日
    061
  • 印章识别–笛卡尔坐标系转换成极坐标系

    #代码,使用了opencv自带的函数linearPolar import cv2 import numpy as np source = cv2.imread(‘images/im…

    人工智能 2023年7月19日
    046
  • 学习 Python 之 Pandas库

    什么是Pandas库? Pandas是基于Numpy的专业数据分析工具, 可以灵活高效的处理各种数据集 它提供了的数据结构有DataFrame和Series等 我们可以简单粗的把D…

    人工智能 2023年7月7日
    050
  • Redis系列:Redis持久化机制与Redis事务

    Redis 是个基于内存的数据库。那服务一旦宕机,内存中数据必将全部丢失。所以丢失数据的恢复对于 Redis 是十分重要的,我们首先想到是可以从数据库中恢复,但是在由 Redis …

    人工智能 2023年6月27日
    067
  • convE模型

    文章目录 * – 《convolutional 2D knowledge graph embedding》论文解读 – + 研究问题 + 写作动机(moti…

    人工智能 2023年7月13日
    062
  • 洛谷 P4015 运输问题(费用流)

    题目描述 W W W 公司有 m m m 个仓库和 n n n 个零售商店。第 i i i 个仓库有 a i a_i a i ​ 个单位的货物;第 j j j 个零售商店需要 b …

    人工智能 2023年6月29日
    055
  • Keras 中的循环神经网络 (RNN)

    简介 循环神经网络 (RNN) 是一类神经网络,它们在序列数据(如时间序列或自然语言)建模方面非常强大。 简单来说,RNN 层会使用 ​ ​for&#…

    人工智能 2023年5月24日
    0120
  • Python中的时序分析工具包推荐(2)

    导读 在前期推文中介绍了时序分析的三个工具包,分别侧重于时序特征工程、基于sklearn的时序建模和更为高级的时序建模工具。今天,本篇再来介绍4个时序分析好用的工具包:Prophe…

    人工智能 2023年7月16日
    075
  • Android从零开始配置opencv+tensorflow进行人脸识别+口罩识别(一:opencv配置部分)

    前排提示 现在的opencv和dlib导入在github上已经有导入完成的项目了,如果不是为了学习而用的话,直接去github克隆,方便快捷 快速导入opencv到项目中 点击后会…

    人工智能 2023年5月23日
    069
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球