SpringBoot+MyBatis实现MySQL表关系查询

在 MySQL 中,一对一、一对多、多对多是常见的表关系,在 Spring Boot 项目中结合 MyBatis 可以通过 XML 文件配置 SQL 来实现查询操作,下面为你详细介绍:

一对一查询

MySQL 实现

一对一关系中,通常在从表中添加主表的主键作为外键,并设置为唯一约束。例如,用户表 user 和用户详情表 user_detail 是一对一关系:

sql

-- 用户表
CREATE TABLE user (
  id INT PRIMARY KEY AUTO_INCREMENT,
  username VARCHAR(50) NOT NULL,
  age INT
);

-- 用户详情表
CREATE TABLE user_detail (
  id INT PRIMARY KEY AUTO_INCREMENT,
  address VARCHAR(100),
  phone VARCHAR(20),
  user_id INT UNIQUE,
  FOREIGN KEY (user_id) REFERENCES user(id)
);

查询用户及其详情可以使用 INNER JOIN 或 LEFT JOIN,以下是使用 LEFT JOIN 的示例:

sql

SELECT 
  u.id, 
  u.username, 
  u.age, 
  ud.address, 
  ud.phone 
FROM user u
LEFT JOIN user_detail ud ON u.id = ud.user_id;
Spring Boot 项目中 XML 文件书写

假设我们有 User 和 UserDetail 两个实体类,以及对应的 UserMapper 接口。

  1. 实体类

java

// User.java
public class User {
    private Integer id;
    private String username;
    private Integer age;
    private UserDetail userDetail;
    // 省略getter和setter
}

// UserDetail.java
public class UserDetail {
    private Integer id;
    private String address;
    private String phone;
    // 省略getter和setter
}

  1. Mapper 接口

java

public interface UserMapper {
    List<User> findUserWithDetail();
}

  1. Mapper XML 文件(假设路径为 resources/mapper/UserMapper.xml

xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper">
    <resultMap id="userWithDetailResultMap" type="User">
        <id property="id" column="id"/>
        <result property="username" column="username"/>
        <result property="age" column="age"/>
        <association property="userDetail" javaType="UserDetail">
            <id property="id" column="detail_id"/>
            <result property="address" column="address"/>
            <result property="phone" column="phone"/>
        </association>
    </resultMap>
    <select id="findUserWithDetail" resultMap="userWithDetailResultMap">
        SELECT 
            u.id, 
            u.username, 
            u.age, 
            ud.id as detail_id,
            ud.address, 
            ud.phone 
        FROM user u
        LEFT JOIN user_detail ud ON u.id = ud.user_id;
    </select>
</mapper>

一对多查询

MySQL 实现

在一对多关系中,多的一方表中添加一的一方表的主键作为外键。比如订单表 orders 和订单项表 order_item 是一对多关系:

sql

-- 订单表
CREATE TABLE orders (
  id INT PRIMARY KEY AUTO_INCREMENT,
  order_no VARCHAR(20) NOT NULL,
  create_time DATETIME
);

-- 订单项表
CREATE TABLE order_item (
  id INT PRIMARY KEY AUTO_INCREMENT,
  product_name VARCHAR(50),
  price DECIMAL(10,2),
  order_id INT,
  FOREIGN KEY (order_id) REFERENCES orders(id)
);

查询订单及其所有订单项可以使用 LEFT JOIN

sql

SELECT 
  o.id, 
  o.order_no, 
  o.create_time, 
  oi.product_name, 
  oi.price 
FROM orders o
LEFT JOIN order_item oi ON o.id = oi.order_id;
Spring Boot 项目中 XML 文件书写
  1. 实体类

java

// Order.java
public class Order {
    private Integer id;
    private String orderNo;
    private Date createTime;
    private List<OrderItem> orderItems;
    // 省略getter和setter
}

// OrderItem.java
public class OrderItem {
    private Integer id;
    private String productName;
    private BigDecimal price;
    // 省略getter和setter
}

  1. Mapper 接口

java

public interface OrderMapper {
    List<Order> findOrderWithItems();
}

  1. Mapper XML 文件(假设路径为 resources/mapper/OrderMapper.xml

xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.OrderMapper">
    <resultMap id="orderWithItemsResultMap" type="Order">
        <id property="id" column="id"/>
        <result property="orderNo" column="order_no"/>
        <result property="createTime" column="create_time"/>
        <collection property="orderItems" ofType="OrderItem">
            <id property="id" column="item_id"/>
            <result property="productName" column="product_name"/>
            <result property="price" column="price"/>
        </collection>
    </resultMap>
    <select id="findOrderWithItems" resultMap="orderWithItemsResultMap">
        SELECT 
            o.id, 
            o.order_no, 
            o.create_time, 
            oi.id as item_id,
            oi.product_name, 
            oi.price 
        FROM orders o
        LEFT JOIN order_item oi ON o.id = oi.order_id;
    </select>
</mapper>

多对多查询

MySQL 实现

多对多关系需要借助中间表。例如学生表 student 和课程表 course 是多对多关系,中间表为 student_course

sql

-- 学生表
CREATE TABLE student (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL
);

-- 课程表
CREATE TABLE course (
  id INT PRIMARY KEY AUTO_INCREMENT,
  course_name VARCHAR(50) NOT NULL
);

-- 中间表
CREATE TABLE student_course (
  id INT PRIMARY KEY AUTO_INCREMENT,
  student_id INT,
  course_id INT,
  FOREIGN KEY (student_id) REFERENCES student(id),
  FOREIGN KEY (course_id) REFERENCES course(id)
);

查询学生及其所选课程可以使用 JOIN 操作:

sql

SELECT 
  s.id, 
  s.name, 
  c.id as course_id, 
  c.course_name 
FROM student s
JOIN student_course sc ON s.id = sc.student_id
JOIN course c ON sc.course_id = c.id;
Spring Boot 项目中 XML 文件书写
  1. 实体类

java

// Student.java
public class Student {
    private Integer id;
    private String name;
    private List<Course> courses;
    // 省略getter和setter
}

// Course.java
public class Course {
    private Integer id;
    private String courseName;
    // 省略getter和setter
}

  1. Mapper 接口

java

public interface StudentMapper {
    List<Student> findStudentWithCourses();
}

  1. Mapper XML 文件(假设路径为 resources/mapper/StudentMapper.xml

xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.StudentMapper">
    <resultMap id="studentWithCoursesResultMap" type="Student">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <collection property="courses" ofType="Course">
            <id property="id" column="course_id"/>
            <result property="courseName" column="course_name"/>
        </collection>
    </resultMap>
    <select id="findStudentWithCourses" resultMap="studentWithCoursesResultMap">
        SELECT 
            s.id, 
            s.name, 
            c.id as course_id, 
            c.course_name 
        FROM student s
        JOIN student_course sc ON s.id = sc.student_id
        JOIN course c ON sc.course_id = c.id;
    </select>
</mapper>

在 Spring Boot 项目中使用 MyBatis 时,还需要在 application.yml 中配置数据库连接信息以及 MyBatis 的相关配置,例如:

yaml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/your_database?serverTimezone=UTC
    username: root
    password: your_password
mybatis:
  mapper-locations: classpath:/mapper/*.xml
  type-aliases-package: com.example.demo.entity

这样就完成了在 MySQL 中三种关系的查询以及在 Spring Boot 项目中 XML 文件的配置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值