JDBC中的多表查询

属性包--com.jdbc.po

  • 1.Score(主要定义成绩表的属性)
  • 2.Student(主要定义学生类的属性)

方法包--com.jdbc.dao

  • 1.类ScoreDao (主要定义通过连接数据库获取成绩列表的方法)
  • 2.类StudentDao (主要定义通过连接数据库获取学生信息列表的方法)

工具包--com.jdbc.util

  • 1.DBUtils(主要放置类ScoreDao和类StudentDao里面共同的连接数据库的代码)

多表连接包--com.jdbc.service

  • 1.StudentService(主要定义学生信息表和成绩表连接的方法)
    /StudentService--该表作用是将StudentDao里面查询到的表和ScoreDao里面查询到的表,将两张表组合起来的作用
    /
    学生的业务逻辑表

定义成绩类Score

package com.jdbc2.po;

public class Score {

    private int id;
    //定义成绩id
    private int sid;
    //定义课程名称
    private String course;
    //定义成绩
    private double score;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getSid() {
        return sid;
    }
    public void setSid(int sid) {
        this.sid = sid;
    }
    public String getCourse() {
        return course;
    }
    public void setCourse(String course) {
        this.course = course;
    }
    public double getScore() {
        return score;
    }
    public void setScore(double score) {
        this.score = score;
    }
    //toString() 方法,避免打印输出为地址
    @Override
    public String toString() {
        return "Score [id=" + id + ", sid=" + sid + ", 科目=" + course + ", 成绩=" + score + "]";
    }
    
}

定义学生类Student

package com.jdbc2.po;

import java.util.Date;
import java.util.List;

public class Student {
    private int id;
    //定义姓名
    private String name;
    //定义年龄
    private int age;
    //定义性别
    private int sex;
    //定义出生日期
    private Date birthday;  
    //重点:建立一个学生对应多个成绩的联系的集合属性
    //成绩表集合定义到学生类中或者学生定义到成绩类中视需求而定
    private List scoreList;
        
