三张表之间的关系

在这里插入图片描述

需求

一对多:查询某个 User 以及该User拥有的 Cars
多对多:查询全部 User 以及每个User拥有的 Cars

User实体类

package com.neu.mybatisplus.entity;

import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.io.Serializable;
import java.util.List;

/**
 * (User)表实体类
 *
 * @author makejava
 * @since 2022-07-06 12:05:20
 */
@SuppressWarnings("serial")
@Data
public class User extends Model<User> {

    private Long id;

    private String about;

    private String password;

    private String username;

    private List<Car> myCars;


    /**
     * 获取主键值
     *
     * @return 主键值
     */
    @Override
    protected Serializable pkVal() {
        return this.id;
    }
    }

Car实体类

package com.neu.mybatisplus.entity;

import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;

import java.io.Serializable;

/**
 * (Car)表实体类
 *
 * @author makejava
 * @since 2022-07-06 12:05:05
 */
@SuppressWarnings("serial")
@Data
public class Car extends Model<Car> {

    private Long id;

    private String brand;

    private String price;



    /**
     * 获取主键值
     *
     * @return 主键值
     */
    @Override
    protected Serializable pkVal() {
        return this.id;
    }
    }

UserDao接口

package com.neu.mybatisplus.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.neu.mybatisplus.entity.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

/**
 * (User)表数据库访问层
 *
 * @author makejava
 * @since 2022-07-06 12:05:20
 */
@Mapper
public interface UserDao extends BaseMapper<User> {


    @Select("select * from user where user.id = #{id}")
    @Results(
            @Result(
                    property = "myCars", column = "id",
                    javaType = List.class,
                    many = @Many(select = "com.neu.mybatisplus.dao.CarDao.returnCars")
            )
    )
    User selectUserAndHisCars(@Param("id") String id);

}

CarDao接口

package com.neu.mybatisplus.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.neu.mybatisplus.entity.Car;
import org.apache.ibatis.annotations.*;

import java.util.List;

/**
 * (Car)表数据库访问层
 *
 * @author makejava
 * @since 2022-07-06 12:05:05
 */

@Mapper
public interface CarDao extends BaseMapper<Car> {


    @Select("select car.* from user_car,car where user_car.user_id = #{user_id} and car.id = user_car.car_id")
    List<Car> returnCars(@Param("user_id") String id);


}

user数据表

-- auto-generated definition
create table user
(
    id       bigint auto_increment
        primary key,
    about    varchar(255) null,
    password varchar(255) null,
    username varchar(255) null
);

user数据表中的部分数据:
在这里插入图片描述

car数据表

-- auto-generated definition
create table car
(
    id    bigint auto_increment
        primary key,
    brand varchar(255) null,
    price varchar(255) null
);

car数据表中的部分数据
在这里插入图片描述

user_car中间表

-- auto-generated definition
create table user_car
(
    user_id bigint not null,
    car_id  bigint not null,
    constraint UK_poow88j0bwa68w98qkk69h4ug
        unique (car_id),
    constraint FKbiwwtu12d1d614gd5b35tef4x
        foreign key (car_id) references car (id),
    constraint FKgs1lsnqcl7dmnbsvc1m8wuy6h
        foreign key (user_id) references user (id)
);

user_car中间表中的数据
在这里插入图片描述

参数详解

@Select(“select * from user where user.id = #{id}”) 查询指定id的用户
@Results: 表示映射结果集
@Result :子查询 的结果写入到 主查询 的属性
property : 主查询返回值中的哪个字段,需要注入子查询的结果
column : 主查询中传递给子查询的参数
javaType: 子查询中的返回值类型
@Many: 一对多、多对多使用该注解指定子查询接口方法
many = @Many(select = “com.neu.mybatisplus.dao.CarDao.returnCars”) 指定子查询接口方法
一句话版本:用column作为子查询的参数,将子查询返回值写入property

主查询:

@Select("select * from user where user.id = #{id}")
    @Results(
            @Result(
                    property = "myCars", column = "id",
                    javaType = List.class,
                    many = @Many(select = "com.neu.mybatisplus.dao.CarDao.returnCars")
            )
    )
    User selectUserAndHisCars(@Param("id") String id);

子查询:

  @Select("select car.* from user_car,car where user_car.user_id = #{user_id} and car.id = user_car.car_id")
  List<Car> returnCars(@Param("user_id") String id);

postman测试成功

在这里插入图片描述

多对多示例: (与一对多同理)

    @Select("select * from user")
    @Results(
            @Result(
                    property = "myCars", column = "id",
                    javaType = List.class,
                    many = @Many(select = "com.neu.mybatisplus.dao.CarDao.returnCars")
            )
    )
    List<User> selectAllUserAndTheirCars();

在这里插入图片描述

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