百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

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

wxin55 2024-11-20 22:42 7 浏览 0 评论

JDBC(Java数据库连接性)是Java API,用于管理与数据库的连接,发出查询和命令以及处理从数据库获得的结果集。JDBC在1997年作为JDK 1.1的一部分发布,是为Java持久层开发的首批组件之一。

本文提供了JDBC的概述,然后是使用JDBC API将Java客户端与轻量级关系数据库SQLite连接的动手入门。

JDBC如何工作

JDBC作为基于C的ODBC(开放数据库连接)API的替代产品而开发,提供了编程级别的接口,该接口处理Java应用程序与数据库或RDBMS通信的机制。JDBC接口包括两层:

1. JDBC API支持Java应用程序与JDBC管理器之间的通信。

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

JDBC是您的应用程序代码与之交互的通用API。下面是您正在使用的数据库的JDBC兼容驱动程序。

图1是Java持久层中JDBC的体系结构概述。

使用JDBC连接数据库

Java生态系统中编程的幸运事实之一是,您可能会为所选的任何数据库找到稳定的JDBC数据库连接器。在本教程中,我们将使用SQLite来了解JDBC,主要是因为它非常易于使用。

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

1. 安装或找到您要访问的数据库。

2. 包括JDBC库。

3. 确保所需的JDBC驱动程序在类路径中。

4. 使用JDBC库获得与数据库的连接。

5. 使用该连接来发出SQL命令。

6. 完成后关闭连接。

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

查找JDBC驱动程序

要查找您要使用的数据库的驱动程序,只需对数据库和JDBC进行网络搜索。例如,输入“ mysql jdbc driver”将打开MySQL驱动程序。我挑战您寻找没有JDBC驱动程序的Java兼容数据库!

步骤1.下载并安装SQLite

SQLite是一个非常紧凑的数据库。它不是供生产使用的,但是快速尝试问题的绝佳选择。SQLite使用文件作为其功能数据库,而无需安装任何服务或守护程序。

要开始进行此演示,请继续下载SQLite示例数据库。解压缩.db文件并将其保存在您不会忘记的地方。

该文件包含一个基于功能文件的数据库以及我们可以使用的示例架构和数据。

SQL和JDBC

在过去的十年中,NoSQL变得越来越流行,但是关系数据库仍然是使用中最常见的数据存储类型。一个关系型数据库是由列和行的表的结构化存储库。SQL(结构化查询语言)是数据架构师用于在关系数据库中创建,读取,更新和删除新记录之类的语言。JDBC是从Java到SQL 的适配器层:它为Java开发人员提供了一个公共接口,用于连接数据库,发出查询和命令以及管理响应。

步骤2.将JDBC导入Java应用程序

我们可以在IDE中进行编码,但是直接在文本编辑器中进行编码将更好地展示JDBC的简单性。首先,您需要为您的操作系统安装兼容的JDK

假设您已安装Java平台开发人员工具,我们可以从创建一个简单的Java程序开始。在您的文本编辑器中,粘贴清单1中所示的代码。调用此文件WhatIsJdbc.java。

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

class WhatIsJdbc{

public static void main(String args[]){

System.out.println("Hello JavaWorld");

}}

现在,通过输入以下命令来编译代码:javac WhatIsJdbc.java。编译将输出WhatIsJdbc.class文件。使用以下命令从命令行执行此文件:java WhatIsJdbc。

(有关在命令行上与JDK交互的更多信息,请参见“ 什么是JDK?Java开发者工具包简介 ”。)

一旦有了基本的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并对Statement数据结果集和SQL语句建模。

我们将很快看到其中的每一个。

步骤3.将JDBC驱动程序添加到您的类路径中

接下来,您将SQLite驱动程序添加到您的类路径中。一个JDBC驱动程序是一个类,实现JDBC API为特定的数据库。

从GitHub 下载SQLite驱动程序。确保获取最新.jar文件并将其存储在您会记得的地方。

下次执行Java程序时,将.jar通过类路径将该文件拉入。有几种设置类路径的方法。清单3显示了如何使用命令行开关来做到这一点。

清单3.在Java类路径上执行SQLite驱动程序

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

注意,我们将类路径设置为指向驱动程序和本地目录。这样,Java仍会找到我们的类文件。

步骤4.获得数据库连接

