我们在学习数据库的时候,了解到数据库中多表之前是存在关系的,而这种关系也是固定的,分为:一对多,多对 一,一对一和多对多。那么学习完JDBC,JSP,Servlet后。如何在WEB项目中操作数据库呢?这就是我们今天研究的重点:如何使用JAVA代码实现多表关系操作。
1.多表操作之一对多
比较经典的一对多的关系就是学生表与年级表,两张表中,学生是多方,年级是一方。因为
:
一个年级可以有多名学生,但反过来一名学生只属于一个年级。
1.创建数据表
![](https://i-blog.csdnimg.cn/blog_migrate/0f160fc8aefd6e265c1787f7dc90395a.png)
2.创建实体类
年级类
package bean;
import java.util.List;
public class Grade {
private int gradeId;
private String gname;
//数据库中使用外键列保证两表关系,实体类中使用属性保证两表关系
private List<Student> studentList;
@Override
public String toString() {
return "Grade{" +
"gradeId=" + gradeId +
", gname='" + gname + '\'' +
", studentList=" + studentList +
'}';
}
public int getGradeId() {
return gradeId;
}
public void setGradeId(int gradeId) {
this.gradeId = gradeId;
}
public String getGname() {
return gname;
}
public void setGname(String gname) {
this.gname = gname;
}
public List<Student> getStudentList() {
return studentList;
}
public void setStudentList(List<Student> studentList) {
this.studentList = studentList;
}
}
学生类
package bean;
public class Student {
private int stuId;
private String stuName;
private int stuAge;
private int gid;
@Override
public String toString() {
return "Student{" +
"stuId=" + stuId +
", stuName='" + stuName + '\'' +
", stuAge=" + stuAge +
", gid=" + gid +
'}';
}
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 getStuAge() {
return stuAge;
}
public void setStuAge(int stuAge) {
this.stuAge = stuAge;
}
public int getGid() {
return gid;
}
public void setGid(int gid) {
this.gid = gid;
}
}
两表之间的属性关系
数据表是通过外键列来维系两表关系。实体类是通过属性来维系两表关系。在建立一对多关系时,我们分析到年级 是一方,学生是多方。一对多,是以一方为主,所以我们在一方添加多方的一个属性。那这个属性是对象还是集合 呢?这里记住一句话:
一方存多方的集合,多方存一方的对象。所以需要在年级表中添加下列属性
3. 修改Grade代码建立表关系
private List<Student> studentList; public List<Student> getStudentList() {
return studentList;
}
public void setStudentList(List<Student> studentList) {
this.studentList = studentList; }
4.创建Dao层接口代码和实现类,操作数据库
接口类
package dao;
import bean.Grade;
public interface GradeDao {
//查询某个年级信息(要求同时查询出学生信息)
public Grade findById(int gid);
}
实现类
package dao.impl;
import bean.Grade;
import bean.Student;
import dao.GradeDao;
import util.DruidUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
public class GradeDaoImpl extends DruidUtil implements GradeDao {
@Override
public Grade findById(int gid) {
Grade grade = new Grade();
ArrayList<Student> students = new ArrayList<>();
Connection connection = null;
PreparedStatement preparedStatement =null;
ResultSet resultSet = null;
try {
connection = getConnection();
preparedStatement = connection.prepareStatement("select * from student s,grade g where s.gid=g.gradeid and g.gradeid=?");
preparedStatement.setInt(1,gid);