19-JDBC(数据库)

这篇博客详细介绍了Java数据库连接(JDBC),包括JDBC的概念、体系结构、使用步骤、核心组件、多表操作、事务处理、工具类的使用,以及连接池的应用。同时,还提供了航空信息系统的练习和JDBC的发展历程。
摘要由CSDN通过智能技术生成

感谢你的路过,希望学生的笔记能给你一点微不足道的参考
Java基础思维导图,完整Java体系的链接
在这里插入图片描述

一,概念

   Java DataBase Connectivity Java 数据库连接, Java语言操作数据库
   Java具有坚固、安全、易于使用、易于理解和可从网络上自动下载等特性,是编写数据库应用程序的杰出言。所需要的只是 Java应用程序与各种不同数据库之间进行对话的方法。
   JDBC可以在各种平台上使用Java,如Windows,Mac OS和各种版本的UNIX。
   JDBC库包括通常与数据库使用相关的下面提到的每个任务的API。 - 连接数据库。 - 创建SQL或MySQL语句。 - 在数据库中执行SQL或MySQL查询。 - 查看和修改生成的记录。

二,JDBC体系结构

   JDBC API支持用于数据库访问的两层和三层处理模型,但通常,JDBC体系结构由两层组成:
      - JDBC API:这提供了应用程序到JDBC管理器连接。
      - JDBC驱动程序API:这支持JDBC管理器到驱动程序连接。
      JDBC API使用驱动程序管理器和特定于数据库的驱动程序来提供与异构数据库的透明连接。
在这里插入图片描述

三,使用步骤:

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

四,JDBC核心组件

DriverManager:驱动管理对象
	 功能:
		1. 注册驱动:告诉程序该使用哪一个数据库驱动jar
		注意:mysql5之后的驱动jar包可以省略注册驱动的步骤
		2. 获取数据库连接:
		* 方法:static Connection getConnection(String url, String user, String password) 
		* 参数:
		* url:指定连接的路径
			* 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称
			* 例子:jdbc:mysql://localhost:3306/db3
			* 细节:如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则url可以简写为:jdbc:mysql:///数据库名称
		* user:用户名
		* password:密码 
		Driver:此接口处理与数据库服务器的通信,我们很少会直接与Driver对象进行交互。而是使DriverManager对象来管理这种类型的对象。
 Connection:数据库连接对象
	功能:
		1. 获取执行sql 的对象
			* Statement createStatement()
			* PreparedStatement prepareStatement(String sql)  
		2. 管理事务:
			* 开启事务:setAutoCommit(boolean autoCommit) :调用该方法设置参数为false,即开启事务
			* 提交事务:commit() 
			* 回滚事务:rollback() 
Statement:执行sql的对象(状态通道)
	使用从此接口创建的对象将SQL语句提交到数据库。除了执行存储过程之外,一些派生接口还接受参数。 
	执行sql
		1. boolean execute(String sql) :可以执行任意的sql 了解 
		2. int executeUpdate(String sql) :执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句
		* 返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。
		3. ResultSet executeQuery(String sql)  :执行DQL(select)语句
	练习:
		1. account表 添加一条记录
		2. account表 修改记录
		3. account表 删除一条记录
		4,创建表
ResultSet:结果集对象,封装查询结果
	* boolean next(): 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true
	* getXxx(参数):获取数据
		* Xxx:代表数据类型   如: int getInt() ,	String getString()
		* 参数:
			1. int:代表列的编号,从1开始   如: getString(1)
			2. String:代表列名称。 如: getDouble("balance")
	* 注意:
		* 使用步骤:
			1. 游标向下移动一行
			2. 判断是否有数据
			3. 获取数据
	练习:
		* 定义一个方法,查询emp表的数据将其封装为对象,然后装载集合,返回。
			1. 定义em类
			2. 定义方法 public List<em> findAll(){}
			3. 实现方法 select * from em;
	SQLException:此类处理数据库应用程序中发生的任何错误

代码:
再使用jdbc代码过程中会使用的jar包。在这里插入图片描述

package com.wyh.CaoZuoBuZhou;

import java.sql.*;

/**
 * @Deacription jdbc操作步骤
 * @Author 王宇辉
 * @Date 2021/9/23 7:52
 * @Version 1.0
 **/
public class Demo01_jdbc {
   

