【Java 进阶篇】JDBC(Java Database Connectivity)详解

在这里插入图片描述

JDBC(Java Database Connectivity)是 Java 中用于连接和操作数据库的标准 API。它允许 Java 应用程序与不同类型的数据库进行交互,执行查询、插入、更新和删除等操作。本文将详细介绍 JDBC 的各个类及其用法,以帮助您更好地理解和使用 JDBC。

JDBC 架构

在了解 JDBC 的各个类之前,让我们先了解 JDBC 的基本架构。JDBC 架构主要由以下几个部分组成:

  1. JDBC API:这是 JDBC 的核心部分,包括一组接口和类,用于在 Java 应用程序和数据库之间建立连接以及执行 SQL 查询和更新操作。

  2. JDBC 驱动程序管理器:这是 JDBC 驱动程序的管理器,用于加载并管理不同数据库的 JDBC 驱动程序。

  3. JDBC 驱动程序:JDBC 驱动程序是数据库供应商提供的实现 JDBC 接口的类库,用于连接和与数据库进行通信。每个数据库都有自己的 JDBC 驱动程序。

  4. 数据库:这是要访问和操作的实际数据库,可以是各种类型的数据库,如 MySQL、Oracle、SQL Server 等。

  5. JDBC 数据源:JDBC 数据源是一种管理数据库连接的方式,它可以在应用程序和数据库之间提供连接池的功能,以提高性能和资源利用率。

现在,让我们深入了解 JDBC 的各个类以及它们的作用。

1. java.sql.DriverManager

DriverManager 类是 JDBC 的入口点之一,用于管理 JDBC 驱动程序的加载和数据库连接的建立。您可以使用以下方法来与数据库建立连接:

  • getConnection(String url, String username, String password):通过指定数据库的 URL、用户名和密码来建立与数据库的连接。返回一个 Connection 对象,用于后续的数据库操作。

示例代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;public class JDBCDemo {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/mydatabase";String username = "root";String password = "password";try {Connection connection = DriverManager.getConnection(url, username, password);// 使用 connection 执行数据库操作} catch (SQLException e) {e.printStackTrace();}}
}

2. java.sql.Connection

Connection 接口表示与数据库的连接,它提供了一系列方法用于执行 SQL 查询和更新操作,以及管理事务。一旦通过 DriverManager 建立了连接,您就可以创建 StatementPreparedStatementCallableStatement 对象来执行 SQL 语句。

示例代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;public class JDBCDemo {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/mydatabase";String username = "root";String password = "password";try {Connection connection = DriverManager.getConnection(url, username, password);Statement statement = connection.createStatement();// 使用 statement 执行 SQL 查询或更新操作// ...// 关闭连接和 statementstatement.close();connection.close();} catch (SQLException e) {e.printStackTrace();}}
}

3. java.sql.Statement

Statement 接口用于执行简单的 SQL 查询和更新操作。它允许您执行一次性 SQL 语句,但不支持参数化查询。要执行参数化查询,通常使用 PreparedStatement

示例代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;public class JDBCDemo {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/mydatabase";String username = "root";String password = "password";try {Connection connection = DriverManager.getConnection(url, username, password);Statement statement = connection.createStatement();// 执行查询String query = "SELECT * FROM employees";statement.executeQuery(query);// 执行更新String update = "UPDATE employees SET salary = 50000 WHERE department = 'IT'";statement.executeUpdate(update);// 关闭连接statement.close();connection.close();} catch (SQLException e) {e.printStackTrace();}}
}

4. java.sql.PreparedStatement

PreparedStatement 接口用于执行参数化的 SQL 查询和更新操作。与 Statement 不同,PreparedStatement 可以提高性能和安全性,因为它允许您预编译 SQL 语句并设置参数值,以避免 SQL 注入攻击。

示例代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class JDBCDemo {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/mydatabase";String username = "root";String password = "password";try {Connection connection = DriverManager.getConnection(url, username, password);// 预编译 SQL 查询String sql = "SELECT * FROM employees WHERE department = ?";PreparedStatement preparedStatement = connection.prepareStatement(sql);// 设置参数值preparedStatement.setString(1, "IT");// 执行查询preparedStatement.executeQuery();// 关闭连接和 preparedStatementpreparedStatement.close();connection.close();} catch (SQLException e) {e.printStackTrace();}}
}

