1、实体关系
实体——数据实体,实体关系指的就是数据与数据之间的关系
例如:用户和角色、房屋和楼栋、订单和商品
实体关系分为以下四种:
一对一关联
实例:人和身份证、学生和学生证、用户基本信息和详情
数据表关系:
-
主键关联(用户表主键 和详情主键相同时,表示是匹配的数据)
- 唯一外键关联
一对多关联、多对一关联
实例:
-
一对多: 班级和学生 、 类别和商品、楼栋和房屋
-
多对一:学生和班级 、 商品和类别
数据表关系:
-
在多的一端添加外键和一的一段进行关联
多对多关联
实例:用户和角色、角色和权限、房屋和业主、学生和社团、订单和商品
数据表关系:建立第三张关系表添加两个外键分别与两张表主键进行关联
用户(user_id) 用户角色表(uid,rid) 角色(role_id)
2、 创建项目,部署MyBatis框架
-
创建web项目(maven)
<!-- 添加web依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency>
-
部署MyBatis框架
-
添加依赖
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency>
-
配置文件
-
帮助类
public class MyBatisUtil { private static SqlSessionFactory factory; private static final ThreadLocal<SqlSession> local = new ThreadLocal<SqlSession>(); static{ try { InputStream is = Resources.getResourceAsStream("mybatis-config.xml"); factory = new SqlSessionFactoryBuilder().build(is); } catch (IOException e) { e.printStackTrace(); } } public static SqlSessionFactory getSqlSessionFactory(){ return factory; } public static SqlSession getSqlSession(boolean isAutoCommit){ SqlSession sqlSession = local.get(); if(sqlSession == null){ sqlSession = factory.openSession(isAutoCommit); local.set(sqlSession); } return sqlSession; } public static SqlSession getSqlSession(){ return getSqlSession(false); } public static <T extends Object>T getMapper(Class<T> c){ SqlSession sqlSession = getSqlSession(true); return sqlSession.getMapper(c); } }
-
3、 一对一关联
实例:用户---详情
3.1、 创建数据表
-- 用户信息表
create table users(
user_id int primary key auto_increment,
user_name varchar(20) not null unique,
user_pwd varchar(20) not null,
user_realname varchar(20) not null,
user_img varchar(100) not null
);
-- 用户详情表
create table details(
detail_id int primary key auto_increment,
user_addr varchar(50) not null,
user_tel char(11) not null,
user_desc varchar(200),
uid int not null unique
-- constraint FK_USER foreign key(uid) references users(user_id)
);
3.2、 创建实体类
-
User
@Data @NoArgsConstructor @AllArgsConstructor @ToString public class User { private int userId; private String userName; private String userPwd; private String userRealname; private String userImg; }
-
Detail
@Data @NoArgsConstructor @AllArgsConstructor @ToString public class Detail { private int detailId; private String userAddr; private String userTel; private String userDesc; private int userId; }
3.3、 添加操作(事务)
测试代码 |
---|
3.4、 一对一关联查询
在查询用户的同时关联查询出与之对应的详情
实体
User | Detail |
---|---|
映射文件
连接查询 |
---|
子查询 |
---|
4、 一对多关联
案例:班级(1)—学生(n)
4.1、 创建数据表
-- 创建班级信息表
create table classes(
cid int primary key auto_increment,
cname varchar(30) not null unique,
cdesc varchar(100)
);
-- 创建学生信息表
create table students(
sid char(5) primary key,
sname varchar(20) not null,
sage int not null,
scid int not null
);
4.2、 创建实体类
Clazz | Student |
---|---|
4.3、关联查询
当查询一个班级的时候, 要关联查询出这个班级下的所有学生
连接查询
连接查询映射配置 |
---|
子查询
子查询映射配置 |
---|
5、多对一关联
实例:学生(n)—班级(1)
当查询一个学生的时候,关联查询这个学生所在的班级信息
5.1、 创建实体类
Student | Clazz |
---|---|
5.2、关联查询
连接查询
连接查询映射配置 |
---|
子查询
子查询映射配置 |
---|
6、多对多关联
案例:学生(m)—课程(n)
6.1、创建数据表
-- 学生信息表(如上)
-- 课程信息表
create table courses(
course_id int primary key auto_increment,
course_name varchar(50) not null
);
-- 选课信息表/成绩表(学号、课程号、成绩)
create table grades(
sid char(5) not null,
cid int not null,
score int not null
);
6.2、关联查询
查询学生时,同时查询学生选择的课程
Student | Course |
---|---|
根据课程编号查询课程时,同时查询选择了这门课程的学生
Student | Course |
---|---|
连接查询映射配置 |
---|
子查询映射配置 |
---|