一对多

生活中常见一对多关系的例子,如一个学校可以包含多个学生,一个学生属于一个学校,那么这就是一个典型的一对多关系,可以通过集合进行关系的表示。

下面是基于集合应用的一个示例,这个示例将作为以后 Java EE 开发的基础。

1)定义学生类

import java.util.HashSet;
import java.util.Iterator;
public class Student {private String name; // 定义student类private int age; // 定义name属性private School school; // 一个学生属于一个学校// 通过构造方法设置内容public Student(String name, int age) {this.setName(name);this.setAge(age);}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public School getSchool() {return school;}public void setSchool(School school) {this.school = school;}// 重写toString()方法public String toString() {return "学生姓名:" + this.name + ":年龄" + this.age;}
}

在以上的 Student 类中包含了一个 School 属性,表示一个学生属于一个学校。在程序运行时,只需要传入 School 类的引用就可以完成这样的关系。

2)定义学校类

import java.util.ArrayList;
import java.util.List;
public class School {private String name;private List<Student> allStudents; // 一个学校有多个学生public School() {this.allStudents = new ArrayList<Student>();// 实例化List集合}public School(String name) {this();this.setName(name);}public String getName() {return name;}public void setName(String name) {this.name = name;}public List<Student> getAllStudents() {return allStudents;}public void setAllStudents(List<Student> allStudents) {this.allStudents = allStudents;}// 重写toString()方法public String toString() {return "学校名称:" + this.name;}
}

在定义学校类时定义了一个 List 类型的属性,并指定其泛型类型是 Student 类型,这样一来就表示在一个 School 对象中会包含多个 Student 类型的引用。

3)测试代码,设置关系

import java.util.Iterator;
public class Test {public static void main(String[] args) {// 实例化学校对象School sch = new School("清华大学");// 实例化学生对象Student s1 = new Student("张三", 21);Student s2 = new Student("李四", 22);Student s3 = new Student("王五", 23);// 在学校中加入学生sch.getAllStudents().add(s1);sch.getAllStudents().add(s2);sch.getAllStudents().add(s3);// 一个学生属于一个学校s1.setSchool(sch);s2.setSchool(sch);s3.setSchool(sch);// 输出学校信息System.out.println(sch);// 实例化Iterator对象,用于输出全部的学生信息Iterator<Student> ite = sch.getAllStudents().iterator();while (ite.hasNext()) {System.out.println("\t" + ite.next());}}
}

程序运行结果如下:

学校名称:清华大学学生姓名:张三:年龄21学生姓名:李四:年龄22学生姓名:王五:年龄23

以上代码先分别实例化了 School 及 Student 类的对象,之后通过两个类中的属性保存彼此的引用关系,从而形成了一个学校有多个学生,一个学生属于一个学校的一对多关系。

多对多

使用集合不仅可以表示一对一的关系,也可以表示多对多的关系。例如,一个学生可以选多门课程,一门课程可以有多个学生参加,那么这就是一个典型的多对多关系。

要完成上面要求,首先应该定义两个类,分别是学生信息(Student)类、课程信息(Course)类。在学生类中存在一个集合,保存全部的课程。同样,在课程类中也要存在一个集合,保存全部的学生。

1)定义学生类

public class Student {private String name;private int age;private List<Course> allCourses; // 定义集合保存全部课程private Student() {this.allCourses = new ArrayList<Course>();// 实例化List集合}// 通过构造方法设置内容public Student(String name, int age) {// 调用无参构造this();this.setName(name);this.setAge(age);}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public List<Course> getAllCourses() {return allCourses;}public void setAllCourses(List<Course> allCourses) {this.allCourses = allCourses;}// 重写toString()方法public String toString() {return "学生姓名:" + this.name + ":年龄" + this.age;}
}

在学生类中存在一个 allCourses 的 List 集合,这样在程序运行时,一个学生类中可以保存多个 Course 对象。

2)定义课程类

