JDBC介绍及操作

目录

1. 简介

2. 使用步骤

3. JDBC连接步骤

4. 案例Demo

Demo1-Demo3数据文件

Demo1: SQL查询语句实现

Demo2: SQL更新语句实现

Demo3: SQL查询语句预状态实现(?代替查询值)

Demo4:SQL多表查询1对多查询语句实现(包括Teacher,Student类,TeacherDao,TeacherDaoImpl)

数据文件:

实体类Teacher:

实体类Student:

Dao接口:

实现类:

测试类:

Demo5: SQL多表查询多对1查询语句实现(包括Teacher1,Student1类,TeacherDao1,TeacherDaoImpl1)

实体类Teacher1:

实体类Student1:

Dao接口类:

实现类:

测试类:

Demo6: SQL多表查询1对1查询语句实现(包括Husband,Wife类,WifeDao,WifeDaoImpl)

数据文件:

实体类Husband:

实体类Wife:

Dao接口类:

实现类:

测试类:

Demo7: SQL多表查询多对多查询语句实现(包括Subject,Student2类,SubjectDao,SubjectDaoImpl)

数据文件:

实体类Subject:

实体类Student2:

Dao接口类:

实现类:

测试类:


1. 简介

JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种 关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以 构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序
Java 具有坚固、安全、易于使用、易于理解和可从网络上自动下载等特性,是编写数据库应用程序的杰 出语言。所需要的只是 Java应用程序与各种不同数据库之间进行对话的方法。
JDBC可以在各种平台上使用Java,如Windows,Mac OS和各种版本的UNIX。 JDBC库包括通常与数据库使用相关的下面提到的每个任务的API。
- 连接数据库。
- 创建SQL或MySQL语句。
- 在数据库中执行SQL或MySQL查询。 - 查看和修改生成的记录。

2. 使用步骤


构建JDBC应用程序涉及以下六个步骤:

  1. - 导入包:需要包含包含数据库编程所需的JDBC类的包。大多数情况下,使用import java.sql.*就足够了。
  2. - 注册JDBC驱动程序:要求您初始化驱动程序,以便您可以打开与数据库的通信通道。
  3. - 打开连接:需要使用DriverManager.getConnection()方法创建一个Connection对象,该对象表 示与数据库的物理连接。
  4. - 执行查询:需要使用类型为Statement的对象来构建和提交SQL语句到数据库。
  5. - 从结果集中提取数据:需要使用相应的ResultSet.getXXX()方法从结果集中检索数据。
  6. - 释放资源:需要明确地关闭所有数据库资源,而不依赖于JVM的垃圾收集

3. JDBC连接步骤

- 导入JDBC包:将Java语言的*import*语句添加到Java代码中导入所需的类。
- 注册JDBC驱动程序:此步骤将使JVM将所需的驱动程序实现加载到内存中,以便它可以满足您的JDBC 请求。
- 数据库URL配置:这是为了创建一个格式正确的地址,指向要连接到的数据库。
- 创建连接对象:最后,调用DriverManager对象的getConnection()方法来建立实际的数据库连
接。Class.forName();

- 数据库URL配置

 - 创建数据库连接对象

String URL = "jdbc:mysql://localhost:3306/databasename?serverTimezone=UTC";
String USER = "username";
String PASS = "password"
Connection conn = DriverManager.getConnection(URL, USER, PASS);

-  关闭数据库连接(conn.close())

4. 案例Demo

  • Demo1: SQL查询语句实现
  • Demo2: SQL更新语句实现
  • Demo3: SQL查询语句预状态实现(?代替查询值)
  • Demo4: SQL多表查询1对多查询语句实现(包括Teacher,Student类,TeacherDao,TeacherDaoImpl)
  • Demo5: SQL多表查询多对1查询语句实现(包括Teacher1,Student1类,TeacherDao1,TeacherDaoImpl1)
  • Demo6: SQL多表查询1对1查询语句实现(包括Husband,Wife类,WifeDao,WifeDaoImpl)
  • Demo7: SQL多表查询多对多查询语句实现(包括Subject,Student2类,SubjectDao,SubjectDaoImpl)

