在 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
接口。
- 实体类
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
}
- Mapper 接口
java
public interface UserMapper {
List<User> findUserWithDetail();
}
- 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 文件书写
- 实体类
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
}
- Mapper 接口
java
public interface OrderMapper {
List<Order> findOrderWithItems();
}
- 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 文件书写
- 实体类
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
}
- Mapper 接口
java
public interface StudentMapper {
List<Student> findStudentWithCourses();
}
- 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 文件的配置。