public class Course {private String name;private int credit;// 定义集合保存多个学生private List<Student> allStudents;private Course() {// 实例化List集合this.allStudents = new ArrayList<Student>();}public Course(String name, int credit) {this();this.setName(name);this.setCredit(credit);}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getCredit() {return credit;}public void setCredit(int credit) {this.credit = credit;}public List<Student> getAllStudents() {return allStudents;}public void setAllStudents(List<Student> allStudents) {this.allStudents = allStudents;}// 重写toString()方法public String toString() {return "课程名称" + this.name + ";课程学分" + this.credit;}
}

课程类与学生类一样,都定义了一个 List 集合,用于保存多个学生信息。

3)测试程序

public class TestMore {public static void main(String[] args) {// 实例化课程对象Course c1 = new Course("英语", 3);Course c2 = new Course("计算机", 5);// 实例化学生对象Student s1 = new Student("张三", 20);Student s2 = new Student("李四", 21);Student s3 = new Student("王五", 22);Student s4 = new Student("赵六", 23);Student s5 = new Student("孙七", 24);Student s6 = new Student("钱八", 25);// 第一门课程有3个人参加,向课程中增加3个学生信息,同时向学生中增加课程信息c1.getAllStudents().add(s1);c1.getAllStudents().add(s2);c1.getAllStudents().add(s6);s1.getAllCourses().add(c1);s2.getAllCourses().add(c1);s6.getAllCourses().add(c1);// 第二门课程有6个人参加,向课程中增加6个学生信息,同时向学生中添加课程信息// 向课程中增加学生信息c2.getAllStudents().add(s1);c2.getAllStudents().add(s2);c2.getAllStudents().add(s3);c2.getAllStudents().add(s4);c2.getAllStudents().add(s5);c2.getAllStudents().add(s6);// 像学生中增加课程信息s1.getAllCourses().add(c2);s2.getAllCourses().add(c2);s3.getAllCourses().add(c2);s4.getAllCourses().add(c2);s5.getAllCourses().add(c2);s6.getAllCourses().add(c2);// 输出一门课程的信息,观察一门课程有多少个学生参加System.out.println(c1); // 输出第一门课程Iterator<Student> iter1 = c1.getAllStudents().iterator();// 迭代输出while (iter1.hasNext()) {Student s = iter1.next();System.out.println("\t" + s);}// 输出一个学生参加的课程信息,观察有多少门课程System.out.println(s6);Iterator<Course> iter2 = s6.getAllCourses().iterator();while (iter2.hasNext()) {// 取得所参加的课程Course c = iter2.next();// 输出课程信息System.out.println("\t" + c);}}
}

输出结果如下:

课程名称英语;课程学分3学生姓名:张三:年龄20学生姓名:李四:年龄21学生姓名:钱八:年龄25
学生姓名:钱八:年龄25课程名称英语;课程学分3课程名称计算机;课程学分5

从程序来看,设计关系的地方较为复杂,因为现在的程序采用的是双向的处理关系,所以学生在选择一个课程时,除了课程中要添加学生,在学生中也要添加课程信息。

在输出课程信息时,可以通过课程对象中的集合找到参加此课程的全部学生信息,也可以通过学生找到全部参加的课程信息。

Java入门基础视频教程,java零基础自学就选黑马程序员Java入门教程(含Java项目和Java真题)

Java一对多、多对多关系示例相关推荐

  1. SQLAlchemy_定义(一对一/一对多/多对多)关系

    SQLAlchemy_定义(一对一/一对多/多对多)关系 目录 Basic Relationship Patterns One To Many One To One Many To Many Basi ...

  2. java 一对多、多对多关系示例

    一对多 生活中常见一对多关系的例子,如一个老师教多个学生,一个学生属于一个老师,那么这就是一个典型的一对多关系,可以通过集合进行关系的表示. 定义一个学生类 public class Student ...

  3. Java多对多关系示例