    public List getScoreList() {
        return scoreList;
    }
    public void setScoreList(List scoreList) {
        this.scoreList = scoreList;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    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 int getSex() {
        return sex;
    }
    public void setSex(int sex) {
        this.sex = sex;
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    @Override
    public String toString() {
        return "学生列表 [id=" + id + ", 姓名=" + name + ", 年龄=" + age + ", 性别=" + sex + ", 出生日期=" + birthday
                + ", 成绩列表=" + scoreList + "]";
    }       
    
}

定义获取成绩表类ScoreDao

package com.jdbc2.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.jdbc2.po.Score;
import com.jdbc2.util.DBUtils;

public class ScoreDao {
    // 根据学生编号查询成绩列表
    public List getListBySid(int sid) {
        // 数据库查询语句--当sid为?时查询出score表中所有信息
        String sql = "select * from score where sid = ?";
        // 建立连接数据库的对象,调用类DBUtils中的连接数据库的getConnection()方法
        Connection conn = DBUtils.getConnection();
          //定义一个成绩列表集合
        List list = new ArrayList();
        PreparedStatement pst = null;
        ResultSet rs = null;
        try {

            pst = conn.prepareStatement(sql);
            pst.setInt(1, sid);
            rs = pst.executeQuery();
            while (rs.next()) {
                // 利用多态获取值
                Score score = new Score();
                score.setId(rs.getInt("id"));
                score.setSid(rs.getInt("sid"));
                score.setCourse(rs.getString("course"));
                score.setScore(rs.getInt("score"));
                list.add(score);
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            DBUtils.closeConnection(conn, pst, null);
        }
        return list;
    }
}

定义获取学生信息表类StudentDao

package com.jdbc2.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.jdbc2.po.Student;
import com.jdbc2.util.DBUtils;

//date access object
public class StudentDao {
    public List getALL() {
        //数据库查询语句
        String sql = "select * from student";
        //建立连接
        Connection conn = DBUtils.getConnection();
        List list = new ArrayList();
        PreparedStatement pst = null;
        ResultSet rs = null;
        try {
            pst = conn.prepareStatement(sql);
            rs = pst.executeQuery();
            while (rs.next()) {
                // 利用多态获取值
                Student stu = new Student();
                stu.setId(rs.getInt("id"));
                stu.setName(rs.getString("name"));
                stu.setSex(rs.getInt("sex"));
                stu.setAge(rs.getInt("age"));
                stu.setBirthday(rs.getDate("birthday"));
                list.add(stu);
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            DBUtils.closeConnection(conn, pst, null);
        }
        return list;                
    }
}

定义工具类DBUtils

package com.jdbc2.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
//通过建立工具类DBUtils来对连接数据库和断开数据库所写的功能代码进行提取,因为增删改查的方法内都需要进行连接和断开数据库
//通过提取来进行代码优化
public class DBUtils {
    // 取得连接
    //用static修饰的时候访问没有限制
    public static Connection getConnection() {
      //相当于开启数据库mysql的钥匙
        String url = "jdbc:mysql://localhost:3306/jdbc";
          //用户名
        String user = "root";
          //密码
        String password = "root";
        Connection conn = null;

        try {
            // 引入数据库的连接驱动--重点:代码格式
            Class.forName("com.mysql.jdbc.Driver");
            // 连接数据库--需要(三个参数:连接地址 用户名 密码)
            conn = DriverManager.getConnection(url, user, password);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return conn;
    }
        //定义关闭资源closeConnection方法
    public static void closeConnection(Connection conn, Statement pst,ResultSet rs) {
        try {
                //注意if语句
            if (rs != null) {
                rs.close();
            }
            if (pst != null) {
                pst.close();
            }
            if (conn != null) {
                conn.close();
            }           
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

定义多表连接查询类StudentService

package c.jdbc3.service;

import java.util.ArrayList;
import java.util.List;
import org.omg.Messaging.SyncScopeHelper;
import com.jdbc2.dao.ScoreDao;
import com.jdbc2.dao.StudentDao;
import com.jdbc2.po.Score;
import com.jdbc2.po.Student;

public class StudentService {
    StudentDao stuDao = new StudentDao();
    ScoreDao scoreDao = new ScoreDao();
    // 查询学生以及成绩的列表
    public List getAllStu() {
        List stulist = new ArrayList();
        // 只查询到学生的基础信息列表
        stulist = stuDao.getALL();
        // 给每个学生设置成绩列表
        // for循环迭代将每个学生的成绩
        // 重点
        for (Student stu : stulist) {
        // 根据学生的id--stu.getId()来获得这个学生的成绩列表scoreList并逐一的放进stulist集合内
            List scoreList = scoreDao.getListBySid(stu.getId());
            stu.setScoreList(scoreList);
        }
        //最后返回包含scoreList列表的stulist集合,即完成了两个表的连接
        return stulist;
    }

    public static void main(String[] args) {
        // 新建StudentService的对象
        StudentService service = new StudentService();
        // 用对象service来调用本类中的getAllStu方法来获取最后两张表连接后的集合stulist,然后定义一个新的集合list来接
        List list = service.getAllStu();
        //通过迭代器遍历list集合即可获得相应的集合内容
        for  (Student stu : list) {
            System.out.println(stu);
        }
        System.out.println("------------------------------");
          //只获取集合中的想要获取的信息
        //循环迭代出scorelist表中的元素(包括成绩)
                //重点
        //此处迭代的list集合的内容即是上面的返回的stulist集合中的内容
        //通过双重遍历集合来获取学生类和成绩类中的姓名和课程以及成绩
        for (Student stu : list) {
      //定义新的集合scorelist来接通过对象stu调用getScoreList()方法获得的成绩列表集合
    //因为getScoreList()方法在Student类中,所以需要外面的for迭代器
            List scorelist = stu.getScoreList();            
            for (Score score : scorelist) {
                System.out.println("学生姓名:" + stu.getName() +  "  课程:" 
            + score.getCourse() + "  成绩:" + score.getScore() + "分" );
            }
            }
        }       
    }

代码实现界面

查询界面

mysql数据成绩score列表界面

mysql数据学生student列表界面

你可能感兴趣的:(JDBC中的多表查询)