下面是详细讲解“MyBatis学习笔记(二)之关联关系”的完整攻略。
在MyBatis中,关联关系可以通过一对一、一对多、多对多的方式进行映射。接下来我们来讲解一下各种关联关系的应用。
一对一的关联映射可以映射为实体类中的JavaBean,也可以映射为另外一个实体类。在映射为实体类的JavaBean时,需要在JavaBean中添加对应的属性,然后在MyBatis中进行映射。
例如我们有如下的数据库结构:
CREATE TABLE student (
id INT PRIMARY KEY,
name VARCHAR(20),
card_id INT
);
CREATE TABLE card (
id INT PRIMARY KEY,
number VARCHAR(20),
student_id INT
);
其中student
表和card
表是一对一的关联关系,我们可以定义两个对应的JavaBean:Student
和Card
。在Student
中添加一个Card
类型的属性,然后在MyBatis的Mapper文件中进行映射即可:
public class Student {
private Integer id;
private String name;
private Card card;
// 省略getter和setter方法
}
public class Card {
private Integer id;
private String number;
private Integer studentId;
// 省略getter和setter方法
}
在Mapper文件中使用association
元素进行映射,如下所示:
<select id="getStudentById" resultType="com.example.entity.Student">
SELECT s.*, c.*
FROM student s
LEFT JOIN card c ON s.card_id = c.id
WHERE s.id = #{id}
</select>
其中,association
元素的property
属性值为属性名,javaType
属性值为JavaBean的类型。
一对多的关联映射可以映射为实体类中的集合属性,例如Java中的List
、Set
等集合类型。在映射为集合属性时,需要创建第三张关联表,这张表的设计要符合第三范式。
例如我们有如下的数据库结构:
CREATE TABLE user (
id INT PRIMARY KEY,
name VARCHAR(20)
);
CREATE TABLE order (
id INT PRIMARY KEY,
name VARCHAR(20),
user_id INT
);
CREATE TABLE user_order (
user_id INT,
order_id INT
);
其中user
表和order
表是一对多的关联关系,我们可以定义两个对应的JavaBean:User
和Order
。在User
中添加一个List<Order>
类型的属性,然后在MyBatis的Mapper文件中进行映射即可:
public class User {
private Integer id;
private String name;
private List<Order> orders;
// 省略getter和setter方法
}
public class Order {
private Integer id;
private String name;
private Integer userId;
// 省略getter和setter方法
}
创建第三张关联表时,我们需要在User
和Order
中添加一个List<Integer>
类型的属性进行映射,例如在User
中添加一个List<Integer>
类型的orderIds
属性:
public class User {
private Integer id;
private String name;
private List<Order> orders;
private List<Integer> orderIds;
// 省略getter和setter方法
}
在Mapper文件中使用collection
元素进行映射,如下所示:
<select id="getUserById" resultType="com.example.entity.User">
SELECT u.*, o.*, uo.user_id, uo.order_id
FROM user u
LEFT JOIN user_order uo ON u.id = uo.user_id
LEFT JOIN `order` o ON o.id = uo.order_id
WHERE u.id = #{id}
</select>
其中,collection
元素的property
属性值为集合属性的属性名,javaType
属性值为JavaBean的类型,select
属性值为查询关联表的SQL语句。
多对多的关联映射和一对多类似,需要创建第三张关联表。不同的是,在映射为实体类中的集合属性时,我们需要在第三张关联表中对应两个实体类的主键。
例如我们有如下的数据库结构:
CREATE TABLE tag (
id INT PRIMARY KEY,
name VARCHAR(20)
);
CREATE TABLE article (
id INT PRIMARY KEY,
title VARCHAR(20),
content TEXT
);
CREATE TABLE article_tag (
article_id INT,
tag_id INT
);
其中tag
表和article
表是多对多的关联关系,我们可以定义两个对应的JavaBean:Tag
和Article
。在Article
中添加一个List<Tag>
类型的属性,然后在MyBatis的Mapper文件中进行映射即可:
public class Article {
private Integer id;
private String title;
private String content;
private List<Tag> tags;
// 省略getter和setter方法
}
public class Tag {
private Integer id;
private String name;
// 省略getter和setter方法
}
创建第三张关联表时,我们需要在Article
和Tag
中添加对应的主键映射属性,例如在Article
中添加一个List<Integer>
类型的tagIds
属性:
public class Article {
private Integer id;
private String title;
private String content;
private List<Tag> tags;
private List<Integer> tagIds;
// 省略getter和setter方法
}
在Mapper文件中使用collection
元素进行映射,如下所示:
<select id="getArticleById" resultType="com.example.entity.Article">
SELECT a.*, t.*, at.article_id, at.tag_id
FROM article a
LEFT JOIN article_tag at ON a.id = at.article_id
LEFT JOIN tag t ON t.id = at.tag_id
WHERE a.id = #{id}
</select>
其中,collection
元素的property
属性值为集合属性的属性名,javaType
属性值为JavaBean的类型,select
属性值为查询关联表的SQL语句。
以上就是MyBatis关联关系的完整攻略,包括一对一、一对多、多对多的映射实现。如果你还有其他问题,请查看MyBatis官方文档或者其他相关资料。
本文链接:http://task.lmcjl.com/news/7964.html