Demo1-Demo3数据文件

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for department
-- ----------------------------
DROP TABLE IF EXISTS `department`;
CREATE TABLE `department` (
  `depid` varchar(4) DEFAULT NULL,
  `depname` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of department
-- ----------------------------
BEGIN;
INSERT INTO `department` VALUES ('111', '生产部');
INSERT INTO `department` VALUES ('222', '销售部');
INSERT INTO `department` VALUES ('333', '人事部');
COMMIT;

-- ----------------------------
-- Table structure for employee
-- ----------------------------
DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee` (
  `empid` varchar(5) DEFAULT NULL,
  `name` varchar(10) DEFAULT NULL,
  `sex` char(3) DEFAULT NULL,
  `title` varchar(20) DEFAULT NULL,
  `birthday` date DEFAULT NULL,
  `depid` varchar(4) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of employee
-- ----------------------------
BEGIN;
INSERT INTO `employee` VALUES ('1001', '张三', '男', '高级工程师', '1975-01-01', '111');
INSERT INTO `employee` VALUES ('1002', '李四', '女', '助工', '1985-01-01', '111');
INSERT INTO `employee` VALUES ('1003', '王五', '男', '工程师', '1978-11-11', '222');
INSERT INTO `employee` VALUES ('1004', '赵六', '男', '工程师', '1979-01-01', '222');
COMMIT;

-- ----------------------------
-- Table structure for salary
-- ----------------------------
DROP TABLE IF EXISTS `salary`;
CREATE TABLE `salary` (
  `empid` varchar(5) DEFAULT NULL,
  `basesalary` int(11) DEFAULT NULL,
  `titlesalary` int(11) DEFAULT NULL,
  `deduction` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of salary
-- ----------------------------
BEGIN;
INSERT INTO `salary` VALUES ('1001', 2200, 1100, 200);
INSERT INTO `salary` VALUES ('1002', 1200, 200, 100);
INSERT INTO `salary` VALUES ('1003', 1900, 700, 200);
INSERT INTO `salary` VALUES ('1004', 1950, 700, 150);
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;

Demo1: SQL查询语句实现

import java.sql.*;

import static java.lang.Class.forName;

/**
 * SQL查询语句
 */

public class Demo1 {
    public static void main(String[] args) {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            //1.加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.获得链接
            String username="root";
            String password="12345678";
            String url="jdbc:mysql://localhost:3306/JavaTest?serverTimezone=UTC";
            connection = DriverManager.getConnection(url, username, password);
            //3.定义sql,创建状态通道(进行sql语句的发送)
            statement = connection.createStatement();
            resultSet  = statement.executeQuery("SELECT * FROM employee");
            //4.去除结果集信息
            //判断是否有下一下数据
            while(resultSet.next()){
                System.out.println("姓名:"+resultSet.getString("name")+
                        "职称:"+resultSet.getString("title")+
                        "生日:"+resultSet.getString("birthday"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            try{
                //5.关闭资源
                if(resultSet != null){
                    resultSet.close();
                }
                if(statement != null){
                    statement.close();
                }
                if(connection != null){
                    connection.close();
                }

            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

Demo2: SQL更新语句实现

import java.sql.*;

import static java.lang.Class.forName;
/**
 * SQL更新UPDATE语句
 */
public class Demo2 {
    public static void main(String[] args) {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            //1.加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.获得链接
            String username="javatest";
            String password="123456";
            String url="jdbc:mysql://47.112.110.144:3306/JAVATest?serverTimezone=UTC";
            connection = DriverManager.getConnection(url, username, password);
            //3.定义sql,创建状态通道(进行sql语句的发送)
            statement = connection.createStatement();
            int result  = statement.executeUpdate("UPDATE employee SET title = '工程师'");
            if(0 < result){
                System.out.println("执行成功");
            }else{
                System.out.println("执行失败");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            try{
                //5.关闭资源
                if(statement != null){
                    statement.close();
                }
                if(connection != null){
                    connection.close();
                }

            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

Demo3: SQL查询语句预状态实现(?代替查询值)

import java.sql.*;

import static java.lang.Class.forName;

/**
 * 预状态通道
 * SQL查询语句
 */

public class Demo3 {
    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement pps= null;
        ResultSet resultSet = null;
        try {
            //1.加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.获得链接
            String username="javatest";
            String password="123456";
            String url="jdbc:mysql://47.112.110.144:3306/JAVATest?serverTimezone=UTC";
            connection = DriverManager.getConnection(url, username, password);
            //3.定义sql,创建预状态通道(进行sql语句的发送)
            String sql = "SELECT * FROM employee WHERE name = ? AND title = ?";
            pps = connection.prepareStatement(sql);
            //给占位符?进行赋值(下标,内容)下标是从1开始
            pps.setString(1,"张三");
            pps.setString(2,"工程师");
            resultSet  = pps.executeQuery();
            //4.去除结果集信息
            //判断是否有下一下数据
            while(resultSet.next()){
                System.out.println("姓名:"+resultSet.getString("name")+
                        "职称:"+resultSet.getString("title")+
                        "生日:"+resultSet.getString("birthday"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            try{
                //5.关闭资源
                if(resultSet != null){
                    resultSet.close();
                }
                if(pps != null){
                    pps.close();
                }
                if(connection != null){
                    connection.close();
                }

            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

Demo4:SQL多表查询1对多查询语句实现(包括Teacher,Student类,TeacherDao,TeacherDaoImpl)

数据文件:

CREATE TABLE `student` (
  `stuid` int(11) NOT NULL AUTO_INCREMENT,
  `stuname` varchar(255) DEFAULT NULL,
  `teacherid` int(11) 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', 'bb', '1');
INSERT INTO `student` VALUES ('3', 'cc', '3');
INSERT INTO `student` VALUES ('4', 'dd', '1');
INSERT INTO `student` VALUES ('5', 'ee', '1');
INSERT INTO `student` VALUES ('6', 'ff', '2');
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher` (
  `tid` int(11) NOT NULL AUTO_INCREMENT,
  `tname` varchar(255) 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', '王五');

实体类Teacher:

import java.util.ArrayList;
import java.util.List;

//一个 老师对应多个学生
public class Teacher {
    private int tid;
    private String tname;
    //创建多方数据的集合
    private List<Student> list = new ArrayList<Student>();
    public List<Student> getList() {
        return list;
    }
    public void setList(List<Student> list) {
        this.list = list;
    }
    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;
    }
}

实体类Student:

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;
    } }