    使用集合不仅可以表示一对一的关系,也可以表示多对多的关系.例如,一个学生可以选多门课程,一门课程可以有多个学生参加,那么这就是一个典型的多对多关系. 要完成上面要求,首先应该定义两个类,分别是学生信息 ...

  4. Hibernate一对多/多对一关系映射详解及相应的增删查改操作

    以客户与订单的关系为例 1.在实体模型类中绑定两者关系: 客户类: public class Customer {private Integer id;//客户idprivate String nam ...

  5. 数据库外键:一对多/多对多关系

    数据库事务四大特性ACID: 原子性(Atomicity) 一致性(Consistency) 隔离性(Isolation) 持久性(Durability) 基于原子性对存在重复数据的表进行拆分 一对多 ...

  6. 数据库一对一 一对多 多对多关系

    参考:https://blog.csdn.net/u013144287/article/details/79024130 自己在项目中写的实例: '实体'和'公理'具有多对多关系,即一个实体可以对应多 ...

  7. hibernate 一对多 多对一 关系表 增删改查大礼包ps二级查也有

    今天来到混元气功 这货大概的意思就是你中有我 我中有你 ps 这里就要说到维护关系 ps写这个用了我一下午--.也是刚刚好复习到这里 顺便就写写 注意:一般都在多方维护关系,至于是用单向还是用多向要看 ...

  8. 数据库多对多关系示例 - 使用sqlite演示

    多对多,可以理解为是一对多和多对一的组合:要实现多对多,一般都需要有一张中间表(也叫关联表),将两张表进行关联,形成多对多的形式: 例如:     老师表.班级表.课程表,中间表为:课程表: 如果sq ...

  9. java中的多对多关系解析_Java中多对多映射关系(转)

    多对对的映射,可以用学生和课程进行演示.一个学生可以选择多个课程,一个课程又对应了多个学生 定义学生类 class Stu{ private String name; private String n ...

最新文章

  1. 我用java爬了一下CSDN,发现了这些秘密。。。
  2. 3springboot:springboot配置文件(外部配置加载顺序、自动配置原理,@Conditional)
  3. log--求自然对数
  4. vue elementui 切换语言
  5. ASP.NET【4】--ASHX
  6. 牛客练习赛34 - C little w and Segment Coverage(思维、树状数组)
  7. Android开发:5-3、Menu、Dialog、Fragment
  8. J - Fill (UVA - 10603)
  9. linux路由内核实现分析(一)----邻居子节点(2)
  10. Vue.js学习系列(八)---使用路由搭建单页应用(一)
  11. (转)GridView固定表头
  12. 客栈V4.21:多一个作品便多一份工作机会
  13. HTML期末大作业~海贼王大学生HTML网页制作10个页面作品(HTML+CSS+JavaScript)
  14. Selenium打开IE浏览器方法以及报错处理
  15. 2022 年值得安装的几个 chrome/edge 扩展神器
  16. Java 面向对象 习题2(基础篇)
  17. 程矢Oracle PowerDesigner中生成Oracle版本主键和自增列
  18. 论文阅读笔记---《TransferNet: An Effective and Transparent Framework for Multi-hop Question Answering over》
  19. oracle学号查询平均成绩,orcal数据库中查询出平均成绩大于60分的同学的学号和平均成绩...
  20. 解决打开管家婆软件报表慢的问题

热门文章

  1. ajax get传递数组参数吗,ajax 传递数组参数
  2. ajax传递数组怎么办?
  3. dmp标签_[重磅推荐]你必须知道的京准通DMP知识!
  4. ie自带css定位,CSS实现元素相对于浏览器窗口进行定位_css
  5. 计算机组成原理与结构
  6. google glog介绍与使用
  7. CAD基础+常用快捷(三)
  8. PTA ## 统计字符
  9. GStreamer教程-基础教程2:GStreamer概念
  10. Linux 安装Oracle11g完整安装图文教程另附基本操作 (分享)