Mybatis的多表联查

一、一对一关联:一个员工对应一个部门
1、需求分析

(1)表之间关系

(2)需求:查询所有员工信息,关联查询所属部门信息;

(3)分析:在查询过程中,即使有的员工还没有部门也需要查询这个员工的信息,此时在查询过程中,员工表应该是主表;

2、创建实体类

(1)部门实体类(Department)

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Department {
    // 部门编号
    private Integer deptNo;
    // 部门名称
    private String deptName;
    //部门地址
    private String location;
    //部门的员工
    private List<Employee> employeeList;
}

(2)员工实体类(Employee)

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
// 定义一个Employee类
public class Employee  {
   // 员工编号
    private Integer empNo;
    // 员工姓名
    private String empName;
   // 私有变量:员工年龄
    private Integer empAge;
    // 私有变量:员工地址
    private String address;
    // 私有变量:员工薪水
    private Double salary;
    // 私有变量:员工部门
    private Department department;
}
3、创建Mapper代理(dao层)

(1)EmployeeMapper.java

public interface EmployeeMapper {
   // 查询所有员工
   public List<Employee> finAll();
}
4、创建映射文件

(1)EmployeeMapper.xml

5、测试查询
public class CascadeTest {
    private DataConnection dataConn ;
    private EmployeeMapper employeeMapper;

    @Before
    public void before(){
        try{
            dataConn = new DataConnection();
            SqlSession sqlSession = dataConn.getSqlSession();
            employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    @Test
    public void OneToOne(){
        List<Employee> employeeList = employeeMapper.findAll();
        System.out.println(employeeList);
    }
二、一对多关联:一个部门有多个员工
1、需求分析

(1)需求:查询部门信息以及部门下面所属员工信息

(2)分析:部门和员工的信息为一对多关系,并且查询过程中,如果有的部门没有员工,此时也需要将部门信息查询出来,因此在查询中,部门表应该是主表;

2、创建Mapper代理(dao层)

(1)DepartmentMapper.java

public interface DepartmentMapper {
  	 //查询所有部门
 	List<Department> findAll();
}
3、创建映射文件

(1)DepartmentMapper.xml

4、测试查询
public class CascadeTest {
    private DataConnection dataConn ;
    private SqlSession sqlSession;
    private EmployeeMapper employeeMapper;
    private DepartmentMapper departmentMapper;
    @Before
    public void before(){
        try{
            dataConn = new DataConnection();
            sqlSession = dataConn.getSqlSession();
            employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
            departmentMapper = sqlSession.getMapper(DepartmentMapper.class);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    @After
    public void after(){
        try {
            sqlSession.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Test
    public void  OneToMany(){
        List<Department> departmentList = departmentMapper.findAll();
        System.out.println(departmentList);
    }
}
三、多对多关联:用户和角色
1、需求分析

(1)需求:一个用户可以有多个角色,一个角色可以赋予多个用户

(2)分析:

  • 用户实体类和角色实体类让用户和角色的实体类能体现出来多对多的关系各自包含对方一个集合引用

  • 当我们查询用户时,可以同时得到用户所包含的角色信息

  • 当我们查询角色时,可以同时得到角色的所赋予的用户信息

(3)表之间的关系:用户表,角色表让用户表和角色表具有多对多的关系。需要使用中间表,中间表需要外键引用用户表、角色表。

2、创建Mapper代理(dao层)

(1)UserMapper.java

public interface UserMapper {
    public List<User> findAll();
}
3、创建映射文件

(1)UserMapper.xml

(2)RoleMapper.xml

4、测试查询
public class CascadeTest {
    private DataConnection dataConn ;
    private SqlSession sqlSession;
    private UserMapper userMapper;
    private RoleMapper roleMapper;
    @Before
    public void before(){
        try{
            dataConn = new DataConnection();
            sqlSession = dataConn.getSqlSession();
            userMapper = sqlSession.getMapper(UserMapper.class);
            roleMapper =sqlSession.getMapper(RoleMapper.class);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    @After
    public void after(){
        try {
            sqlSession.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Test
    public void users(){
        List<User> userList = userMapper.findAll();
        System.out.println(userList);
    }

    @Test
    public void roles(){
        List<Role> roleList = roleMapper.findAll();
        System.out.println(roleList);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

上庸者-不服周

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值