现在,类路径可以访问驱动程序。现在,更改您的简单Java应用程序文件,使其类似于清单4中的程序。

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

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) {

Connection conn = null;

try {

String url = "jdbc:sqlite:path-to-db/chinook/chinook.db";

conn = DriverManager.getConnection(url);

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

} catch (SQLException e) {

throw new Error("Problem", e);

} finally {

try {

if (conn != null) {

conn.close();

}

} catch (SQLException ex) {

System.out.println(ex.getMessage());

}

}

}}

编译并执行此代码。假设一切顺利,您将得到一个肯定的消息。

找不到合适的驱动程序?

如果收到类似“”的错误,No suitable driver found for jdbc:sqlite则需要重新访问类路径并确保它指向您下载的驱动程序。驱动程序连接失败是使用JDBC的初学者最常见的绊脚石。不要流汗。修复它。

现在,我们可以使用一些SQL命令了。

步骤5.查询数据库

有了实时连接对象,我们可以做一些有用的事情,例如查询数据库。清单5显示了如何使用JDBC Connection和Statement对象查询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) {

Connection conn = null;

try {

String url = "jdbc:sqlite:path-to-db-file/chinook/chinook.db";

conn = DriverManager.getConnection(url);

Statement stmt = null;

String query = "select * from albums";

try {

stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery(query);

while (rs.next()) {

String name = rs.getString("title");

System.out.println(name);

}

} catch (SQLException e ) {

throw new Error("Problem", e);

} finally {

if (stmt != null) { stmt.close(); }

}

} catch (SQLException e) {

throw new Error("Problem", e);

} finally {

try {

if (conn != null) {

conn.close();

}

} catch (SQLException ex) {

System.out.println(ex.getMessage());

}

}

}}

在清单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做更多的事情

到目前为止,我们已经介绍了使用JDBC连接数据库和发出SQL命令的基础知识。虽然StatementsS和ResultSetS代表常见的场景很好地工作,你可能需要用更大或更复杂的应用程序的附加选项。幸运的是,JDBC库不断发展以满足大多数数据库访问需求。

准备声明

一种提高代码灵活性的简单方法是用替换Statement类PreparedStatement,如清单6所示。

清单6.使用JDBC PreparedStatements

String prepState = "insert into albums values (?, ?);";

PreparedStatement prepState =

connection.prepareStatement(sql);

prepState.setString(1, "Uprising");

prepState.setString(2, "Bob Marley and the Wailers ");

int rowsAffected = preparedStatement.executeUpdate();

PreparedStatement用Statement问号(?)替换的硬编码值。使用PreparedStatements可优化代码的重用性:a PreparedStatement仅被编译一次,然后可以与各种参数一起重用。随着代码库的增长,您只需在语句中插入新值,而不用修改字符串对象本身。

批量更新

每当应用程序要发布多个更新时,分批执行它们可以极大地提高性能。批处理的实质是获取多个更新并将它们收集在一起,然后一次发布所有更新。清单7使用JDBC的批处理方法来执行几个PreparedStatements 的批处理更新。

清单7.使用PreparedStatement进行批处理

prepState.setString(1, "Uprising");

prepState.setString(2, "Bob Marley and the Wailers");

preparedStatement.addBatch();

prepState.setString(1, "Wildflowers");

prepState.setString(2, "Tom Petty and the Heartbreakers");

preparedStatement.addBatch();

int[] rowsAffected = preparedStatement.executeBatch();

JDBC事务

关系数据库中的事务允许将一组更新包装在完全成功或失败的交互中。通过JDBC使用事务的基础是告诉系统关闭自动提交,然后在完成后手动告诉系统进行提交。默认情况下,自动提交功能为on,这意味着无论何时运行executeUpdate或executeInsert,命令都会被提交。

清单8显示了JDBC事务的一小部分。

清单8. JDBC事务

connection.setAutoCommit(false);// Use executeUpdate multiple times

connection.commit();

当connection.commit()遇到,所有包裹在里面的更新将尝试,如果有任何失败,他们都将被回滚。

JDBC 4.3中还有许多值得探索的功能,包括CallableStatement用于存储过程,使用DataSource对象以提高应用程序性能(尤其是通过连接池),以及将JDBC ResultSet转换为Java Stream

特定于数据库的功能

尽管每个符合JDBC的数据库都提供了相同的核心功能,以便通过SQL与数据库连接和交互,但是某些数据库的作用要比其他数据库大。例如,Oracle DB提供了结果缓存,这不是JDBC规范所必需的。这是一个例子:

