目录

2、Java JDBC 的核心组件有哪些?

3、如何使用JDBC API?

4、DriverManager 和 DataSource 的区别

5、如何使用DataSource进行数据库连接?


        Java JDBC (Java Database Connectivity)是Java语言中用于访问数据库的API。JDBC API提供了一组标准的接口,允许Java应用程序通过使用标准SQL查询语言访问和操作关系型数据库。使用JDBC API,开发人员可以编写可以在各种关系数据库上运行的Java应用程序。

允许开发人员连接到数据库、(2)执行SQL查询和更新、(3)检索结果并管理数据库连接。JDBC驱动程序是用于连接到特定数据库的库,它们实现了JDBC接口,允许开发人员使用JDBC API与不同的数据库交互。

        下面这个简单的代码片段给出了这三个步骤的简单示例:(来自Oracle)

public void connectToAndQueryDatabase(String username, String password) {

    Connection con = DriverManager.getConnection( 
                         "jdbc:myDriver:myDatabase",
                         username,
                         password);

    Statement stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");

    while (rs.next()) {
        int x = rs.getInt("a");
        String s = rs.getString("b");
        float f = rs.getFloat("c");
    }
}

2、Java JDBC 的核心组件有哪些?

        Java JDBC 的核心组件包括以下几个:

        (1)DriverManager:是一个用于管理 JDBC 驱动程序的基础服务。它负责加载并注册 JDBC 驱动程序,并提供了一种方法来建立数据库连接。

        (2)Connection:表示与数据库的连接,它提供了一组方法来管理数据库事务、提交更改、回滚事务以及创建 Statement、PreparedStatement 和 CallableStatement 对象。

        (3)Statement:表示一个简单的 SQL 语句,并提供了一组方法来执行 SQL 查询和更新,并返回结果集。

  • PreparedStatement:继承自 Statement 接口,可以更有效地执行参数化 SQL 语句,它允许使用占位符来指定参数,并将参数值绑定到占位符上。
  • CallableStatement:继承自 PreparedStatement 接口,用于执行存储过程,它提供了一种方法来调用数据库中的存储过程,并可以接收存储过程的输出参数。

        (4)ResultSet:表示 SQL 查询返回的结果集,它提供了一组方法来检索查询结果,并可以移动指针来访问结果集中的每一行。

        以上这些核心组件是 Java JDBC 编程中最常用的部分,使用它们可以完成对数据库的连接、查询、更新和事务管理等基本操作。

// 可以发现上述组件基本上是一环套一环,Manager加载和注册驱动,然后创建Connection,然后由Connection创建Statement,并由Statement产生结果集。

3、如何使用JDBC API?

        使用JDBC API的基本步骤包括:

  1. 加载适当的JDBC驱动程序
  2. 建立到数据库的连接
  3. 创建一个Statement对象,用于执行SQL查询或更新
  4. 执行SQL查询或更新
  5. 处理查询结果或更新的结果
  6. 关闭连接和相关对象

        下面是一个使用Java JDBC建立数据库连接并执行查询的示例代码:

import java.sql.*;

public class JdbcExample {
   // JDBC driver名称和数据库URL
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
   static final String DB_URL = "jdbc:mysql://localhost/test";

   // 数据库用户和密码
   static final String USER = "root";
   static final String PASS = "password";

