Mybatis 多表查询:
表与表之间的关联关系:
一对多/多对一
使用场景:一个账户 对应多个订单
一对一:一个对应一个身份证号
多对多:一个学生被多个老师教过,一个老师教多个学生
三种关联关系:
。一对一:在任意一方引入主键作为外键
。一对多:在“多”的一方,添加“一”的方主键作为外键
。多对多:产生中间关系,引入两张表的主键作为外键,两个主键称为联合主键或使得字段作为主键。
**高耦合:**牵一发东全身
一处修改,其他地方夺得修改
我们在开发的过程中最好就是降低耦合性
关于外键的存在,会导致耦合性较高,SQL语句的性能比较优化
步骤:
1.先准备表:用户表 角色表 中间表
2.实体类
用户实体类,角色实体类
3.配置映射文件
用户的映射文件
角色的映射文件
4.实现功能
当我们查询用户的时候,可以同时得到用户所包含的角色信息
当我们查询角色的时候,可以同时得到角色赋予用户信息
#用户表
create table user(
id int primary key auto_increament
username varchar(30),
password varchar(30)
);
#角色表
create table role(
id int primary key aoto_increament,
role_name varchar (30),
role_description varchaer(20) comment’角色’
);
insert into role(id,role_name,role_descriptinon) values
(101,‘院长’,‘管理整个学院’),
(102,‘主任’,‘管理整个后勤’),
(103,‘科长’,‘管理整个教学科’);
#用户角色中间表
create table user_role(
uid int,
rid int,
primary key(uid,rid), 联合主键
foreign key(uid) refereces user(id),
foregin key(rid) refereces role(id)
);
insert into user_role(uid,rid) values
(1,103),
(2,102),
(3.101),
1.Role 类
package cn.javabs.entity;
import java.io.Serializable;
import java.util.List;
/**
* 持久化类 权限的实体类
*/
public class Role implements Serializable {
private Integer roleId; // 权限的id
private String roleName; // 权限的名字
private String roleDescription; // 权限的描述
// 一个角色赋予多个用户 M:N
private List<User> users;
@Override
public String toString() {
return "Role{" +
"roleId=" + roleId +
", roleName='" + roleName + '\'' +
", roleDescription='" + roleDescription + '\'' +
", users=" + users +
'}';
}
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
public Integer getRoleId() {
return roleId;
}
public void setRoleId(Integer roleId) {
this.roleId = roleId;
}
public String getRoleName() {
return roleName;