十分钟学会JDBC

 JDBC全称Java DataBase Connectivity。我们主要使用的是JDBC API。

 JDBC API是一个Java API可以访问任何类型的数据库的数据,尤其是存储在关系数据库中的数据。

 JDBC的工作原理与Java在各种平台一样,如Windows,Mac OS和各种版本的UNIX系统。从根本上说,JDBC是一种规范,它提供的接口,一套完整的,可移植的访问底层数据库的程序。

 JDBC代表java与数据库的连接,是Java编程语言和广泛的数据库之间独立与数据库的标准javaAPI。

 JDBC库中所包含的API通常与数据库使用于:

  • 连接到数据库
  • 创建SQL或MySQL语句
  • 在数据库中执行SQL或MySQL查询
  • 查看和修改数据库中的数据记录

 JDBC架构

  • JDBC API:提供了应用程序对JDBC的连接管理。

  • JDBC Driver:提供了与数据库驱动的连接。

  • JDBC API 通过驱动程序管理器来同通过不同的数据库驱动管理不同的数据库。

  • JDBC驱动管理器(JDBC Driver Manager)可以确保正确的驱动程序来访问每个数据源,且可以支持连接到多个异构数据库的多个并发的驱动程序

异构数据库:异构数据库系统是相关的多个数据库系统的集合,可以实现数据的共享和透明访问,几个数据库系统在加入异构数据库系统之前本身就已经存在,拥有自己的数据阵管理系统、外构数据库的各个组成部分具有自身的自治性,实现数据共享的同时,每个数据库系统仍有自己的应用特性、完整性控制和安全性控制。

结构

 使用JDBC的前提条件是:

  • JDK安装
  • 安装数据库以及对应的数据库驱动程序

常用类和接口

  • DriverManager:

 管理数据库驱动程序的列表(DriverManager管理Driver对象)。确定内容是否符合从Java应用程序使用的通信子协议正确的数据库驱动程序的连接请求。识别JDBC在一定子协议的第一个驱动器将被用来建立数据库连接。

  • Driver:

 此接口处理与数据库服务器的通信。很少直接直接使用Driver对象,一般使用DriverManager返回的Driver对象。

  • Connection :

 此接口用与接触数据库的所有方法。连接对象通信的上下文,即,与数据库中的所有的通信是通过此唯一的连接对象。

  • Statement :

 使用这个接口创建对象的SQL语句并提交到数据库。

  • ResultSet:

 保存使用Statement对象传递的SQL语句查询到的结果。它是一个迭代器,可以像使用Iterator对象一样使用ResultSet。

  • SQLException:

 这个类用于处理发生在数据库操作过程中的异常。

创建JDBC应用程序

 创建一个JDBC应用程序,有以下五个步骤。

1. 加载数据库驱动程序

 以MySQL为例,我们先要在MySQL的官网(Oracle官网)下载驱动程序,然后将驱动程序添加到CLASSPATH中,添加方法如下:

1

2

3

 然后将驱动包在程序中实例化即可。

// 加载驱动
Class.forName("com.mysql.jdbc.Driver");

2. 创建与数据库的连接

 在使用数据库之前要先和数据库进行连接。我们使用DriverManager类提供的方法来获取数据库的Connection对象。

// 获取Connection对象通常有两种方式:一种是通过DriverManager的静态方法获取,一种是通过DataSource(数据源)对象获取,这里演示前者

String url = "jdbc:mysql://localhost:3306/scott?user=root&password=xucc&useSSL=true";
connection = DriverManager.getConnection(url);

 getConnection的参数是一个url协议,DriverManager通过它与指定数据库进行连接,的格式如下

mysql://主机名:端口号/数据库名?user=用户名&password=密码”

3. 执行一个查询

 执行SQL语句需要借助Statement或PreparedStatement的对象,并将要执行的一个SQL语句作为参数传入数据库执行。这里以查询语句为例。

// 1. 创建SQL语句
String sqlCommand = "select * from emp";

// 2. 使用statement对象将SQL语句发送到数据库中
Statement statement = connection.createStatement();
statement.executeQuery(sqlCommand);

 传入查询语句我们使用Statement的executeQuery()方法,如果执行的是update,insert,delete等修改语句,就要使用executeUpdate方法。

4. 得到查询结果

 使用executeQuery()方法执行数据库查询语句会返回一个查询结果,可以使用Result类的get()方法进行获取。使用如下:

// 查询结果
resultSet = statement.executeQuery(sqlCommand);

// 结果处理
while (resultSet.next()) {
    // get方法接收字段名或字段的下标,下标从1开始
    String ename = resultSet.getString("ename");
    int empno = resultSet.getInt("empno");
    double sal = resultSet.getInt("sal");
    String job = resultSet.getString("job");

    String str = String.format(
            "ename = %s, empno = %d, sal = %f, job = %s",
            ename, empno, sal, job
    );
    System.out.println(str);
}

5. 资源关闭

 在使用JDBC操作完数据库后,应该明确地关闭所有的数据库资源以减少资源的浪费,一般来说,JDBC操作主要使用了Connection,Statement和ResultSet三个类,所以对它们的对象进行关闭。

// 资源关闭在finally块中进行
finally {
    // 从里至外关闭
    if(resultSet != null) {
        try {
            resultSet.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    if(statement != null) {
        try {
            statement.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    if(connection != null) {
        try {
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

 一个完整的JDBC查询操作如下:

import java.sql.*;

public class Test {

    public static void jdbcStep() {
        // 数据库连接
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            // 加载驱动
            Class.forName("com.mysql.jdbc.Driver");

            // 连接数据库,这里我使用的是scott数据库
            String url = "jdbc:mysql://localhost:3306/scott?user=root&password=root&useSSL=true";
            connection = DriverManager.getConnection(url);

            // 创建SQL命令
            // 1. 创建语句
            String sqlCommand = "select * from emp";

            // 2. 使用statement对象将SQL语句发送到数据库中
            statement = connection.createStatement();

            // 查询结果
            resultSet = statement.executeQuery(sqlCommand);

            // 结果处理
            while (resultSet.next()) {
                // 接收字段名或列下标,从1开始
                String ename = resultSet.getString("ename");
                int empno = resultSet.getInt("empno");
                double sal = resultSet.getInt("sal");
                String job = resultSet.getString("job");

                String str = String.format(
                        "ename = %s, empno = %d, sal = %f, job = %s",
                        ename, empno, sal, job
                );
                System.out.println(str);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 从里至外关闭
            if(resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if(statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if(connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {
        jdbcStep();
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_40739833/article/details/80748010