使用MyBatisPlus实现一对多

使用MyBatisPlus实现一对多

一、创建数据库

/*
 Navicat Premium Data Transfer

 Source Server         : localhost_3306
 Source Server Type    : MySQL
 Source Server Version : 80027
 Source Host           : localhost:3306
 Source Schema         : school

 Target Server Type    : MySQL
 Target Server Version : 80027
 File Encoding         : 65001

 Date: 14/04/2022 21:05:24
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for class
-- ----------------------------
DROP TABLE IF EXISTS `class`;
CREATE TABLE `class`  (
  `cid` int NOT NULL,
  `cname` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `did` int NULL DEFAULT NULL,
  PRIMARY KEY (`cid`) USING BTREE,
  INDEX `fk_did`(`did`) USING BTREE,
  CONSTRAINT `fk_did` FOREIGN KEY (`did`) REFERENCES `dept` (`did`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of class
-- ----------------------------
INSERT INTO `class` VALUES (1, 'cd01', 1);
INSERT INTO `class` VALUES (2, 'cd02', 1);
INSERT INTO `class` VALUES (3, 'cd03', 2);
INSERT INTO `class` VALUES (4, 'cd04', 2);

-- ----------------------------
-- Table structure for dept
-- ----------------------------
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept`  (
  `did` int NOT NULL,
  `dname` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`did`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of dept
-- ----------------------------
INSERT INTO `dept` VALUES (1, 'd01');
INSERT INTO `dept` VALUES (2, 'd02');

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `sid` int NOT NULL,
  `sname` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `cid` int NULL DEFAULT NULL,
  PRIMARY KEY (`sid`) USING BTREE,
  INDEX `fk_cid`(`cid`) USING BTREE,
  CONSTRAINT `fk_cid` FOREIGN KEY (`cid`) REFERENCES `class` (`cid`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (1, 'sc01', 1);
INSERT INTO `student` VALUES (2, 'sc02', 1);
INSERT INTO `student` VALUES (3, 'sc03', 1);
INSERT INTO `student` VALUES (4, 'sc04', 2);
INSERT INTO `student` VALUES (5, 'sc05', 2);
INSERT INTO `student` VALUES (6, 'sc06', 2);
INSERT INTO `student` VALUES (7, 'sc07', 3);
INSERT INTO `student` VALUES (8, 'sc08', 3);
INSERT INTO `student` VALUES (9, 'sc09', 4);
INSERT INTO `student` VALUES (10, 'sc10', 4);

SET FOREIGN_KEY_CHECKS = 1;

二、添加依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.79</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.1</version>
    </dependency>
</dependencies>

三、创建application.yml文件

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/school?characterEncoding=utf8
    username: root
    password: 123456

四、创建实体类

package com.example.demoexcel.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Dept {

    private Integer did;

    private String dname;

    @TableField(exist = false)
    private List<Class> classList;

}
package com.example.demoexcel.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Class {

    private Integer cid;

    private String cname;

    @TableField(exist = false)
    private List<Student> studentList;
}
package com.example.demoexcel.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {

    private Integer sid;

    private String sname;

}

五、创建Dao

package com.example.demoexcel.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demoexcel.entity.Dept;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface DeptDao extends BaseMapper<Dept> {
}
package com.example.demoexcel.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demoexcel.entity.Class;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface ClassDao extends BaseMapper<Class> {
}
package com.example.demoexcel.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demoexcel.entity.Student;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface StudentDao extends BaseMapper<Student> {
}

六、测试

@Autowired
    private DeptDao deptDao;

    @Autowired
    private ClassDao classDao;

    @Autowired
    private StudentDao studentDao;

    @Test
    void test01(){
        List<Dept> depts = deptDao.selectList(null);

        List<Dept> deptList = new ArrayList<>();

        for (Dept dept : depts) {
            //1、根据部门ID查看班级信息
            List<Class> classList = classDao.selectList(new QueryWrapper<Class>().eq("did", dept.getDid()));
            dept.setClassList(classList);
            //2、根据班级ID查看学生信息
            for (Class aClass : classList) {
                List<Student> studentList = studentDao.selectList(new QueryWrapper<Student>().eq("cid", aClass.getCid()));
                aClass.setStudentList(studentList);
            }
            deptList.add(dept);
        }

        System.out.println(JSON.toJSONString(deptList));

    }
[
    {
        "classList":[
            {
                "cid":1,
                "cname":"cd01",
                "studentList":[
                    {
                        "sid":1,
                        "sname":"sc01"
                    },
                    {
                        "sid":2,
                        "sname":"sc02"
                    },
                    {
                        "sid":3,
                        "sname":"sc03"
                    }
                ]
            },
            {
                "cid":2,
                "cname":"cd02",
                "studentList":[
                    {
                        "sid":4,
                        "sname":"sc04"
                    },
                    {
                        "sid":5,
                        "sname":"sc05"
                    },
                    {
                        "sid":6,
                        "sname":"sc06"
                    }
                ]
            }
        ],
        "did":1,
        "dname":"d01"
    },
    {
        "classList":[
            {
                "cid":3,
                "cname":"cd03",
                "studentList":[
                    {
                        "sid":7,
                        "sname":"sc07"
                    },
                    {
                        "sid":8,
                        "sname":"sc08"
                    }
                ]
            },
            {
                "cid":4,
                "cname":"cd04",
                "studentList":[
                    {
                        "sid":9,
                        "sname":"sc09"
                    },
                    {
                        "sid":10,
                        "sname":"sc10"
                    }
                ]
            }
        ],
        "did":2,
        "dname":"d02"
    }
]
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
MyBatis Plus 中,实现一对多查询可以使用注解 `@TableField` 和 `@TableId` 进行配置。以下是一个示例代码: 首先,假设有两个实体类 `User` 和 `Order`,它们之间是一对多的关系,一个用户可以有多个订单。 User.java: ```java public class User { @TableId private Long id; private String name; // 一对多关系,一个用户可以有多个订单 @TableField(exist = false) private List<Order> orders; // 省略 getter 和 setter 方法 } ``` Order.java: ```java public class Order { @TableId private Long id; private String orderNo; private Long userId; // 订单所属的用户ID // 省略 getter 和 setter 方法 } ``` 接下来,在 Mapper 接口中添加方法 `selectUserWithOrders`,该方法使用 MyBatis Plus 的注解 `@Select` 和 `@Results` 来进行一对多查询的配置: UserMapper.java: ```java public interface UserMapper extends BaseMapper<User> { @Select("SELECT * FROM user WHERE id = #{id}") @Results({ @Result(property = "id", column = "id"), @Result(property = "name", column = "name"), @Result(property = "orders", column = "id", many = @Many(select = "com.example.mapper.OrderMapper.selectOrdersByUserId")) }) User selectUserWithOrders(Long id); } ``` 在上述代码中,`@Result` 注解用于配置属性和列的映射关系,`many` 属性用于指定一对多关系的查询方法。 最后,在 OrderMapper 接口中添加方法 `selectOrdersByUserId`,用于查询指定用户ID下的所有订单: OrderMapper.java: ```java public interface OrderMapper extends BaseMapper<Order> { @Select("SELECT * FROM order WHERE user_id = #{userId}") List<Order> selectOrdersByUserId(Long userId); } ``` 这样,通过调用 `selectUserWithOrders` 方法即可实现一对多查询,会返回指定用户ID下的用户信息以及对应的订单列表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值