Dao接口:

public interface TeacherDao { //定义操作方法
    //1.定义一个根据老师id查询老师信息(学生的信息)
    public Teacher getById(int tid);
}

实现类:

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class TeacherDaoImpl implements TeacherDao {
    @Override
    public Teacher getById(int tid) { //操作数据库
        Connection connection =null;
        PreparedStatement pps =null;
        ResultSet resultSet =null;
        try {
            //1.加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.获得链接
            String userName="root";
            String passWord="12345678";
            String url="jdbc:mysql://localhost:3306/JavaTest?serverTimezone=UTC";
            connection = DriverManager.getConnection(url, userName, passWord);
            //3.定义sql,创建预状态通道(进行sql语句的发送)
            String sql="select * from student s join teacher t on s.teacherid=t.tid where t.tid=?";
            pps = connection.prepareStatement(sql);
            //给占位符赋值 (下标,内容) 从1开始
            pps.setInt(1,tid);
            //执行sql
            resultSet = pps.executeQuery();
            // 一个老师对应多个学生,创建一个新老师对象存储老师
            Teacher teacher = new Teacher();
            //创建list存储学生,循环存入学生信息
            List<Student> students = new ArrayList<Student>();
            while (resultSet.next()){
                //1.取出各自的信息
                teacher.setTid(resultSet.getInt("tid"));
                teacher.setTname(resultSet.getString("tname"));
                //2. 每次循环都把学生单独取出来
                Student student = new Student();
                student.setStuid(resultSet.getInt("stuid"));
                student.setStuname(resultSet.getString("stuname"));
                //3. 存入list中
                students.add(student);
            }
            // 把students赋值进teacher
            teacher.setList(students);
            return  teacher;
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            try {
                //5.关闭资源
                if (resultSet != null) {
                    resultSet.close();
                }
                if (pps != null) {
                    pps.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            } }
        return null;
    }
}

测试类:

import java.util.List;

public class Demo4 {
    public static void main(String[] args) {
    TeacherDao dao= new TeacherDaoImpl();
    Teacher teacher = dao.getById(1);
    System.out.println("老师姓名:"+teacher.getTname());
    List<Student> studentList = teacher.getList();
    for (Student student : studentList) {
        System.out.println("\t studentname="+student.getStuname());
        }
    }
}

Demo5: SQL多表查询多对1查询语句实现(包括Teacher1,Student1类,TeacherDao1,TeacherDaoImpl1)

实体类Teacher1:

import java.util.ArrayList;
import java.util.List;

//一个 老师对应多个学生
public class Teacher1 {
    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;
    }
}