conn.prepareStatement ("select /*+ result_cache */ * from employees where employee_id < : 1");

结论

JDBC是Java最古老的API之一,它为Java应用程序开发的长期需求之一提供了易于使用的解决方案。仅了解本文演示的几个JDBC调用,即可开始使用JDBC连接几乎所有的数据库。完成这些命令后,就可以开始探索JDBC中内置的一些更复杂的选项。

最后,开发这么多年我也总结了一套学习Java的资料与面试题,如果你在技术上面想提升自己的话,可以关注我,私信发送领取资料或者在评论区留下自己的联系方式,有时间记得帮我点下转发让跟多的人看到哦。


相关推荐

ES6中 Promise的使用场景?(es6promise用法例子)

一、介绍Promise,译为承诺,是异步编程的一种解决方案,比传统的解决方案(回调函数)更加合理和更加强大在以往我们如果处理多层异步操作,我们往往会像下面那样编写我们的代码doSomething(f...

JavaScript 对 Promise 并发的处理方法

Promise对象代表一个未来的值,它有三种状态:pending待定,这是Promise的初始状态,它可能成功,也可能失败,前途未卜fulfilled已完成,这是一种成功的状态,此时可以获取...

Promise的九大方法(promise的实例方法)

1、promise.resolv静态方法Promise.resolve(value)可以认为是newPromise方法的语法糖,比如Promise.resolve(42)可以认为是以下代码的语...

360前端一面~面试题解析(360前端开发面试题)

1.组件库按需加载怎么做的,具体打包配了什么-按需加载实现:借助打包工具(如Webpack的require.context或ES模块动态导入),在使用组件时才引入对应的代码。例如在V...

前端面试-Promise 的 finally 怎么实现的?如何在工作中使用?

Promise的finally方法是一个非常有用的工具,它无论Promise是成功(fulfilled)还是失败(rejected)都会执行,且不改变Promise的最终结果。它的实现原...

最简单手写Promise,30行代码理解Promise核心原理和发布订阅模式

看了全网手写Promise的,大部分对于新手还是比较难理解的,其中几个比较难的点:状态还未改变时通过发布订阅模式去收集事件实例化的时候通过调用构造函数里传出来的方法去修改类里面的状态,这个叫Re...

前端分享-Promise可以中途取消啦(promise可以取消吗)

传统Promise就像一台需要手动组装的设备,每次使用都要重新接线。而Promise.withResolvers的出现,相当于给开发者发了一个智能遥控器,可以随时随地控制异步操作。它解决了三大...

手写 Promise(手写输入法 中文)

前言都2020年了,Promise大家肯定都在用了,但是估计很多人对其原理还是一知半解,今天就让我们一起实现一个符合PromiseA+规范的Promise。附PromiseA+规范地址...

什么是 Promise.allSettled()!新手老手都要会?

Promise.allSettled()方法返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的pr...

前端面试-关于Promise解析与高频面试题示范

Promise是啥,直接上图:Promise就是处理异步函数的API,它可以包裹一个异步函数,在异步函数完成时抛出完成状态,让代码结束远古时无限回掉的窘境。配合async/await语法糖,可...

宇宙厂:为什么前端离不开 Promise.withResolvers() ?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.为什么需要Promise.with...

Promise 新增了一个超实用的 API!

在JavaScript的世界里,Promise一直是处理异步操作的神器。而现在,随着ES2025的发布,Promise又迎来了一个超实用的新成员——Promise.try()!这个新方法简...

一次搞懂 Promise 异步处理(promise 异步顺序执行)

PromisePromise就像这个词的表面意识一样,表示一种承诺、许诺,会在后面给出一个结果,成功或者失败。现在已经成为了主流的异步编程的操作方式,写进了标准里面。状态Promise有且仅有...

Promise 核心机制详解(promise机制的实现原理)

一、Promise的核心状态机Promise本质上是一个状态机,其行为由内部状态严格管控。每个Promise实例在创建时处于Pending(等待)状态,此时异步操作尚未完成。当异步操作成功...

javascript——Promise(js实现promise)

1.PromiseES6开始支持,Promise对象用于一个异步操作的最终完成(包括成功和失败)及结果值的表示。简单说就是处理异步请求的。之所以叫Promise,就是我承诺,如果成功则怎么处理,失败怎...

取消回复欢迎 发表评论: