关键词

MyBatis学习笔记(二)之关联关系

下面是详细讲解“MyBatis学习笔记(二)之关联关系”的完整攻略。

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:StudentCard。在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中的ListSet等集合类型。在映射为集合属性时,需要创建第三张关联表,这张表的设计要符合第三范式。

关联映射示例

例如我们有如下的数据库结构:

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:UserOrder。在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方法
}

创建第三张关联表时,我们需要在UserOrder中添加一个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:TagArticle。在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方法
}

创建第三张关联表时,我们需要在ArticleTag中添加对应的主键映射属性,例如在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

展开阅读全文