JDBC 多表操作之一对多(附一个可实际操作案例)
弱弱的声明一下:本人还在学习Java 中,小白一个。如果内容有错误或者有优化建议欢迎提出来,我会认真优化代码给各位一个交代的。上次被喷惨了,相关的知识我已经狠狠的恶补过了,所以大神嘴下留情,别骂了(狗头保命 *。*)。
这里的一对多,使用的是老师和学生。
实现的目的:可以通过Java 代码操作数据库,从老师表和学生表中正常查询。
本次的查询目的就,查询老师id 为1 的老师姓名及下属学生名字和id
SQL 语句:
select * from student s,teacher t where s.studentid=t.tid and t.tid=1;
首先准备工作
在数据库中建立这两个表,分别是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 对象
老师类的对象。由于老师是一方,所有可以在老师对象中添加一个ArrayList 集合用来存储学生对象
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;
// 在一方存储多方数据的集合
private List<Student> studentList;
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;
}
}
学生类对象
package Bean;
/**
* @program: 编程区
* @description: 实体对象-- 学生类
* @author: 白嫖怪AE
* @create: 2021-12-05 17:24
**/
public class Student {
private int stuId;
private String stuName;
private int teacherId;
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;
}
}
bean对象仅仅用来对对象的创建和配置,如果要进行数据方面的操作(增加、删除、修改、查询等等)就需要创建Dao来统一管理
2. 创建dao 用来保存 操作方法
- 首先创建一个接口放在 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);
}
- 再创建实现类 TeacherDaoImpl 类(这里就实现了,对数据库的访问,SQL语句的执行以及返回对应的数据)
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;
}
}
以上工作做完
创建一个测试类用来测试一下
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();
// 比如要查询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());
}
}
}