mybatis学习五-mybatis的多表联合查询

1. 一对一的关系

首先先看数据库
tb_user
mybatis学习五-mybatis的多表联合查询_第1张图片
tb_orders
mybatis学习五-mybatis的多表联合查询_第2张图片
执行这条sql:
mybatis学习五-mybatis的多表联合查询_第3张图片
也就是查询所有的订单, 并每一个订单都联系上用户数据, 并再一次附上订单的id
也就是说, 从后面看, 就是每个订单id对应的用户信息, 从前面看就是每个订单id的订单信息
为什么说这里是一对一的关系呢?
因为, 订单是副表, 这里查询的是tb_orders, 每条订单只能有一个用户

以上是数据库中的多表联合查询, 那么在代码中应该怎么实现这个多表联合查询呢?

表的实体类

package com.itdong.domain;

import java.util.Date;

public class Orders {
    private int id;
    private Date ordertime;
    private double total;
    //不要这么写
    //private int uid;
    private User user; //表明这这个订单属于那个用户

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Date getOrdertime() {
        return ordertime;
    }

    public void setOrdertime(Date ordertime) {
        this.ordertime = ordertime;
    }

    public double getTotal() {
        return total;
    }

    public void setTotal(double total) {
        this.total = total;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Override
    public String toString() {
        return "Orders{" +
                "id=" + id +
                ", ordertime=" + ordertime +
                ", total=" + total +
                ", user=" + user +
                '}';
    }
}

为什么这个的属性不是uid, 而是user呢, 因为实际上我们开发时光findAll订单表并没有意义, 而是要多表联合查找, 也就是查询订单表时要联合每一条订单的用户信息, 所以订单表的实体类这里属性不能只是uid, 要user, 因为user里就是用户所有信息
但是这样有出现一个问题, 就是说用我们之前学习的知识来配置时, findAll执行完是这样的, user全是null
mybatis学习五-mybatis的多表联合查询_第4张图片
为什么呢?
因为我们配置OrdersMapper.xml映射文件是时,

<select id="findAll" resultType="com.itdong.domain.Orders">
    SELECT * , o.id oid FROM tb_orders o, tb_user u WHERE o.uid = u.id;
</select>

resultType等于的是"com.itdong.domain.Orders"
也就是说, 对于多表查询操作来说, 查询出来的结果往往有其他的表的对象, 例如本例的订单表联合用户表的查询, domain.Orders这个Bean实例中就有一个User属性, 但是mysql中只能查询出字段,并不能帮着将联合查询出来的User表的字段封装成一个对象存并作为属性放进订单表中。
这个时候就要使用框架来配置一个适合这次多表联合查询的结果集。
也就是配置一个resultMap.
mybatis学习五-mybatis的多表联合查询_第5张图片
除了以上的方法封装User对象
还有一种方法
mybatis学习五-mybatis的多表联合查询_第6张图片

2. 一对多的多表联合查询

订单表联合用户表是一对一,毕竟一个订单只能有一个用户,但是如果是反过来,使用用户联合订单表来查询,那么就是一对多的关系,一个用户可以有0和无穷多个订单
mybatis学习五-mybatis的多表联合查询_第7张图片
这里可以使用list做属性
mybatis学习五-mybatis的多表联合查询_第8张图片
mybatis学习五-mybatis的多表联合查询_第9张图片

2. 一对多的多表联合查询

mybatis学习五-mybatis的多表联合查询_第10张图片
案例:用户表和角色表的关系就是多对多的关系
一个用户可以用多个角色, 一个角色有多个用户
应用场景:查询用户的同时查询出该用户的所有角色

mybatis学习五-mybatis的多表联合查询_第11张图片
mybatis学习五-mybatis的多表联合查询_第12张图片
mybatis学习五-mybatis的多表联合查询_第13张图片
mybatis学习五-mybatis的多表联合查询_第14张图片
多表连接的sql语法
在这里插入图片描述
很明显, 这里的语句是使用的内连接,并且使用中间表来表达多对多的关系,只有在中间表中有数据的用户数据和角色数据会被查询出来。
mybatis学习五-mybatis的多表联合查询_第15张图片

你可能感兴趣的:(ssm层,java)