多对一
站在角度不一样 关系就不一样
原则:一方存多方的集合,多方存一方的对象
一对多 和多对一 的实体类是一样的:一方存多方的集合,多方存一方的对象
不一样的地方是 dao 实现对应关系的部分
实例:学生和年级关系:学生是多方,年级是一方
实现过程:
1、javabean(同一对多)
数据库中使用外键列保证两表关系,实体类中使用属性保证两表关系
2、dao 实现对应数据关系
/*接口:[src.dao.GradeDao.java(interface)]*/
public interface GradeDao {
//查询学生的信息(包含年级信息)
public List<Student> findAll();
}
/*实现接口:[src.dao.impl.GradeDaoImpl.java]*/
@Override
public List<Student> findAll() {
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 ");
resultSet = preparedStatement.executeQuery();
while(resultSet.next()){
//1.各自存各自的数据
Grade grade = new Grade();
grade.setGradeId(resultSet.getInt("gradeid"));
grade.setGname(resultSet.getString("gname"));
Student student = new Student();
student.setStuName(resultSet.getString("stuname"));
student.setStuAge(resultSet.getInt("stuage"));
//2.关联信息(将年级放在学生中,再将学生放在集合中)
student.setGrade(grade);
students.add(student);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
close(connection,preparedStatement,resultSet);
}
return students;
}
3、Demo2.java 测试关系
public class Demo2 {
public static void main(String[] args) {
GradeDaoImpl gradeDao = new GradeDaoImpl();
//通过findAll()方法将两表信息整合
List<Student> studentList = gradeDao.findAll();
for (Student student : studentList) {
System.out.println(student.getStuName()+"\t"+student.getGrade().getGname());
}
}
}