5. java.sql.ResultSet

ResultSet 接口表示从数据库查询返回的结果集。它允许您迭代结果集并获取查询结果的数据。

示例代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class JDBCDemo {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/mydatabase";String username = "root";String password = "password";try {Connection connection = DriverManager.getConnection(url, username, password);// 预编译 SQL 查询String sql = "SELECT * FROM employees WHERE department = ?";PreparedStatement preparedStatement = connection.prepareStatement(sql);// 设置参数值preparedStatement.setString(1, "IT");// 执行查询ResultSet resultSet = preparedStatement.executeQuery();// 迭代结果集while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");double salary = resultSet.getDouble("salary");// 处理查询结果System.out.println("ID: " + id + ", Name: " + name + ", Salary: " + salary);}// 关闭连接、preparedStatement 和 resultSetresultSet.close();preparedStatement.close();connection.close();} catch (SQLException e) {e.printStackTrace();}}
}

6. java.sql.CallableStatement

CallableStatement 接口用于执行存储过程或函数的调用。存储过程是一组预定义的 SQL 语句,可以在数据库中执行,并且可以包含输入参数、输出参数和返回结果。

示例代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.CallableStatement;
import java.sql.Types;
import java.sql.SQLException;public class JDBCDemo {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/mydatabase";String username = "root";String password = "password";try {Connection connection = DriverManager.getConnection(url, username, password);// 调用存储过程String callProcedure = "{CALL calculate_salary(?, ?)}";CallableStatement callableStatement = connection.prepareCall(callProcedure);// 设置输入参数callableStatement.setInt(1, 1001);// 注册输出参数callableStatement.registerOutParameter(2, Types.DOUBLE);// 执行存储过程callableStatement.execute();// 获取输出参数值double salary = callableStatement.getDouble(2);System.out.println("Calculated Salary: " + salary);// 关闭连接和 callableStatementcallableStatement.close();connection.close();} catch (SQLException e) {e.printStackTrace();}}
}

7. java.sql.BatchUpdateException

BatchUpdateException 是一个异常类,用于处理 JDBC 批处理操作时的异常情况。JDBC 批处理允许一次性执行多个 SQL 语句,通常用于提高数据库操作的性能。

示例代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.BatchUpdateException;
import java.sql.SQLException;public class JDBCDemo {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/mydatabase";String username = "root";String password = "password";try {Connection connection = DriverManager.getConnection(url, username, password);Statement statement = connection.createStatement();// 添加多个 SQL 语句到批处理statement.addBatch("INSERT INTO employees (name, department, salary) VALUES ('Alice', 'HR', 5000)");statement.addBatch("INSERT INTO employees (name, department, salary) VALUES ('Bob', 'IT', 6000)");statement.addBatch("UPDATE employees SET salary = 5500 WHERE name = 'Alice'");// 执行批处理int[] result = statement.executeBatch();// 处理执行结果for (int i = 0; i < result.length; i++) {if (result[i] == Statement.EXECUTE_FAILED) {System.err.println("SQL command failed: " + i);} else {System.out.println("SQL command successful: " + i);}}// 关闭连接和 statementstatement.close();connection.close();} catch (BatchUpdateException e) {int[] updateCounts = e.getUpdateCounts();for (int i = 0; i < updateCounts.length; i++) {if (updateCounts[i] == Statement.EXECUTE_FAILED) {System.err.println("SQL command failed: " + i);} else {System.out.println("SQL command successful: " + i);}}} catch (SQLException e) {e.printStackTrace();}}
}

8. javax.sql.DataSource

DataSource 是 Java 中用于管理数据库连接池的接口。连接池可以帮助提高数据库连接的性能和资源利用率,因为它可以重复使用连接,而不需要每次都创建新连接。

