mybatis-plus 注解 通过中间表进行一对多、多对多查询(三表)
通过mybatis-plus注解进行一对多、多对多联查
·
mybatis-plus 注解 通过中间表进行一对多、多对多查询
三张表之间的关系
需求
一对多:查询某个 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();
更多推荐
已为社区贡献1条内容
所有评论(0)