【最详细Mybatis关联映射详解】Mybatis关联映射详解

时间:2024-10-22 08:02:51

1、实体关系

实体——数据实体,实体关系指的就是数据与数据之间的关系

例如:用户和角色、房屋和楼栋、订单和商品

实体关系分为以下四种:

一对一关联

实例:人和身份证、学生和学生证、用户基本信息和详情

数据表关系:

  • 主键关联(用户表主键 和详情主键相同时,表示是匹配的数据)

  • 唯一外键关联

一对多关联多对一关联

实例:

  • 一对多: 班级和学生 、 类别和商品、楼栋和房屋

  • 多对一:学生和班级 、 商品和类别

数据表关系:

  • 在多的一端添加外键和一的一段进行关联

多对多关联

实例:用户和角色、角色和权限、房屋和业主、学生和社团、订单和商品

数据表关系:建立第三张关系表添加两个外键分别与两张表主键进行关联

用户(user_id) 用户角色表(uid,rid) 角色(role_id)

2、 创建项目,部署MyBatis框架

  • 创建web项目(maven

    1. <!-- 添加web依赖 -->
    2. <dependency>
    3.    <groupId></groupId>
    4.    <artifactId>jsp-api</artifactId>
    5.    <version>2.0</version>
    6.    <scope>provided</scope>
    7. </dependency>
    8. <dependency>
    9.    <groupId></groupId>
    10.    <artifactId>-api</artifactId>
    11.    <version>4.0.1</version>
    12.    <scope>provided</scope>
    13. </dependency>
  • 部署MyBatis框架

    • 添加依赖

    1. <!-- https:///artifact//mybatis -->
    2. <dependency>
    3.    <groupId></groupId>
    4.    <artifactId>mybatis</artifactId>
    5.    <version>3.4.6</version>
    6. </dependency>
    7. <!-- https:///artifact/mysql/mysql-connector-java -->
    8. <dependency>
    9.    <groupId>mysql</groupId>
    10.    <artifactId>mysql-connector-java</artifactId>
    11.    <version>5.1.47</version>
    12. </dependency>
    • 配置文件

    • 帮助类

    1. public class MyBatisUtil {
    2.    private static SqlSessionFactory factory;
    3.    private static final ThreadLocal<SqlSession> local = new ThreadLocal<SqlSession>();
    4.    static{
    5.        try {
    6.            InputStream is = Resources.getResourceAsStream("");
    7.            factory = new SqlSessionFactoryBuilder().build(is);
    8.       } catch (IOException e) {
    9.            e.printStackTrace();
    10.       }
    11.   }
    12.    public static SqlSessionFactory getSqlSessionFactory(){
    13.        return factory;
    14.   }
    15.    public static SqlSession getSqlSession(boolean isAutoCommit){
    16.        SqlSession sqlSession = local.get();
    17.        if(sqlSession == null){
    18.            sqlSession = factory.openSession(isAutoCommit);
    19.            local.set(sqlSession);
    20.       }
    21.        return sqlSession;
    22.   }
    23.    public static SqlSession getSqlSession(){
    24.        return getSqlSession(false);
    25.   }
    26.    public static <T extends  Object>T getMapper(Class<T> c){
    27.        SqlSession sqlSession = getSqlSession(true);
    28.        return sqlSession.getMapper(c);
    29.   }
    30. }

3、 一对一关联

实例:用户---详情

3.1、 创建数据表
  1. -- 用户信息表
  2. create table users(
  3.   user_id int primary key auto_increment,
  4.   user_name varchar(20) not null unique,
  5.   user_pwd varchar(20) not null,
  6.   user_realname varchar(20) not null,
  7.   user_img varchar(100) not null
  8. );
  9. -- 用户详情表
  10. create table details(
  11. detail_id int primary key auto_increment,
  12.   user_addr varchar(50) not null,
  13.   user_tel char(11) not null,
  14.   user_desc varchar(200),
  15. uid int not null unique
  16.    -- constraint FK_USER foreign key(uid) references users(user_id)
  17. );
3.2、 创建实体类
  • User

    1. @Data
    2. @NoArgsConstructor
    3. @AllArgsConstructor
    4. @ToString
    5. public class User {
    6.    private int userId;
    7.    private String userName;
    8.    private String userPwd;
    9.    private String userRealname;
    10.    private String userImg;
    11. }
  • Detail

    1. @Data
    2. @NoArgsConstructor
    3. @AllArgsConstructor
    4. @ToString
    5. public class Detail {
    6.    private int detailId;
    7.    private String userAddr;
    8.    private String userTel;
    9.    private String userDesc;
    10.    private int userId;
    11. }
3.3、 添加操作(事务)

测试代码

3.4、 一对一关联查询

在查询用户的同时关联查询出与之对应的详情

实体

User Detail

映射文件

连接查询

子查询

4、 一对多关联

案例:班级(1)—学生(n)

4.1、 创建数据表
  1. -- 创建班级信息表
  2. create table classes(
  3.   cid int primary key auto_increment,
  4.   cname varchar(30) not null unique,
  5.   cdesc varchar(100)
  6. );
  7. -- 创建学生信息表
  8. create table students(
  9.   sid char(5) primary key,
  10.   sname varchar(20) not null,
  11.   sage int not null,
  12.   scid int not null
  13. );
4.2、 创建实体类
Clazz Student
4.3、关联查询

当查询一个班级的时候, 要关联查询出这个班级下的所有学生

连接查询

连接查询映射配置

子查询

子查询映射配置

5、多对一关联

实例:学生(n)—班级(1)

当查询一个学生的时候,关联查询这个学生所在的班级信息

5.1、 创建实体类
Student Clazz
5.2、关联查询

连接查询

连接查询映射配置

子查询

子查询映射配置

6、多对多关联

案例:学生(m)—课程(n)

6.1、创建数据表
  1. -- 学生信息表(如上)
  2. -- 课程信息表
  3. create table courses(
  4.   course_id int primary key auto_increment,
  5.   course_name varchar(50) not null
  6. );
  7. -- 选课信息表/成绩表(学号、课程号、成绩)
  8. create table grades(
  9.   sid char(5) not null,
  10.   cid int not null,
  11.   score int not null
  12. );
6.2、关联查询

查询学生时,同时查询学生选择的课程

Student Course

根据课程编号查询课程时,同时查询选择了这门课程的学生

Student Course
连接查询映射配置

子查询映射配置