什么是JDBC?Java数据库连接简介

54 阅读9分钟

什么是 JDBC?Java数据库连接简介

概述JDBC的架构,然后学习如何连接到数据库,并通过JDBC的PreparedStatements、事务、连接池等处理SQL查询和响应。

JDBC(Java Database Connectivity)是管理连接到数据库、发布查询和命令以及处理从数据库获得的结果集的Java API。1997年作为JDK 1.1的一部分发布,JDBC是为Java语言开发的最早的库之一。

JDBC最初被认为是一个客户端的API,使Java客户端能够与数据源交互。这种情况在JDBC 2.0中有所改变,它包括一个支持服务器端JDBC连接的可选包。从那时起,每一个新的JDBC版本都对客户端包(java.sql )和服务器端包(javax.sql )进行了更新。JDBC 4.3是截至本文写作时的最新版本,于2017年9月作为JSR 221作为Java SE 9的一部分发布。

本文介绍了JDBC和JDBC驱动的概况,然后是使用JDBC将Java客户端连接到轻量级关系数据库的实践介绍。

JDBC如何工作

作为一个开发者,你可以使用JDBC从一个Java程序中与数据库进行交互。JDBC就像一座从你的代码到数据库的桥梁,如图1所示:

图1.JDBC将Java程序连接到数据库。

JDBC与ODBC

在 JDBC 之前,开发人员使用开放数据库连接(ODBC),这是一种访问关系数据库管理系统(RDBMS)的语言无关的标准方法。在某些方面,JDBC从ODBC获得了灵感。不同的是,JDBC是针对Java的,它提供了一个编程级别的接口,处理Java应用程序与数据库通信的机制。

JDBC的架构

JDBC接口由两层组成:

  1. JDBC API支持Java应用程序和JDBC管理器之间的通信。
  2. JDBC驱动支持JDBC管理器和数据库驱动之间的通信。

多年来,JDBC API和JDBC驱动已经得到了广泛的改进,形成了一个功能丰富、性能良好和可靠的库。

JDBC是你的应用程序代码与之交互的通用API。下面是你所使用的数据库的符合JDBC标准的驱动程序。

图2说明了JDBC的架构:

图2.JDBC的架构由JDBC API和JDBC驱动组成。

JDBC驱动程序

作为一个应用程序员,你不需要立即关心你所使用的驱动程序的实现,只要它是安全和正式的。然而,意识到有四种JDBC驱动程序类型是很有用的:

  1. JDBC-ODBC桥接驱动。一个薄薄的Java层,在引擎盖下使用一个ODBC驱动程序。
  2. 本地API驱动。提供一个从Java到本地数据库客户端的接口。
  3. 中间件驱动。Java和RDBMS的供应商特定协议之间的一个通用接口("中间件")。
  4. 纯Java驱动。一个直接在Java中实现供应商特定协议的驱动程序。

当你开始考虑架构和性能时,考虑你所使用的驱动程序的类型将是有益的。

简单的数据库连接和查询

在Java生态系统中编程的好处之一是,无论你选择什么数据库,你都可能找到一个稳定的JDBC数据库连接器。在本教程中,我们将使用SQLite来了解JDBC,主要是因为它非常容易使用。

用JDBC连接到数据库的步骤如下:

  1. 安装或找到你想访问的数据库。
  2. 包括JDBC库。
  3. 确保你需要的JDBC驱动程序在你的classpath上。
  4. 使用JDBC库来获得一个与数据库的连接。
  5. 使用该连接来发布SQL命令。
  6. 完成后关闭连接。

我们将一起完成这些步骤。

寻找一个JDBC驱动程序。要为你选择的数据库找到一个驱动程序,只需在网上搜索你的数据库和JDBC。例如,输入 "mysql jdbc driver"就可以找到MySQL的驱动程序。我向你挑战,你能找到一个没有JDBC驱动的企业级数据库吗?

第一步:下载并安装SQLite

SQLite是一个非常紧凑的数据库。它并不打算用于生产,但对于快速试用来说是一个很好的选择。SQLite使用一个文件作为其功能数据库,不需要安装任何服务或守护程序。

要开始这个演示,首先下载SQLite样本数据库。解压缩.db 文件,并将其保存在你不会忘记的地方。这个文件既包含了基于文件的功能性数据库,也包含了我们可以使用的样本模式和数据。

SQL和JDBC。NoSQL很流行,但关系型数据库仍然是最常用的数据存储类型。关系型数据库是一个结构化的存储库,由带有列和行的表以及表之间的关系组成。SQL,或结构化查询语言,是数据架构师用来对关系型数据库中的记录进行CRUD(创建、读取、更新和删除)操作的语言。JDBC是一个从Java到SQL的适配器层:它为Java开发者提供了一个连接到数据库、发出查询和命令以及管理响应的通用接口。

第2步:将JDBC导入到你的Java应用程序中

我们可以在集成开发环境中进行编码,但直接在文本编辑器中进行编码会更好地展示JDBC的简单性。要开始,你需要为你的操作系统安装一个兼容的JDK

假设你已经安装了JDK,我们可以从创建一个简单的Java程序开始。在你的文本编辑器中,粘贴清单1中的代码。将此文件称为WhatIsJdbc.java

