【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.xdnf.cn/news/147279.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

DDD项目落地之充血模型实践

一、背景 充血模型是DDD分层架构中实体设计的一种方案&#xff0c;可以使关注点聚焦于业务实现&#xff0c;可有效提升开发效率、提升可维护性&#xff1b; 二、DDD项目落地整体调用关系 调用关系图中的Entity为实体&#xff0c;从进入领域服务&#xff08;Domin&#xff09;…

在移动固态硬盘上安装Ubuntu系统和ROS2

目录 原视频准备烧录 原视频 b站鱼香ros 准备 1.在某宝上买一个usb移动固态硬盘或固态U盘&#xff0c;至少64G 2.下载鱼香ros烧录工具 下载第二个就行了&#xff0c;不然某网盘的速度下载全部要一天 下载后&#xff0c;选择FishROS2OS制作工具压缩包&#xff0c;进行解压…

WPS Office for Linux即将面临开源

WPS Office 是一款免费&#xff08;但不开源&#xff09;的办公套件&#xff0c;目前已经在 Windows、macOS、Android、iOS 和 Linux 设备上线&#xff0c;由于在界面和功能上模仿了微软 Office 的部分特性&#xff0c;对于那些轻量办公的用户来说已经能够完全驾驭大部分需求。…

vue3 element-ui-plus Carousel 跑马灯 的使用 及 踩坑记录

vue3 element-ui-plus Carousel 跑马灯 的踩坑记录 Carousel 跑马灯首页跑马灯demo Carousel 跑马灯 首先&#xff0c;打开其官网-跑马灯案例 跑马灯代码&#xff1a; <el-carousel :interval"5000" arrow"always"><el-carousel-item v-for"…

以32bit加法器为核心的加法、减法、乘法和除法计算器(ALU)

1 任务概述 实现一个以加法器为核心的计算器。 加法&#xff1a;能够实现32bit加法 减法&#xff1a;能够实现32bit减法 乘法&#xff1a;能够实现两个32bit数字的乘法&#xff0c;乘积为64bit 除法&#xff1a;能够实现两个32bit无符号数的除法&#xff0c;商为32bit&#xf…

【算法|贪心算法系列No.3】leetcode334. 递增的三元子序列

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

【MySQL入门到精通-黑马程序员】MySQL基础篇-DML

文章目录 前言一、DML-介绍二、DML-添加数据三、DML-修改数据四、DML-删除数据总结 前言 本专栏文章为观看黑马程序员《MySQL入门到精通》所做笔记&#xff0c;课程地址在这。如有侵权&#xff0c;立即删除。 一、DML-介绍 DML&#xff08;Data Manipulation Language&#xf…

湖南特色农产品销售系统APP /基于android的农产品销售系统/基于android的购物系统

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的APP应运而生&#xff0c;各行各业相继进入信息管理时代&#x…

25-多线程

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

【Excel】快速提取某个符号前面的数据内容

【问题描述】 在使用excel整理数据过程中&#xff0c;经常与需要调整数据后&#xff0c;进行使用。 例如凭证导出后&#xff0c;科目列是包含科目编码和科目名称的。 但由于要将数据复制到其他的导入模板上使用&#xff0c;对应的模板只需要科目编码&#xff0c;不需要科目名称…

基于Java的校园失物招领平台设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

愚蠢的代码?某程序员强行编写了一段开发阶段无法调试的代码,大佬们快来救救他!

文章目录 一、开场白1. 程序员打赌的故事2. 目标&#xff1a; 尽量在不修改代码的情况下将springmvc框架以独立jar方式运行 二、出师不利方案一、Spring Web工程转Spring Boot方案二、引入内置服务器jetty其余备用方案 三、柳暗花明遇见jetty-runner测试验证准备工作:部署工作 …

Echarts 教程一

Echarts 教程一 可视化大屏幕适配方案可视化大屏幕布局方案Echart 图表通用配置部分解决方案1. titile2. tooltip3. xAxis / yAxis 常用配置4. legend5. grid6. series7.color Echarts API 使用全局echarts对象echarts实例对象 可视化大屏幕适配方案 rem flexible.js 关于flex…

基于 QT 实现一个 Ikun 专属桌面宠物

Step0、实现思路 想到的思路有两种&#xff1a; 1、使用 QT 的状态机模式&#xff0c;参考官网文档&#xff0c;这个模式的解耦最佳 2、使用原生 Wigets&#xff0c;将窗口设置为透明无框&#xff0c;循环播放桌面宠物的状态 本文采用第二种思路&#xff0c;实现一个极简版…

修炼k8s+flink+hdfs+dlink(一:安装flink)

一&#xff1a;standalone的ha环境部署。 创建目录&#xff0c;上传安装包。 mkdir /opt/app/flink 上传安装包到本目录。 tar -zxvf flink-1.13.6-bin-scala_2.12.tgz配置参数。 在flink-conf.yaml中添加zookeeper配置 jobmanager.rpc.address: node01 high-availability: …

Django基础入门操作 (Django-01)

一 背景介绍 Django是一个开源的 Web应用框架&#xff0c;由Python写成。采用了MTV的框架模式&#xff0c;它最初是被用来做CMS&#xff08;内容管理系统&#xff09;软件。 官方中文文档&#xff1a;Django 文档 | Django 文档 | Django 应用&#xff1a;做内容管理系统(新…

selenium下载安装 -- 使用谷歌驱动碰到的问题

安装教程参考: http://c.biancheng.net/python_spider/selenium.html 1. 谷歌浏览器和谷歌驱动版本要对应(但是最新版本谷歌对应的驱动是没有的,因此要下载谷歌历史其他版本): 谷歌浏览器历史版本下载: https://www.chromedownloads.net/chrome64win/谷歌浏览器驱动下载: http:…

spark SQL 任务参数调优1

1.背景 要了解spark参数调优&#xff0c;首先需要清楚一部分背景资料Spark SQL的执行原理&#xff0c;方便理解各种参数对任务的具体影响。 一条SQL语句生成执行引擎可识别的程序&#xff0c;解析&#xff08;Parser&#xff09;、优化&#xff08;Optimizer&#xff09;、执行…

gwas数据根据eaf Z 和N 求beta和se

https://www.nature.com/articles/s41590-023-01588-w#Sec10

C++基础_Day02

文章目录 四、流程控制语句4.1 选择结构4.1.1 if语句 4.1.2 三目运算符4.1.3 switch语句注意事项 4.1.4 if和switch的区别【CHAT】4.2 循环结构4.2.1 while循环语句4.2.2 do...while循环语句 4.2.3 for循环语句九九乘法表 4.3 跳转语句4.3.1 break语句4.3.2 continue语句4.3.3 …