示例代码:

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;public class JDBCDemo {public static void main(String[] args) {// 使用连接池获取数据库连接DataSource dataSource = MyDataSourceFactory.getDataSource();try (Connection connection = dataSource.getConnection()) {// 执行数据库操作} catch (SQLException e) {e.printStackTrace();}}
}

在上面的示例中,MyDataSourceFactory 是一个自定义的连接池工厂类,用于创建和配置连接池。使用连接池可以减少连接的创建和销毁开销,提高应用程序的性能和响应速度。

总结

本文介绍了 JDBC(Java Database Connectivity)的核心类和接口,包括 java.sql.Connectionjava.sql.Statementjava.sql.PreparedStatementjava.sql.ResultSetjava.sql.CallableStatementjava.sql.BatchUpdateExceptionjavax.sql.DataSource。这些类和接口允许 Java 应用程序与数据库进行连接、查询和更新操作,是与数据库交互的重要工具。

JDBC 提供了多种方式来执行 SQL 查询和更新操作,包括简单的 Statement、参数化的 PreparedStatement、存储过程的 CallableStatement,以及批处理操作。连接池也是 JDBC 中常用的工具,用于管理数据库连接的复用和释放。

希望本文能够帮助您更好地理解 JDBC,并在 Java 应用程序中有效地使用数据库。如果您有任何问题或需要进一步的帮助,请随时提出。

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/93155.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言经典100例题-66】(用指针解决)输入3个数a,b,c,按大小顺序输出。

代码&#xff1a; #include<stdio.h> #define _CRT_SECURE_NO_WARNINGS 1//VS编译器使用scanf函数时会报错&#xff0c;所以添加宏定义 swap(p1, p2) int* p1, * p2; {int p;p *p1;*p1 *p2;*p2 p; } int main() {int n1, n2, n3;int* pointer1, * pointer2, * point…

力扣 -- 416. 分割等和子集(01背包问题)

解题步骤&#xff1a; 参考代码&#xff1a; 未优化代码&#xff1a; class Solution { public:bool canPartition(vector<int>& nums) {int nnums.size();int sum0;for(const auto& e:nums){sume;}if(sum%21){return false;}int aimsum/2;//多开一行&#xff…

Linux系统编程基础:进程控制

文章目录 一.子进程的创建操作系统内核视角下的父子进程存在形式验证子进程对父进程数据的写时拷贝 二.进程等待进程非阻塞等待示例: 三.进程替换内核视角下的进程替换过程:综合利用进程控制系统接口实现简单的shell进程 进程控制主要分为三个方面,分别是:子进程的创建,进程等待…

前端两年半,CSDN创作一周年

文章目录 一、机缘巧合1.1、起因1.2、万事开头难1.3、 何以坚持&#xff1f; 二、收获三、日常四、憧憬 五、总结 一、机缘巧合 1.1、起因 最开始接触CSDN&#xff0c;还是因为同专业的同学&#xff0c;将计算机实验课的实验题&#xff0c;记录总结并发在了专业群里。后来正式…

几个推荐程序员养成的好习惯

本文框架 前言case1 不想当然case2 不为了解决问题而解决问题case3 不留问题死角case4 重视测试环节 前言 中秋国庆双节至&#xff0c;旅行or回乡探亲基本是大家的选择&#xff0c;看看风景或陪陪家人确实是个难得的机会。不过我的这次假期选择了闭关&#xff0c;不探亲&#…

【Python基础】常用模块学习:sys|os|pytest

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

Python|OpenCV-如何给目标图像添加边框(7)

前言 本文是该专栏的第7篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 在使用opencv处理图像的时候,会不可避免的对图像的一些具体区域进行一些操作。比如说,想要给目标图像创建一个围绕图像的边框。简单的来说,就是在图片的周围再填充一个粗线框。具体效果,…

快速开发微信小程序之一登录认证

一、背景 记得11、12年的时候大家一窝蜂的开始做客户端Android、IOS开发&#xff0c;我是14年才开始做Andoird开发&#xff0c;干了两年多&#xff0c;然后18年左右微信小程序火了&#xff0c;我也做了两个小程序&#xff0c;一个是将原有牛奶公众号的功能迁移到小程序&#x…

centos7卸载docker

菜鸟教程-常见命令&#xff1a;https://www.runoob.com/docker/docker-command-manual.html 1. 准备工作&#xff1a; 1.1 杀死docker有关的容器&#xff1a; docker kill $(docker ps -a -q)1.2 删除所有docker容器&#xff1a; docker rm $(docker ps -a -q)1.3 删除所有d…

简单走近ChatGPT

目录 一、ChatGPT整体背景认知 &#xff08;一&#xff09;ChatGPT引起关注的原因 &#xff08;二&#xff09;与其他公司的竞争情况 二、NLP学习范式的发展 &#xff08;一&#xff09;规则和机器学习时期 &#xff08;二&#xff09;基于神经网络的监督学习时期 &…

房产政策松绑,VR看房助力市场回春

近日房贷利率、房产限购开始松绑&#xff0c;房地产市场逐渐被激活&#xff0c;房产行业的线上服务能力&#xff0c;也愈发的受到了重视。随着房贷利率、首付比例变化的消息逐渐推出&#xff0c;部分用户开始入手房产市场&#xff0c;因此房产行业的线上服务也需要不断升级&…

leetCode 122.买卖股票的最佳时机 II 贪心算法

122. 买卖股票的最佳时机 II - 力扣&#xff08;LeetCode&#xff09; 给你一个整数数组 prices &#xff0c;其中 prices[i] 表示某支股票第 i 天的价格。 在每一天&#xff0c;你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买&…

gitlab配置webhook限制提交注释

一、打开gitlab相关配置项 vim /etc/gitlab/gitlab.rb gitlab_shell[custom_hooks_dir] "/etc/gitlab/custom_hooks" 二、创建相关文件夹 mkdir -p /etc/gitlab/custom_hooks mkdir -p /etc/gitlab/custom_hooks/post-receive.d mkdir -p /etc/gitlab/custom_h…

Python教程:PyQt5需要学习,哪些知识点??

PyQt5是基于图形程序框架Qt5的Python语言实现&#xff0c;由一组Python模块构成。它可用于Python 2和3&#xff0c;拥有超过620个类和6000个函数和方法。这是一个跨平台的工具包&#xff0c;可以运行在所有主要的操作系统&#xff0c;包括UNIX、Windows、Mac OS、Linux等。 #我…

vue3学习实战

vue3新增变化 diff算法变化 vue3的diff算法没有vue2的头尾、尾头之间的diff&#xff0c;对diff算法进行了优化&#xff0c;最长递归子序列。 ref VS reactive ref 支持所有的类型&#xff0c;reactive 支持引用类型&#xff0c;array object Map Setref取值、赋值&#xff…

步力宝科技爆款产品定位,开创智能物联网新商业

数据显示&#xff0c;中国处于 “亚健康”状态人口数量约占总人口的70%&#xff0c;亚健康是一种临界状态&#xff0c;指介于健康和疾病之间的状态。亚健康是一个动态演变的过程&#xff0c;既有向慢病发展的趋势&#xff0c;也能通过合理的干预使人体重返健康状态&#xff0c;…

奥斯卡·王尔德

奥斯卡王尔德 奥斯卡王尔德&#xff08;Oscar Wilde&#xff0c;1854年10月16日—1900年11月30日&#xff09;&#xff0c;出生于爱尔兰都柏林&#xff0c;19世纪英国&#xff08;准确来讲是爱尔兰&#xff0c;但是当时由英国统治&#xff09;最伟大的作家与艺术家之一&#xf…

【RuoYi项目分析】在RuoYi网关实现验证码功能

文章目录 1. 验证码功能的类清单2. 验证码的实现2.1. 验证码的获取2.2. 验证码的校验 3. 总结4. 资料参考 本文主要介绍了用户如何实现验证码&#xff0c;以及该功能如何与 Spring Gateway 联系起来。 1. 验证码功能的类清单 类功能CaptchaProperties验证码的 yml 配置Captcha…

25-多线程

多线程 线程(Thread)是一个程序内部的一条执行流程。 程序中如果有一条执行流程&#xff0c;那这个程序就是单线程的程序 多线程是指从软硬件上实现的多条执行流程的技术&#xff08;多条线程由CPU负责调度执行&#xff09;。 再例如&#xff1a;消息通信、淘宝、京东系统都离…

【Flink】

事件驱动型应用 核心目标&#xff1a;数据流上的有状态计算 Apache Flink是一个框架和分布式处理引擎&#xff0c;用于对无界或有界数据流进行有状态计算。 运行逻辑 状态 把流处理需要的额外数据保存成一个“状态”,然后针对这条数据进行处理,并且更新状态。这就是所谓的“…