清单1.一个简单的Java程序


class WhatIsJdbc{
  public static void main(String args[]){
      System.out.println("Hello InfoWorld");
  }
}

现在,通过输入以下命令来编译该代码。javac WhatIsJdbc.java.编译将输出WhatIsJdbc.class 文件。在命令行中执行这个文件,调用:java WhatIsJdbc

一旦你有了一个基本的Java程序,你就可以包括JDBC库。将清单2中的代码粘贴在你的简单Java程序的头部。

清单2.JDBC导入


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.Statement;

这些导入的每一个都提供了对一个类的访问,以促进标准的Java数据库连接:

  • Connection 表示与数据库的连接。
  • DriverManager 获取与数据库的连接。(另一个选项是 ,用于连接池)。DataSource
  • SQLException 处理Java应用程序和数据库之间的SQL错误。
  • ResultSet 和 ,对数据结果集和SQL语句进行建模。Statement

你很快就会看到这些东西的实际应用。

第3步:将JDBC驱动程序添加到你的classpath中

接下来,你将把SQLite驱动添加到你的classpath中。记住,JDBC驱动是一个为特定数据库实现JDBC API的类。

GitHub上的SQLite驱动页面,下载最新的SQLite .jar。如果你使用的是Maven或Gradle,或类似的东西,你可以通过Maven仓库添加驱动程序。请确保获得最新的.jar文件,并将其存放在你能记住的地方。

下次执行你的Java程序时,你将通过classpath拉入该.jar文件。有几种方法来设置classpath。清单3显示了如何使用命令行开关进行设置。

清单3.在Java的classpath上执行SQLite驱动


java.exe -classpath /path-to-driver/sqlite-jdbc-3.23.1.jar:. WhatIsJdbc

注意,我们已经将classpath设置为指向驱动本地目录;这样,Java仍然会找到我们的类文件。

第4步:获得一个数据库连接

classpath现在可以访问驱动程序了。接下来,把你的简单的Java应用程序文件改成清单4中的程序的样子。

清单4.使用JDBC连接类连接到SQLite


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.Statement;

 String sql = "SELECT id, username FROM users WHERE id = ?";
    List users = new ArrayList<>();
    try (Connection con = DriverManager.getConnection(myConnectionURL);
         PreparedStatement ps = con.prepareStatement(sql)) {
        ps.setInt(1, userId);
        try (ResultSet rs = ps.executeQuery()) {
            while(rs.next()) {
                users.add(new User(rs.getInt("id"), rs.getString("name")));
            }
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return users;

class WhatIsJdbc{
  public static void main(String[] args) {
    String url = "jdbc:sqlite:path-to-db/chinook/chinook.db";
    try (Connection conn = DriverManager.getConnection(url){

      System.out.println("Got it!");

    } catch (SQLException e) {
      throw new Error("Problem", e);
    } 
  }
}

编译并执行这段代码。假设一切顺利,你会得到一个肯定的消息。

没有找到合适的驱动程序:如果你收到一个类似于"No suitable driver found for jdbc:sqlite ,"的错误,那么你需要重新审视classpath,确保它指向你下载的驱动程序。驱动程序连接失败是使用JDBC的初学者最常见的绊脚石。不要担心,只要解决它。

现在,我们准备好使用一些SQL命令了。

第5步:查询数据库

有了实时连接对象,我们可以做一些有用的事情,比如查询数据库。清单5显示了如何使用JDBCConnectionStatement 对象来查询SQLite。

清单5.用JDBC查询数据库


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.Statement;


class WhatIsJdbc{
  public static void main(String[] args) {
    String sql = "SELECT id, username FROM users WHERE id = ?";
    String url = "jdbc:sqlite:path-to-db-file/chinook/chinook.db";
    try (Connection conn = DriverManager.getConnection(url);
      Statement stmt = conn.createStatement()) {

      try {
        ResultSet rs = stmt.executeQuery("select * from albums";);
        while (rs.next()) {
          String name = rs.getString("title");
          System.out.println(name);
        }
      } catch (SQLException e ) {
            throw new Error("Problem", e);
      } 

    } catch (SQLException e) {
      throw new Error("Problem", e);
    } 
  }
}

在清单5中,我们使用我们的Connection 对象来获得一个Statement 对象:conn.createStatement() 。然后我们使用这个对象来执行一个SQL查询:stmt.executeQuery(query)

executeQuery 命令返回一个ResultSet 对象,然后我们用while (rs.next()) 来迭代数据。在这个例子中,你应该看到我们所查询的专辑名称作为输出。

注意,我们还通过调用conn.close() 来关闭连接。

用JDBC进行网络连接:清单5中的数据库连接字符串是用于本地连接。 jdbc:sqlite:path-to-db-file/chinook/chinook.db.要通过网络访问数据库,连接字符串需要包括网络URL和(通常)访问数据库的凭证。

预备报表、批量更新和交易

到目前为止,我们已经涵盖了使用JDBC连接到数据库和发布SQL命令的基本知识。虽然StatementResultSet在普通情况下工作得很好,但对于更大或更复杂的应用,你可能需要额外的选项。幸运的是,JDBC库不断发展以满足大多数数据库访问的需要。