   public static void main(String[] args) {
      Connection conn = null;
      Statement stmt = null;
      try{
         // 注册 JDBC 驱动
         Class.forName(JDBC_DRIVER);

         // 建立数据库连接
         conn = DriverManager.getConnection(DB_URL, USER, PASS);

         // 执行查询
         stmt = conn.createStatement();
         String sql = "SELECT id, name, age FROM employees";
         ResultSet rs = stmt.executeQuery(sql);

         // 处理结果集
         while(rs.next()){
            // 通过列名获取数据
            int id  = rs.getInt("id");
            String name = rs.getString("name");
            int age = rs.getInt("age");

            // 输出结果
            System.out.print("ID: " + id);
            System.out.print(", Name: " + name);
            System.out.println(", Age: " + age);
         }
         // 关闭结果集、语句和连接
         rs.close();
         stmt.close();
         conn.close();
      } catch(SQLException se){
         // 处理 JDBC 错误
         se.printStackTrace();
      } catch(Exception e){
         // 处理 Class.forName 错误
         e.printStackTrace();
      } finally{
         // 关闭资源
         try{
            if(stmt!=null) stmt.close();
         } catch(SQLException se2){
         } try{
            if(conn!=null) conn.close();
         } catch(SQLException se){
            se.printStackTrace();
         }
      }
   }
}

        上述代码首先通过 Class.forName() 方法加载 JDBC 驱动程序,然后使用 DriverManager.getConnection() 方法建立数据库连接。接着使用 Connection.createStatement() 方法创建一个 Statement 对象,用于执行 SQL 查询,使用 Statement.executeQuery() 方法执行查询并获取结果集,最后通过 ResultSet 对象处理结果集。

        在代码的末尾,使用 ResultSet.close()Statement.close()Connection.close() 方法分别关闭结果集、语句和连接。同时,使用 try-catch-finally 块来处理异常和关闭资源。

        请注意,上述代码中的数据库连接字符串和数据库用户和密码应该替换为您自己的值。

4、DriverManager 和 DataSource 的区别

        在Java JDBC中,DriverManager和DataSource都是用于建立数据库连接的组件,但它们有以下区别:

        (1)DriverManager是一个基础服务,DataSource是一个高级服务。

        DriverManager(java.sql)是JDBC API的核心服务之一,它负责加载并注册JDBC驱动程序,并提供了一种方法来建立数据库连接。而DataSource(javax.sql)是一种更高级别的数据库连接管理器,它提供了更多的功能和配置选项。

        (2)DriverManager是静态的,DataSource是动态的。

JNDI(Java命名和目录接口)获取。// 什么是JNDI,后续文章会有介绍

DriverManager没有连接池管理功能,DataSource可以管理连接池。

// 连接池非常的重要,可以避免连接反复创建

        (4)DataSource可以提供更高级的配置和安全功能。

        DataSource提供了更多的配置选项,如连接超时、事务隔离级别等,可以通过这些选项来优化连接的性能和可靠性。此外,DataSource还可以提供安全功能,如加密传输、身份验证等,以保护连接和数据的安全性。

// 顺便说一下,Oracle官方推荐使用DataSource

5、如何使用DataSource进行数据库连接?

        在Java JDBC中,使用DataSource连接数据库需要遵循以下步骤:

  1. 选择一个DataSource实现:Java提供了多种DataSource实现,如BasicDataSource、DriverManagerDataSource、ComboPooledDataSource等。选择适合自己的DataSource实现。
  2. 配置DataSource:配置DataSource对象需要指定数据库连接的URL、用户名、密码等信息。这些信息可以通过DataSource对象的setter方法来设置。
  3. 获取Connection对象:DataSource对象可以通过调用getConnection()方法来获取Connection对象。该方法返回一个Connection对象,表示与数据库的连接。
  4. 执行SQL语句:Connection对象可以通过创建Statement或PreparedStatement对象来执行SQL语句。
  5. 关闭连接:在使用完Connection对象后,需要及时关闭连接。可以通过调用Connection对象的close()方法来关闭连接。

        以下是一个使用DataSource连接数据库的示例代码:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.sql.DataSource;

public class Example {

    public static void main(String[] args) throws Exception {
        // 选择一个DataSource实现
        DataSource dataSource = new BasicDataSource();
        
        // 配置DataSource
        ((BasicDataSource) dataSource).setUrl("jdbc:mysql://localhost:3306/mydatabase");
        ((BasicDataSource) dataSource).setUsername("username");
        ((BasicDataSource) dataSource).setPassword("password");
        
        // 获取Connection对象
        Connection connection = dataSource.getConnection();
        
        // 执行SQL语句
        PreparedStatement statement = connection.prepareStatement("SELECT * FROM mytable");
        ResultSet resultSet = statement.executeQuery();
        while (resultSet.next()) {
            // 处理结果集
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            System.out.println(id + ": " + name);
        }
        
        // 关闭连接
        resultSet.close();
        statement.close();
        connection.close();
    }
}

  // DataSource 有多种实现(由驱动程序供应商实现),可以灵活进行选择。