实体关系
实体关系指的就是数据与数据之间的关系,例如:用户和角色、房屋和楼栋、订单和商品。
实体关系分为四种,即一对一关联、一对多关联、多对一关联、多对多关联。
一对一关联
如:人和身份证、学生和学生证、用户基本信息和详情……
数据表关系分为以下两种:
主键关联
用户表主键 和详情主键相同时,表示是匹配的数据。
![](https://oss.gaojie.cc/1616550990633.png)
唯一外键关联
![](https://oss.gaojie.cc/1616551159843.png)
一对多关联、多对一关联
一对多和多对一只是站在不同角度,相对而言,如:
数据表关系:在多的一端添加外键和一的一段进行关联。
![](https://oss.gaojie.cc/image-20220622113943221.png)
多对多关联
如:用户和角色、角色和权限、房屋和业主、学生和社团、订单和商品……
数据表关系:建立第三张关系表添加两个外键分别与两张表主键进行关联。
![](https://oss.gaojie.cc/duoduiduoguanlian.png)
环境准备
1. 创建web项目(maven)
1 2 3 4 5 6 7 8 9 10 11 12 13
| <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>
|
2. 部署MyBatis框架
2.1 添加依赖
1 2 3 4 5 6 7 8 9 10 11 12
| <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency>
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency>
|
2.2 配置文件
jdbc.properties |
![](https://oss.gaojie.cc/image-20220622121526103.png) |
mybatis-config.xml |
![](https://oss.gaojie.cc/image-20220622121623481.png) |
2.3 Mybatis工具类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| 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); }
}
|
一对一关联
用户信息(1)————用户详情(1)。
1 2 3 4 5 6 7 8
| 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 )
|
1 2 3 4 5 6 7 8 9
| 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, )
|
添加操作(事务)
添加用户信息的同时添加用户详情。
实体类
User.java |
Detail.java |
![](https://oss.gaojie.cc/image-20220623200016127.png) |
![](https://oss.gaojie.cc/image-20220623200354265.png) |
DAO接口
1 2 3
| public interface UserDAO { public int insertUser(User user); }
|
1 2 3
| public interface DetailDAO { public int insertDetail(Detail detail); }
|
映射文件
UserMapper.xml |
![](https://oss.gaojie.cc/image-20220623205404705.png) |
DetailMapper.xml |
![](https://oss.gaojie.cc/image-20220623210647894.png) |
mybatis-config.xml |
![](https://oss.gaojie.cc/image-20220623205014598.png) |
运行测试
UserDAOTest.java |
![](https://oss.gaojie.cc/1616558872585.png) |
单表查询
查询用户信息表中一条记录。
DAO接口
1 2 3
| public interface UserDAO { public User queryUser(String username); }
|
映射文件
mybatis-config.xml |
![](https://oss.gaojie.cc/image-20220624193440592.png) |
UserMapper.xml |
![](https://oss.gaojie.cc/image-20220624200540679.png) |
运行测试
UserDAOTest.java |
![](https://oss.gaojie.cc/image-20220624200732955.png) |
![](https://oss.gaojie.cc/image-20220624200811825.png) |
关联查询操作
在查询用户的同时关联查询出与之对应的详情。
实体
User.java |
Detail.java |
![](https://oss.gaojie.cc/1616557527886.png) |
![](https://oss.gaojie.cc/1616557509389.png) |
方式一:连接查询
UserMapper.xml |
![](https://oss.gaojie.cc/1616558061073.png) |
方式二:子查询
DetailDAO.java |
![](https://oss.gaojie.cc/image-20220624204952867.png) |
DetailMapper.xml |
![](https://oss.gaojie.cc/1616558696902.png) |
UserMapper.xml |
![](https://oss.gaojie.cc/1616558739190.png) |
运行测试
UserDAOTest.java |
![](https://oss.gaojie.cc/image-20220624200732955.png) |
![](https://oss.gaojie.cc/image-20220624211656593.png) |
一对多关联
班级(1)————学生(n)。
数据表
1 2 3 4 5 6
| create table classes( cid int primary key auto_increment, cname varchar(30) not null unique, cdesc varchar(100) );
|
1 2 3 4 5 6 7
| create table students( sid char(5) primary key, sname varchar(20) not null, sage int not null, scid int not null );
|
实体类
Clazz.Java |
Student.java |
![](https://oss.gaojie.cc/1616566868757.png) |
![](https://oss.gaojie.cc/1616566709567.png) |
关联查询
当查询一个班级的时候, 要关联查询出这个班级下的所有学生。
方式一:连接查询
根据班级编号查询班级信息,同时查询这个班级下所有的学生信息。
DAO接口
1 2 3
| public interface ClassDAO { public Clazz queryClass(int classId); }
|
映射文件
mybatis-config.xml |
![](https://oss.gaojie.cc/image-20220625192902521.png) |
![](https://oss.gaojie.cc/image-20220625192949123.png) |
ClassMapper.xml |
![](https://oss.gaojie.cc/1616567949549.png) |
测试代码
ClassDAOTest.java |
![](https://oss.gaojie.cc/image-20220625193816880.png) |
![](https://oss.gaojie.cc/image-20220625193609907.png) |
方式二:子查询
DAO接口
1 2 3
| public interface StudentDAO { public Student queryStudentByCid(int cid); }
|
映射文件
StudentMapper.xml |
![](https://oss.gaojie.cc/1616568410749.png) |
mybatis-config.xml |
![](https://oss.gaojie.cc/image-20220625195319300.png) |
ClassMapper.xml |
![](https://oss.gaojie.cc/1616568443022.png) |
测试代码
ClassDAOTest.java |
![](https://oss.gaojie.cc/image-20220625193816880.png) |
![](https://oss.gaojie.cc/image-20220625193609907.png) |
多对一关联
学生(n)———— 班级(1)。
实体类
Student.java |
Clazz.java |
![](https://oss.gaojie.cc/1616568763050.png) |
![](https://oss.gaojie.cc/1616568809974.png) |
关联查询
当查询一个学生的时候,关联查询这个学生所在的班级信息。
方式一:连接查询
根据学号查询学生信息,同时关联查询到这个学生所属的班级信息。
DAO接口
1 2 3
| public interface StudentDAO { public Student queryStudentBySid(String sid); }
|
映射文件
StudentMapper.xml |
![](https://oss.gaojie.cc/1616569488794.png) |
测试代码
StudentDAOTest.java |
![](https://oss.gaojie.cc/image-20220626115745280.png) |
![](https://oss.gaojie.cc/image-20220626115721399.png) |
方式二:子查询
DAO接口
1 2 3
| public interface ClassDAO { public Clazz queryClass(int classId); }
|
映射文件
ClassMapper.xml |
![](https://oss.gaojie.cc/1616569897430.png) |
StudentMaper.xml |
![](https://oss.gaojie.cc/1616569932235.png) |
测试代码
StudentDAOTest.java |
![](https://oss.gaojie.cc/image-20220626121546116.png) |
![](https://oss.gaojie.cc/image-20220626121625366.png) |
多对多关联
学生(m)<—————> 课程(n)。
1 2 3 4 5
| create table courses( course_id int primary key auto_increment, course_name varchar(50) not null );
|
1 2 3 4 5 6
| create table grades( sid char(5) not null, cid int not null, score int not null );
|
课程n>>>学生m
根据课程编号查询课程时,同时查询选择了这门课程的学生。
实体
Student.java |
Course.java |
![](https://oss.gaojie.cc/1616577675018.png) |
![](https://oss.gaojie.cc/1616577785188.png) |
方法一:连接查询
DAO接口
1 2 3
| public interface CourseDAO { public Course queryCourseById(int courseId); }
|
映射文件
CourseMapper.xml |
![](https://oss.gaojie.cc/1616578573302.png) |
测试代码
CourseDAOTest.java |
![](https://oss.gaojie.cc/image-20220626230806144.png) |
![](https://oss.gaojie.cc/image-20220626230922324.png) |
方法二:子查询
DAO接口
1 2 3
| public interface StudentDAO { public Student queryStudentByCourseId(int courseId); }
|
映射文件
StudentMapper.xml |
![](https://oss.gaojie.cc/1616579097777.png) |
CourseMapper.xml |
![](https://oss.gaojie.cc/1616579157655.png) |
测试代码
CourseDAOTest.java |
![](https://oss.gaojie.cc/image-20220626230806144.png) |
![](https://oss.gaojie.cc/image-20220626230922324.png) |
课程m>>>学生n
查询学生时,同时查询学生选择的课程。
实体
Student.java |
Course.java |
![](https://oss.gaojie.cc/1616577612042.png) |
![](https://oss.gaojie.cc/1616577631853.png) |
步骤与上面根据课程编号查学生信息类似,只是换了一个角度。