实体类Student1:

public class Student1 {
    private int stuid;
    private String stuname;
    //外键列一般不生成属性
    // private int teacherid;
    private Teacher1 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 Teacher1 getTeacher() {
        return teacher;
    }
    public void setTeacher(Teacher1 teacher) {
        this.teacher = teacher;
    }
}

Dao接口类:

import java.util.List;

public interface TeacherDao1 { //定义操作方法
    //1.定义一个根据老师id查询老师信息(学生的信息)
    public List<Student1> getAll();
}

实现类:

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class TeacherDaoImpl1 implements TeacherDao1 {
    @Override
    public List<Student1> getAll() { //操作数据库
        Connection connection =null;
        PreparedStatement pps =null;
        ResultSet resultSet =null;
        try {
            //1.加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.获得链接
            String userName="root";
            String passWord="12345678";
            String url="jdbc:mysql://localhost:3306/JavaTest?serverTimezone=UTC";
            connection = DriverManager.getConnection(url, userName, passWord);
            //3.定义sql,创建预状态通道(进行sql语句的发送)
            String sql="select * from student s join teacher t on s.teacherid=t.tid";
            pps = connection.prepareStatement(sql);
            //执行sql
            resultSet = pps.executeQuery();
            //创建list存储学生,循环存入学生信息
            List<Student1> students = new ArrayList<>();
            while (resultSet.next()){
                //1.取出各自的信息
                Student1 student = new Student1();
                student.setStuid(resultSet.getInt("stuid"));
                student.setStuname(resultSet.getString("stuname"));

                Teacher1 teacher = new Teacher1();
                teacher.setTid(resultSet.getInt("tid"));
                teacher.setTname(resultSet.getString("tname"));

                student.setTeacher(teacher);
                students.add(student);
            }
            return  students;
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            try {
                //5.关闭资源
                if (resultSet != null) {
                    resultSet.close();
                }
                if (pps != null) {
                    pps.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            } }
        return null;
    }
}

测试类:

import java.util.List;

public class Demo5 {
    public static void main(String[] args) {
        TeacherDao1 dao= new TeacherDaoImpl1();
        List<Student1> students = dao.getAll();
        for (Student1 student : students) {
            System.out.println(student.getStuname()+","+student.getTeacher().getTname());
        }
        System.out.println("-----------------------------------------------------");
        for (int i = 0;i<students.size();i++) {
            System.out.println(students.get(i).getStuname()+","+students.get(i).getTeacher().getTname());
        }
    }
}

Demo6: SQL多表查询1对1查询语句实现(包括Husband,Wife类,WifeDao,WifeDaoImpl)

数据文件:

CREATE TABLE `husband` (
  `husid` int(11) NOT NULL AUTO_INCREMENT,
  `husname` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`husid`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
INSERT INTO `husband` VALUES ('1', '邓超');
DROP TABLE IF EXISTS `wife`;
CREATE TABLE `wife` (
  `wifeid` int(11) NOT NULL AUTO_INCREMENT,
  `wifename` varchar(255) DEFAULT NULL,
  `hid` int(11) DEFAULT NULL,
  PRIMARY KEY (`wifeid`),
  UNIQUE KEY `uq_wife_hid` (`hid`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
INSERT INTO `wife` VALUES ('1', '孙俪', '1');

实体类Husband:

public class Husband {
    private int husid;
    private String husname;
    private Wife wife;
    public int getHusid() {
        return husid;
    }
    public void setHusid(int husid) {
        this.husid = husid;
    }
    public String getHusname() {
        return husname;
    }
    public void setHusname(String husname) {
        this.husname = husname;
    }
    public Wife getWife() {
        return wife;
    }
    public void setWife(Wife wife) {
        this.wife = wife;
    }
}

实体类Wife:

public class Wife {
    private int wifeid;
    private String wifeName;
    private Husband husband;
    public int getWifeid() {
        return wifeid;
    }
    public void setWifeid(int wifeid) {
        this.wifeid = wifeid;
    }
    public String getWifeName() {
        return wifeName;
    }
    public void setWifeName(String wifename) {
        this.wifeName = wifename;
    }
    public Husband getHusband() {
        return husband;
    }
    public void setHusband(Husband husband) {
        this.husband = husband;
    }
}

Dao接口类:

public interface WifeDao {
    //查询妻子信息(包含丈夫信息)
    public Wife getWife(int wid); //查询丈夫信息(包含妻子信息)
    public Husband getHus(int hid) throws ClassNotFoundException;
}

实现类:

import java.sql.*;

public class WifeDaoImpl implements WifeDao {
    @Override
    public Wife getWife(int wid) {
        //操作数据库
        Connection connection =null;
        PreparedStatement pps =null;
        ResultSet resultSet =null;
        try {
            //1.加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.获得链接
            String userName="root";
            String passWord="12345678";
            String url="jdbc:mysql://localhost:3306/JavaTest?serverTimezone=UTC";
            connection = DriverManager.getConnection(url, userName, passWord);
            //3.定义sql,创建预状态通道(进行sql语句的发送)
            String sql="select * from wife w,husband h where w.hid=h.husid and w.wifeid=?";
            pps = connection.prepareStatement(sql);
            pps.setInt(1,wid);
            //执行sql
            resultSet = pps.executeQuery();
            Wife wife = new Wife();
            while (resultSet.next()){
            //1.取出各自的信息
                wife.setWifeid(resultSet.getInt("wifeid"));
                wife.setWifeName(resultSet.getString("wifename"));
                Husband husband = new Husband();
                husband.setHusid(resultSet.getInt("husid"));
                husband.setHusname(resultSet.getString("husname"));
                //2.建立妻子和丈夫之间的关系
                wife.setHusband(husband);
            }
            return wife;
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            try { //5.关闭资源
                if (resultSet != null) {
                    resultSet.close();
                }
                if (pps != null) {
                    pps.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            } }
        return null;
    }
    @Override
    public Husband getHus(int hid) {
        //操作数据库
        Connection connection =null;
        PreparedStatement pps =null;
        ResultSet resultSet =null;
        //1.加载驱动
        try {
            //1.加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.获得链接
            String userName="root";
            String passWord="12345678";
            String url="jdbc:mysql://localhost:3306/JavaTest?serverTimezone=UTC";
            connection = DriverManager.getConnection(url, userName, passWord);
            //3.定义sql,创建预状态通道(进行sql语句的发送)
            String sql="select * from wife w,husband h where w.hid=h.husid and h.husid=?";
            pps = connection.prepareStatement(sql);
            pps.setInt(1,hid);
            //执行sql
            resultSet = pps.executeQuery();
            Husband husband = new Husband();
            while (resultSet.next()){
                //1.取出各自的信息
                Wife wife = new Wife();
                wife.setWifeid(resultSet.getInt("wifeid"));
                wife.setWifeName(resultSet.getString("wifename"));
                husband.setHusid(resultSet.getInt("husid"));
                husband.setHusname(resultSet.getString("husname"));
                //2.建立妻子和丈夫之间的关系
                husband.setWife(wife);
            }
            return husband;
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            try { //5.关闭资源
                if (resultSet != null) {
                    resultSet.close();
                }
                if (pps != null) {
                    pps.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            } }
        return null;
    }
}

测试类:

public class Demo6 {
    public static void main(String[] args) {
        WifeDaoImpl wifeDao = new WifeDaoImpl();
        Wife wife = wifeDao.getWife(1);
        System.out.println(wife.getWifeName()+","+wife.getHusband().getHusname());
        Husband hus = wifeDao.getHus(1);
        System.out.println(hus.getHusname()+","+hus.getWife().getWifeName());
    }
}

Demo7: SQL多表查询多对多查询语句实现(包括Subject,Student2类,SubjectDao,SubjectDaoImpl)

数据文件:

CREATE TABLE `middle` (
  `middleid` int(11) NOT NULL AUTO_INCREMENT,
  `stuid` int(11) DEFAULT NULL,
  `subid` int(11) DEFAULT NULL,
  PRIMARY KEY (`middleid`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of middle
-- ----------------------------
INSERT INTO `middle` VALUES ('1', '1', '1');
INSERT INTO `middle` VALUES ('2', '1', '2');
INSERT INTO `middle` VALUES ('3', '1', '3');
INSERT INTO `middle` VALUES ('4', '1', '5');
INSERT INTO `middle` VALUES ('5', '2', '2');
INSERT INTO `middle` VALUES ('6', '3', '2');
INSERT INTO `middle` VALUES ('7', '4', '2');
INSERT INTO `middle` VALUES ('8', '5', '2');
INSERT INTO `middle` VALUES ('9', '6', '2');
-- ----------------------------
-- Table structure for `student`
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `stuid` int(11) NOT NULL AUTO_INCREMENT,
  `stuname` varchar(255) DEFAULT NULL,
  `teacherid` int(11) DEFAULT NULL,
  PRIMARY KEY (`stuid`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('1', '张三', '3'); INSERT INTO `student` VALUES ('2', '李四', '1'); INSERT INTO `student` VALUES ('3', '王五', '3'); INSERT INTO `student` VALUES ('4', '赵六', '1'); INSERT INTO `student` VALUES ('5', '花花', '1'); INSERT INTO `student` VALUES ('6', '潇潇', '2');
-- ----------------------------
-- Table structure for `subject`
-- ----------------------------
DROP TABLE IF EXISTS `subject`;
CREATE TABLE `subject` (
  `subid` int(11) NOT NULL AUTO_INCREMENT,
  `subname` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`subid`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of subject
-- ----------------------------
INSERT INTO `subject` VALUES ('1', 'java');
INSERT INTO `subject` VALUES ('2', 'ui');
INSERT INTO `subject` VALUES ('3', 'h5');
INSERT INTO `subject` VALUES ('4', 'c');
INSERT INTO `subject` VALUES ('5', 'c++');
INSERT INTO `subject` VALUES ('6', 'c#');

实体类Subject:

import java.util.List;

public class Subject {
    private int subid;
    private String subname;
    private List stulist;
    public int getSubid() {
        return subid;
    }
    public void setSubid(int subid) {
        this.subid = subid;
    }
    public String getSubname() {
        return subname;
    }
    public void setSubname(String subname) {
        this.subname = subname;
    }
    public List getStulist() {
        return stulist;
    }
    public void setStulist(List stulist) {
        this.stulist = stulist;
    }
}

实体类Student2:

import java.util.List;

public class Student2 {
    private int stuid;
    private String stuname;
    //外键列一般不生成属性
    private List<Subject> subjects;
    public List<Subject> getSubjects() {
        return subjects;
    }
    public void setSubjects(List<Subject> subjects) {
        this.subjects = subjects;
    }
    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;
    }
}

Dao接口类:

public interface SubjectDao {
    //查询某个学生信息(查询出所学科目)
    public Student2 findById(int id);
    //查询某个科目以及对应的学生姓名
    public Subject findBySubId(int subId);
}

实现类:

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class SubjectDaoImpl implements SubjectDao {
    @Override
    public Student2 findById(int id) { //操作数据库
        Connection connection =null;
        PreparedStatement pps =null;
        ResultSet resultSet =null;
        try {
            //1.加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.获得链接
            String userName="root";
            String passWord="12345678";
            String url="jdbc:mysql://localhost:3306/JavaTest?serverTimezone=UTC";
            connection = DriverManager.getConnection(url, userName, passWord);
            //3.定义sql,创建预状态通道(进行sql语句的发送)
            String sql="select * from student s,subject su,middle m where s.stuid=m.stuid and su.subid=m.subid and  s.stuid=?";
            pps = connection.prepareStatement(sql);
            pps.setInt(1,id);
            //执行sql
            resultSet = pps.executeQuery();
            Student2 student = new Student2();
            List<Subject> subjects=new ArrayList<>();
            while (resultSet.next()){
                //1.取出各自的信息
                student.setStuid(resultSet.getInt("stuid"));
                student.setStuname(resultSet.getString("stuname"));
                Subject subject = new Subject();
                subject.setSubid(resultSet.getInt("subid"));
                subject.setSubname(resultSet.getString("subname"));
                subjects.add(subject);
            } //2.建立学生和科目之间的关系
            student.setSubjects(subjects);
            return student;
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            try {
                //5.关闭资源
                if (resultSet != null) {
                    resultSet.close();
                }
                if (pps != null) {
                    pps.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();} }
        return null;
    }
    @Override
    public Subject findBySubId(int subId) {
        //操作数据库
        Connection connection =null;
        PreparedStatement pps =null;
        ResultSet resultSet =null; try {
            //1.加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.获得链接
            String userName="root";
            String passWord="12345678";
            String url="jdbc:mysql://localhost:3306/JavaTest?serverTimezone=UTC";
            connection = DriverManager.getConnection(url, userName, passWord);
            //3.定义sql,创建预状态通道(进行sql语句的发送)
            String sql="select * from student s,subject su,middle m where s.stuid=m.stuid and su.subid=m.subid and su.subid=?";
            pps = connection.prepareStatement(sql);
            pps.setInt(1,subId);
            //执行sql
            resultSet = pps.executeQuery();
            Subject subject = new Subject();
            List<Student2> studentList=new ArrayList<>();
            while (resultSet.next()){
                //1.取出各自的信息
                Student2 student = new Student2();
                student.setStuid(resultSet.getInt("stuid"));
                student.setStuname(resultSet.getString("stuname"));
                studentList.add(student);
                subject.setSubid(resultSet.getInt("subid"));
                subject.setSubname(resultSet.getString("subname"));
            }
//2.建立学生和科目之间的关系
        subject.setStulist(studentList);
            return subject;
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
            try {
//5.关闭资源
                if (resultSet != null) {
                    resultSet.close();
                }
                if (pps != null) {
                    pps.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        return null;
    }
}

测试类:

import java.util.List;

public class Demo7 {
    public static void main(String[] args) {
        SubjectDaoImpl subjectDao = new SubjectDaoImpl();
       /* Student2 student = subjectDao.findById(1);
        System.out.println(student.getStuName());
        List<Subject> subjects = student.getSubjects();
        for (Subject subject : subjects) {
            System.out.println("\t"+subject.getSubName());
        }*/
        Subject subject = subjectDao.findBySubId(2);
        System.out.println(subject.getSubname());
        List<Student2> studentList = subject.getStulist();
        for (Student2 student : studentList) {
            System.out.println("\t"+student.getStuname());
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值