    /**
     * 执行其他操作时,只需要改一下sql语句及 statement.方法
     * executeUpdata(sql); 执行增删改时使用
     * @param args
     */
    public static void main(String[] args) {
   
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null; // 结果集

        // 1,加载驱动
        try {
   
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 2,获得链接
            String userName = "root";
            String passWord = "123654qw";
            String url = "jdbc:mysql://localhost:3306/test?serverTimezone=UTC";
            connection = DriverManager.getConnection(url, userName, passWord);
            // 3,定义SQl,创建连接通道
            statement = connection.createStatement();
            String sql = "select * from student"; // 定义sql语句
            resultSet = statement.executeQuery(sql);
            // 4,取出结果集信息
            while(resultSet.next()){
   
            // 取出数据 resultSet.getXXX("列名"); xxx表示数据类型
            System.out.println("姓名:"+resultSet.getString("stuname")+",电话:"+resultSet.getDouble("telphone"));
            }
        } catch (ClassNotFoundException e) {
   
            e.printStackTrace();
        }catch (SQLException e) {
   
            e.printStackTrace();
        } finally {
   
            // 5,关闭资源
            try {
   
                if (resultSet != null){
    resultSet.close();}
                if (statement != null){
     statement.close();}
                if (connection != null){
   connection.close();}
            } catch (SQLException e) {
   
                e.printStackTrace();
            }
        }
    }
}

五,多表操作

   四种:双向一对一,一对多,多对一,
   多对多 多表关系处理数据
      (1) 数据库通过外键建立两表关系
      (2) 实体类通过属性的方式建立两表关系 实体类要求:类名=表名,列名=属性名
代码:

package com.wyh.DuoBiaoGuanXi.dao;

import com.wyh.DuoBiaoGuanXi.bean.Student;
import com.wyh.DuoBiaoGuanXi.bean.Subject;

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

import com.wyh.DuoBiaoGuanXi.bean.Student;
import com.wyh.DuoBiaoGuanXi.bean.Teacher;

import java.util.List;

/**
 * @Deacription TODO
 * @Author 王宇辉
 * @Date 2021/9/23 22:44
 * @Version 1.0
 **/
public interface TeacherDao {
   
    //定义操作方法
    //1.定义一个根据老师id查询老师信息(学生的信息)
    public Teacher getById(int tid);

    //查询所有的学生(包含老师的信息)
    public List<Student> getAll();
}
package com.wyh.DuoBiaoGuanXi.dao;

import com.wyh.DuoBiaoGuanXi.bean.Husband;
import com.wyh.DuoBiaoGuanXi.bean.Wife;

public interface WifeDao {
   
    //查询妻子信息(包含丈夫信息)
    public Wife getWife(int wid);
    //查询丈夫信息(包含妻子信息)
    public Husband getHus(int hid);
}
package com.wyh.DuoBiaoGuanXi.dao.impl;

import com.wyh.DuoBiaoGuanXi.bean.Student;
import com.wyh.DuoBiaoGuanXi.bean.Subject;
import com.wyh.DuoBiaoGuanXi.dao.SubjectDao;

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

/**
 * @Deacription TODO
 * @Author 王宇辉
 * @Date 2021/9/24 6:58
 * @Version 1.0
 **/
public class SubjectDaoImpl implements SubjectDao {
   

    @Override
    public Student 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="123654qw";
            String url="jdbc:mysql://localhost:3306/jdbc_duobiaoguanxi?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();
            Student student = new Student();
            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="123654qw";
            String url="jdbc:mysql://localhost:3306/jdbc_duobiaoguanxi?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<Student> studentList=new ArrayList<>();
            while (resultSet.next()){
   
                //1.取出各自的信息
                Student student = new Student();
                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.setStudentList(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;
    }
}
package com.wyh.DuoBiaoGuanXi.dao.impl;

import com.wyh.DuoBiaoGuanXi.bean.Student;
import com.wyh.DuoBiaoGuanXi.bean.Teacher;
import com.wyh.DuoBiaoGuanXi.dao.TeacherDao;

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

/**
 * @Deacription TODO
 * @Author 王宇辉
 * @Date 2021/9/23 22:46
 * @Version 1.0
 **/
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="123654qw";
            String url="jdbc:mysql://localhost:3306/jdbc_duobiaoguanxi?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);
            //给占位符赋值 (下标,内容) 从1开始
            pps.setInt(1,tid);
            //执行sql
            resultSet = pps.executeQuery();
            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"));
                //2.建立学生和老师之间的关系
                students.add(student);
            }
            teacher.setStudents(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();
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值