目录:
什么是1:n
什么是n:m
这两种关系在数据库中怎么实现的(外键/第三张表)
如何用javabean实现?
如何用hibernate实现?(参考:待更新)
数据库中表的关系就是三种:1:1 1:n n:m
针对1:1在此处不会详细说明,可以参考:https://blog.csdn.net/lengjinghk/article/details/52140276
1、1:n
1.1 什么是1:n关系,就是一对多关系,就好像一个老师管理多个学生,一个人有多台车。其中老师和人就是1那方,但是学生和车就是n的那方。如果用一个表把1:n的关系表示出来,就会出现冗余数据,因此需要两个表,在多的一方创建一个外键连接两个表。
如果一个表表示车和人的关系如图:
数据存在冗余,所以应该分成person和car两个表格,并且用person_id作为关联。
用两个表表示如图:
1.2 sql语句如下:
解释:在car的一方设置了一个外键。就可以实现表的一对多的关系。
具体关于外键的讲解在这篇文章中,有关外键的创建和如何插入数据。
参考:https://blog.csdn.net/qq_36098284/article/details/79733501
1.3 javabean实现(两个class没有写构造函数)
你要搞明白,是给谁的class增加了set集合。是给1的那方增加了一个set集合,如果要给一个car添加一个所有者,就是要先有一个person对象的实例,然后person.getCar().add(new car()); 添加成功。可以在数据库中测试。
2、n:m
2.1 什么是n:m关系?
就是多对多关系。比如一个学生可以选多门课,课程可以由不同的学生选择。课程和学生的这两个实体就是多对多的关系。
在表的实现上,需要借助第三张表关联。而这第三张表有两个特殊的要求
第一:第三张表的主键必须包含两边表的主键。(就是sc的主键必须包含学生表和课程表的主键的id)。
第二:引入的表要引入两边表的主键作为外键。
2.2 sql语句
2.3 javabean的实现----在student和course中,分别添加了set<T>集合。用于显示有多少学生选择了这门课和一个学生选择了多少门课。要注意最后的test.java。
(我另一个文章在写hibernate如何实现表的关系时会贴出自己的代码,现在引用一个人写好的代码。是正确的。)
import java.util.*; 2 // 定义学生类 3 class Student { 4 private String name ; 5 private int age ; 6 private List<Course> allCourses ; // 定义集合保存全部课程 7 public Student(){// 无参构造 8 this.allCourses = new ArrayList<Course>() ;// 实例化List集合 9 } 10 public Student(String name,int age){ // 通过构造设置属性内容 11 this() ; // 调用无参构造 12 this.setName(name) ; // 设置name属性内容 13 this.setAge(age) ; // 设置age属性内容 14 } 15 public String getName() { 16 return name; 17 } 18 public void setName(String name) { 19 this.name = name; 20 } 21 public int getAge() { 22 return age; 23 } 24 public void setAge(int age) { 25 this.age = age; 26 } 27 public List<Course> getAllCourses() { // 取得全部课程 28 return allCourses; 29 } 30 public String toString(){ // 覆写toString()方法 31 return "学生姓名:" + this.name + ";年龄:" + this.age ; 32 } 33 } 34 35 36 //在学生类中存在一个allCourses的List集合,这样在程序运行时,一个学生类中可以保存多个Course对象。 37 38 //定义课程类 39 class Course { 40 private String name ; // 41 private int credit ; // 定义学分 42 private List<Student> allStudents ; // 定义集合保存多个学生 43 public Course(){ // 无参构造方法 44 this.allStudents = new ArrayList<Student>() ;// 实例化List集合 45 } 46 public Course(String name,int credit){ // 47 this() ; 48 this.setName(name) ; 49 this.setCredit(credit) ; 50 } 51 public String getName() { 52 return name; 53 } 54 public void setName(String name) { 55 this.name = name; 56 } 57 public int getCredit() { 58 return credit; 59 } 60 public void setCredit(int credit) { 61 this.credit = credit; 62 } 63 public List<Student> getAllStudents() { // 得到全部学生 64 return allStudents; 65 } 66 public void setAllStudents(List<Student>allStudents) {// 设置全部学生 67 this.allStudents = allStudents; 68 } 69 public String toString(){ 70 return "课程名称:" + this.name + ";课程学分" + this.credit ; 71 } 72 } 73 74 //课程类与学生类一样,都定义了一个List集合,用于保存多个学生信息。 75 76 77 78 79 public class TestMore { 80 public static void main(String args[]) { 81 Course c1 = new Course("英语", 3); // 实例化课程对象 82 Course c2 = new Course("计算机", 5); 83 Student s1 = new Student("张三", 20); // 实例化学生对象 84 Student s2 = new Student("李四", 21); 85 Student s3 = new Student("王五", 22); 86 Student s4 = new Student("赵六", 23); 87 Student s5 = new Student("孙七", 24); 88 Student s6 = new Student("钱八", 25); 89 // 第一门课程有3个人参加,向课程中增加3个学生信息,同时向学生中增加课程信息 90 c1.getAllStudents().add(s1); // 向课程增加学生信息 91 c1.getAllStudents().add(s2); 92 c1.getAllStudents().add(s6); 93 s1.getAllCourses().add(c1); // 向学生中增加课程信息 94 s2.getAllCourses().add(c1); 95 s6.getAllCourses().add(c1); 96 // 第二门课程有6个人参加,向课程中增加6个学生信息,同时向学生中增加课程信息 97 c2.getAllStudents().add(s1); // 向课程增加学生信息 98 c2.getAllStudents().add(s2); 99 c2.getAllStudents().add(s3); 100 c2.getAllStudents().add(s4); 101 c2.getAllStudents().add(s5); 102 c2.getAllStudents().add(s6); 103 s1.getAllCourses().add(c2);// 向学生中增加课程信息 104 s2.getAllCourses().add(c2); 105 s3.getAllCourses().add(c2); 106 s4.getAllCourses().add(c2); 107 s5.getAllCourses().add(c2); 108 s6.getAllCourses().add(c2); 109 // 输出一门课程的信息,观察一门课程有多少个学生参加 110 System.out.println(c1); // 输出第一门课程信息 111 Iterator<Student> iter1 = c1.getAllStudents().iterator(); 112 while (iter1.hasNext()) { // 迭代 113 Student s = iter1.next();// 取出学生对象 114 System.out.println("\t|- " + s); // 输出学生信息 115 } 116 // 输出一个学生参加的课程信息,观察有多少门课程 117 System.out.println(s6); // 输出学生信息 118 Iterator<Course> iter2 = s6.getAllCourses().iterator(); 119 while (iter2.hasNext()) { // 迭代 120 Course c = iter2.next(); // 取得所参加的课程 121 System.out.println("\t|- " + c); // 输出课程信息 122 } 123 } 124 } 125 ---------- java ---------- 126 课程名称:英语;课程学分3 127 |- 学生姓名:张三;年龄:20 128 |- 学生姓名:李四;年龄:21 129 |- 学生姓名:钱八;年龄:25 130 学生姓名:钱八;年龄:25 131 |- 课程名称:英语;课程学分3 132 |- 课程名称:计算机;课程学分5 133 134 输出完成 (耗时 0 秒) - 正常终止
参考:https://www.cnblogs.com/xscn/archive/2013/08/09/3249274.html