JDBC 多表操作之多对一(附一个可实际操作案例)
有了上次一对多,老师学生的多表操作学习。那么同样的案例,如何实现多对一的操作。
即,把学生类当做主体,输出每个学生的信息+对应老师的信息。
另外,如果想复制代码,建议在 完整代码里复制
附,前情回顾:多表操作之一对多
https://blog.youkuaiyun.com/qq_43098690/article/details/121753026
还是老规矩,先给准备工作
在数据库中建立这两个表,分别是Student表 和Teacher 表。下面是快捷创建语句,可以直接复制使用
## 创建学生类表
create table student(
stuid int(10) not null AUTO_Increment,
stuname varchar(25) DEFAULT NULL,
teacherid int(10) DEFAULT NULL,
PRIMARY key(stuid)
)ENGINE=INNODB auto_increment=7 DEFAULT CHARSET=utf8;
## 插入数据
insert into student values('1','aaa','3');
insert into student values('2','bbb','1');
insert into student values('3','ccc','3');
insert into student values('4','ddd','1');
insert into student values('5','eee','2');
insert into student values('6','fff','1');
## 创建老师类表
drop table if EXISTS teacher;
create table teacher(
tid int(10) not null auto_increment,
tname varchar(25) DEFAULT NULL,
PRIMARY key(tid)
)ENGINE=INNODB auto_increment=4 DEFAULT charset=utf8;
insert into teacher values('1','张三老师');
insert into teacher values('2','赵四老师');
insert into teacher values('3','王五');
## 建立完成后检查一下
select * from student;
select * from teacher;
正式开始写
开发环境,IDEA+win10+jdk1.8
用到的数据库管理工具 Navicat Premium 15 (这个其实用啥都一样,只要能运行sql 查询语句就行)
先给一个运行结果
1. 首先建立bean对象
老师类的对象(注意,本次是多对一)
package Bean;
import java.util.List;
/**
* @program: 编程区
* @description: 实体对象-- 老师类
* @author: 白嫖怪AE
* @create: 2021-12-05 17:25
**/
// 多表操作
// teacher 是一方
public class Teacher {
private int tid;
private String tname;
public int getTid() {
return tid;
}
public void setTid(int tid) {
this.tid = tid;
}
public String getTname() {
return tname;
}
public void setTname(String tname) {
this.tname = tname;
}
public List<Student> getStudentList() {
return studentList;
}
public void setStudentList(List<Student> studentList) {
this.studentList = studentList;
}
}
学生类对象。由于老师类是一方,需要定义一个数据对象,设置其get、set 方法
package Bean;
/**
* @program: 编程区
* @description: 实体对象-- 学生类
* @author: 白嫖怪AE
* @create: 2021-12-05 17:24
**/
public class Student {
private int stuId;
private String stuName;
private int teacherId;
// 如果是多对一,需要在多方存储 一方的信息
// 多对一,是在多方存储一个一方数据的对象
private Teacher teacher;
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
public int getStuId() {
return stuId;
}
public void setStuId(int stuId) {
this.stuId = stuId;
}
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
public int getTeacherId() {
return teacherId;
}
public void setTeacherId(int teacherId) {
this.teacherId = teacherId;
}
}
2. 创建dao 用来保存 操作方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e0YbR4Zr-1638795461535)(E:\开课吧\第五章 数据库\第4节 JDBC\事务一对多.jpg)]
- 首先创建一个接口放在 impl 下 TeacherDao
package dao;
import Bean.Teacher;
/**
* @program: 编程区
* @description:
* @author: 白嫖怪AE
* @create: 2021-12-05 17:56
**/
public interface TeacherDao {
// 定义操作方法
// 这个是 一对多时候用的,一个老师 + 其下学生信息
//1. 定义一个根据老师id 查询老师信息 (学生信息)
public Teacher getById(int tid);
// 这个是 多对一时候用的,获取所有 每个学生+其老师的信息
public List<Student> getAll();
}
-
再创建实现类 TeacherDaoImpl 类(这里就实现了,对数据库的访问,SQL语句的执行以及返回对应的数据)
这里需要修改对应的SQL 语句和取出结果集
// 查所有的信息 String sql = "select * from student s,teacher t where s.teacherid=t.tid ";
取出结果集
//4. 取出结果集 List<Student> students = new ArrayList<Student>(); while(resultSet.next()){ //1. 取出各自的信息 Student student = new Student(); student.setStuId(resultSet.getInt("stuid")); student.setStuName(resultSet.getString("stuname")); Teacher teacher = new Teacher(); teacher.setTid(resultSet.getInt("tid")); teacher.setTname(resultSet.getString("tname")); // 建立两者关系 student.setTeacher(teacher); // 每个学生添加进 List集合中 students.add(student); } return students;
下面是完整代码
package dao.impl;
import Bean.Student;
import Bean.Teacher;
import dao.TeacherDao;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
/**
* @program: 编程区
* @description: 实现类,实现接口
* @author: 白嫖怪AE
* @create: 2021-12-06 16:10
**/
public class TeacherDaoImpl implements TeacherDao {
@Override
public Teacher getById(int tid) {
//操作数据库
Connection connection = null;
PreparedStatement pps = null; // 定义SQL,创建状态通道
ResultSet resultSet = null; //SQL 语句返回结果集
try {
//1. 加载驱动(mysql8) mysql8 之后增加了cj
Class.forName("com.mysql.cj.jdbc.Driver");
//2. 获得链接
String userName = "root";
String passWord = "123456";
// 专门用来链接 mysql8的驱动地址
String url = "jdbc:mysql://localhost:3306/employees?serverTimezone=UTC";
// 获取链接
connection = DriverManager.getConnection(url, userName, passWord);
//3. 定义sql,创建预状态通道(进行SQL 语句的发送)
String sql = "select * from student s,teacher t where s.teacherid=t.tid and t.tid=?";
pps = connection.prepareStatement(sql);
// 给占位符赋值
pps.setInt(1,tid);
// 执行sql 语句
resultSet = pps.executeQuery();
//4. 取出结果集
Teacher teacher = new Teacher();
List<Student> students = new ArrayList<Student>();
while(resultSet.next()){
//1. 取出各自的信息
teacher.setTid(resultSet.getInt("tid"));
teacher.setTname(resultSet.getString("tname"));
Student student = new Student();
student.setStuId(resultSet.getInt("stuid"));
student.setStuName(resultSet.getString("stuname"));
// 把每个学生都放到ArrayList 集合中
students.add(student);
}
//2. 建立学生和老师之间的关系
teacher.setStudentList(students);
return teacher;
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
// 关闭资源
try {
if (resultSet != null) {
resultSet.close();
}
if (pps != null) {
pps.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return null;
}
@Override
public List<Student> getAll() {
//操作数据库
Connection connection = null;
PreparedStatement pps = null; // 定义SQL,创建状态通道
ResultSet resultSet = null; //SQL 语句返回结果集
try {
//1. 加载驱动(mysql8) mysql8 之后增加了cj
Class.forName("com.mysql.cj.jdbc.Driver");
//2. 获得链接
String userName = "root";
String passWord = "123456";
// 专门用来链接 mysql8的驱动地址
String url = "jdbc:mysql://localhost:3306/employees?serverTimezone=UTC";
// 获取链接
connection = DriverManager.getConnection(url, userName, passWord);
//3. 定义sql,创建预状态通道(进行SQL 语句的发送)
String sql = "select * from student s,teacher t where s.teacherid=t.tid ";
pps = connection.prepareStatement(sql);
// 执行sql 语句
resultSet = pps.executeQuery();
//4. 取出结果集
List<Student> students = new ArrayList<Student>();
while(resultSet.next()){
//1. 取出各自的信息
Student student = new Student();
student.setStuId(resultSet.getInt("stuid"));
student.setStuName(resultSet.getString("stuname"));
Teacher teacher = new Teacher();
teacher.setTid(resultSet.getInt("tid"));
teacher.setTname(resultSet.getString("tname"));
// 建立两者关系
student.setTeacher(teacher);
// 每个学生添加进 List集合中
students.add(student);
}
return students;
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
// 关闭资源
try {
if (resultSet != null) {
resultSet.close();
}
if (pps != null) {
pps.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return null;
}
}
以上工作做完
创建一个测试类用来测试一下
package Test;
import Bean.Student;
import Bean.Teacher;
import dao.TeacherDao;
import dao.impl.TeacherDaoImpl;
import java.util.List;
/**
* @program: 编程区
* @description: 测试类
* @author: 白嫖怪AE
* @create: 2021-12-06 17:49
**/
public class Demo {
// 用来测试多对一
public static void main(String[] args) {
TeacherDao teacherDao = new TeacherDaoImpl();
List<Student> studentList = teacherDao.getAll();
for (Student student : studentList) {
System.out.println("学生姓名:"+student.getStuName()+"老师姓名:"+student.getTeacher().getTname());
}
}
// // 用来测试一对多
// public static void main(String[] args) {
//
// TeacherDao teacherDao = new TeacherDaoImpl();
// // 比如要查询id为1 的老师信息 对数据进行操作用dao
// Teacher teacher = teacherDao.getById(1);
// System.out.println("老师姓名:"+teacher.getTname());
//
// List<Student> studentList = teacher.getStudentList();
// for (Student student : studentList) {
// System.out.println("\t 学生姓名:"+student.getStuName());
// }
// }
}