MyBatis 是一个非常流行的持久层框架,它提供了简单且强大的功能来处理数据库操作。在 MyBatis 中,实现一对一、一对多和多对多的关系映射是非常常见的需求。下面将分别介绍这三种关系的实现方法。
一对一 (One-to-One)
假设有两个表:User
表和 Address
表,每个用户有一个地址。User
表的结构如下:
CREATE TABLE User (
id INT PRIMARY KEY,
name VARCHAR(50),
address_id INT
);
Address
表的结构如下:
CREATE TABLE Address (
id INT PRIMARY KEY,
street VARCHAR(100),
city VARCHAR(50)
);
在映射文件中,可以使用 <association>
来实现一对一的关系。首先定义好实体类:
public class User {
private int id;
private String name;
private Address address;
// getters and setters
}
public class Address {
private int id;
private String street;
private String city;
// getters and setters
}
然后在 MyBatis 的映射 XML 文件中配置关联关系:
<resultMap id="userResultMap" type="User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<association property="address" javaType="Address">
<id property="id" column="address_id"/>
<result property="street" column="street"/>
<result property="city" column="city"/>
</association>
</resultMap>
<select id="getUserById" resultMap="userResultMap">
SELECT u.id, u.name, a.id AS address_id, a.street, a.city
FROM User u
JOIN Address a ON u.address_id = a.id
WHERE u.id = #{id}
</select>
一对多 (One-to-Many)
假设有两个表:Customer
和 Order
,一个客户有多个订单。Customer
表的结构如下:
CREATE TABLE Customer (
id INT PRIMARY KEY,
name VARCHAR(50)
);
Order
表的结构如下:
CREATE TABLE Order (
id INT PRIMARY KEY,
customer_id INT,
product_name VARCHAR(50)
);
对应的实体类如下:
public class Customer {
private int id;
private String name;
private List<Order> orders;
// getters and setters
}
public class Order {
private int id;
private int customerId;
private String productName;
// getters and setters
}
在 MyBatis 的映射 XML 文件中配置关联关系:
<resultMap id="customerResultMap" type="Customer">
<id property="id" column="id"/>
<result property="name" column="name"/>
<collection property="orders" ofType="Order">
<id property="id" column="order_id"/>
<result property="customerId" column="customer_id"/>
<result property="productName" column="product_name"/>
</collection>
</resultMap>
<select id="getCustomerById" resultMap="customerResultMap">
SELECT c.id, c.name, o.id AS order_id, o.customer_id, o.product_name
FROM Customer c
LEFT JOIN Order o ON c.id = o.customer_id
WHERE c.id = #{id}
</select>
多对多 (Many-to-Many)
假设有三个表:Student
、Course
和 StudentCourse
(用于表示学生和课程的多对多关系)。Student
表的结构如下:
CREATE TABLE Student (
id INT PRIMARY KEY,
name VARCHAR(50)
);
Course
表的结构如下:
CREATE TABLE Course (
id INT PRIMARY KEY,
name VARCHAR(50)
);
StudentCourse
表的结构如下:
CREATE TABLE StudentCourse (
student_id INT,
course_id INT,
PRIMARY KEY (student_id, course_id)
);
对应的实体类如下:
public class Student {
private int id;
private String name;
private List<Course> courses;
// getters and setters
}
public class Course {
private int id;
private String name;
// getters and setters
}
在 MyBatis 的映射 XML 文件中配置关联关系:
<resultMap id="studentResultMap" 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="name" column="course_name"/>
</collection>
</resultMap>
<select id="getStudentById" resultMap="studentResultMap">
SELECT s.id, s.name, c.id AS course_id, c.name AS course_name
FROM Student s
LEFT JOIN StudentCourse sc ON s.id = sc.student_id
LEFT JOIN Course c ON sc.course_id = c.id
WHERE s.id = #{id}
</select>
通过以上配置,即可在 MyBatis 中实现一对一、一对多和多对多的关系映射。根据具体的业务需求和数据库设计,这些配置可能需要进行调整。