SpringBoot使用Mybatis注解进行一对多和多对多查询(2)

SpringBoot使用Mybatis注解进行一对多和多对多查询

GitHub的完整示例项目地址kingboy-springboot-data

一、模拟的业务查询

系统中的用户user都有唯一对应的地址信息address,每个用户可以有多量车car,类似如下结构

|-- user
    |-- address
    |-- carList
        |-- car1
        |-- car2

  

二、对应的实体类如下

/省略setter/getter

public class Address {
    private Long id;
    private String province;
    private String city;
}

public class Car {
    private Long id;
    private String color;
    private String name;
    //用户id
    private Long userId;
}

public class User {
    private Long id;
    //地址信息,和用户是一对一的关系
    private Address address;
    //地址id
    private Long addressId;
    //用户拥有的车,和用户是一对多的关系
    private List<Car> cars;
}

三、对应的建表语句和模拟数据如下

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nick_name` varchar(50) DEFAULT NULL,
  `address_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `address` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `province` varchar(50) DEFAULT NULL,
  `city` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `car` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `color` varchar(50) DEFAULT NULL,
  `name` varchar(50) DEFAULT NULL,
  `user_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO
    `user`
VALUES
    (‘1‘, ‘baby‘, ‘1‘),
    (‘2‘, ‘kingboy‘, ‘2‘),
    (‘3‘, ‘boy‘, ‘3‘),
    (‘4‘, ‘kingbaby‘, ‘4‘);

INSERT INTO
    `address`
VALUES
    (‘1‘, ‘北京‘, ‘北京‘),
    (‘2‘, ‘天津‘, ‘天津‘),
    (‘3‘, ‘安徽‘, ‘宿州‘),
    (‘4‘, ‘广东‘, ‘广州‘);

INSERT INTO
    `car`
VALUES
    (‘1‘, ‘green‘, ‘路虎‘, ‘1‘),
    (‘2‘, ‘white‘, ‘奔驰‘, ‘2‘),
    (‘3‘, ‘blue‘, ‘玛莎拉蒂‘, ‘4‘),
    (‘4‘, ‘yellow‘, ‘兰博基尼‘, ‘4‘);

四、@One一对一映射

以获取用户的唯一地址为例,首先我们定义一个根据地址id查询地址的查询方法

public interface AddressRepository {
    /**
     * 根据地址id查询地址
     */
    @Select("SELECT * FROM `address` WHERE id = #{id}")
    Address findAddressById(Long id);
}

然后我们定义一个根据用户id查询用户的方法

public interface UserRepository {
    @Select("SELECT * FROM `user` where id = #{id}")
    User findUserWithAddress(Long id);
}

这个时候我们查询出来的user对象中的address属性是空的,和address并没有任何关联。 
那么我们要把user中的addressId传递给AddressRepository的查询地址的方法, 
然后把查询出的地址对象address赋值给user的address属性,那么我们怎么做呢?

public interface UserRepository {
    @Select("SELECT * FROM `user` where id = #{id}")
    @Results({
            @Result(property = "address", column = "address_id",
                    one = @One(select = "com.kingboy.repository.address.AddressRepository.findAddressById"))
    })
    User findUserWithAddress(Long id);
}

我们要使用@Resutl注解对返回的结果进行配置, 
- property = “address”, 表示要将返回的查询结果赋值给user的address属性 
- column = “address_id” 是指将user表中的address_id作为com.kingboy.repository.address.AddressRepository.findAddressById的查询参数 
- one 表示这是一个一对一的查询 
- @One(select = “方法全路径) 表示我们调用的方法

五、@Many一对多查询

以获取用户拥有的所有车car为例,首先我们定义一个根据用户id查询车的查询方法

public interface CarRepository {
    /**
     * 根据用户id查询所有的车
     */
    @Select("SELECT * FROM `car` WHERE user_id = #{userId}")
    List<Car> findCarByUserId(Long userId);
}

  然后我们定义一个根据用户id查询用户的方法

public interface UserRepository {
    @Select("SELECT * FROM `user` where id = #{id}")
    User findUserWithAddress(Long id);
}

这个时候我们查询出来的user对象中的List属性是空的,和car的查询方法并没有任何关联。 
那么我们要把user中的用户id传递给CarRepository的查询车的方法, 
然后把查询出的集合对象List赋值给user的cars属性,那么我们怎么做呢?

public interface UserRepository {
    /**
     * 查询带有车信息的用户===============演示一对多(关于多对多其实就是两个一对多组成)
     */
    @Select("SELECT * FROM `user` WHERE id = #{id}")
    @Results({
            @Result(property = "cars", column = "id",
                    many = @Many(select = "com.kingboy.repository.car.CarRepository.findCarByUserId"))
    })
    User getUserWithCar(Long id);
}
我们要使用@Resutl注解对返回的结果进行配置,
- property = “cars”, 表示要将返回的查询结果赋值给user的cars属性
- column = “id” 是指将user表中的用户主键id作为com.kingboy.repository.address.CarRepository.findCarByUserId的查询参数
- many 表示这是一个一对多的查询
- @Many(select = “方法全路径) 表示我们调用的方法, 方法参数userId就是上面column指定的列值

六、@One @Many的总结

首先我们统一下概念:查询Address或Car的方法,接下来统称为User的附属查询。

共同点: 
- 无论是一对一还是一对多,都是通过附属查询来实现的,我们需要定义这个附属查询方法。 
- 在主查询方法中通过@One、@Many指定附属查询方法的全路径。 
- 都通过column来传递参数给附属方法。

不同点: 
- 一对一,那么附属方法返回的是一个单独的对象 
- 一对多,那么附属方法返回的是一个对象集合

原文地址:https://www.cnblogs.com/a8457013/p/9074930.html

时间: 2024-10-10 14:17:42

SpringBoot使用Mybatis注解进行一对多和多对多查询(2)的相关文章

毕设的学习(22)springboot使用mybatis注解进行一对多和多对多查询/

https://blog.swing1993.cn/springboot%e4%bd%bf%e7%94%a8mybatis%e6%b3%a8%e8%a7%a3%e8%bf%9b%e8%a1%8c%e4%b8%80%e5%af%b9%e5%a4%9a%e5%92%8c%e5%a4%9a%e5%af%b9%e5%a4%9a%e6%9f%a5%e8%af%a2/ 原文地址:https://www.cnblogs.com/ChangeMyWorld/p/12041488.html

springboot整合mybatis(注解)

springboot整合mybatis(注解) 1.pom.xml: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="ht

Mybatis一对一、一对多、多对多

1.什么是MyBatis? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .2013年11月迁移到Github. iBATIS一词来源于"internet"和"abatis"的组合,是一个基于Java的持久层框架.iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO). MyB

springboot之mybatis注解形式

springboot整合mybatis对数据库进行访问,本实例采用注解的方式,如下: pom.xml文件 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE</version> </parent> <pr

Mybatis 一对一、一对多、多对一

灵感来源于:https://www.cnblogs.com/xdp-gacl/p/4264440.html 转发自:https://www.cnblogs.com/hq233/p/6752335.html 首先  数据库量表之间字段关系(没有主外键) studentmajor表的id字段对应student表里major字段 两个实体类 package com.model; import java.util.Date; public class Student { private Integer

django ORM 一对多, 多对多 查询 以及 结合Tamplate

ORM 表结构:和管理员是多对多, 和 OS 是一对多 class hosts(models.Model): out_ip=models.CharField(max_length=32) in_ip=models.CharField(max_length=32) app=models.ForeignKey(App) login_user=models.CharField(max_length=32) login_pwd=models.CharField(max_length=32) os=mod

阶段3 1.Mybatis_12.Mybatis注解开发_7 Mybatis注解开发一对多的查询配置

一对多的配置,一个用户对应多个账户 需要在Accout里面增加根据用户的uid查询的方法 在user里面指定子一对多的查询配置 换行显示 测试 把这里注销掉.测试延迟加载,代码注释掉后,延迟加载就没有再执行.什么时候用才会去加载数据 测试只执行了 select * 原文地址:https://www.cnblogs.com/wangjunwei/p/11334815.html

mybatis 一对一、一对多、多对一、多对多

本项目是  框架架构是 springboot+mybatis 添加maven依赖 <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis-spring-boot.version}</version></dependenc

Mybatis 一对一,一对多,多对一,多对多的理解

First (一对一) 首先我来说下一对一的理解,就是一个班主任只属于一个班级,一个班级也只能有一个班主任.好吧这就是对于一对一的理解 怎么来实现呢? 这里我介绍了两种方式: 一种是:使用嵌套结果映射来处理重复的联合结果的子集 另一种呢是:通过执行另外一个SQL映射语句来返回预期的复杂类型 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis