JDBC的连接过程(超详细)

JDBC(Java Database Connectivity)是 Java 用于访问数据库的标准 API,它允许 Java 程序与各种不同类型的数据库进行交互, 其连接数据库的过程主要包含以下几个步骤:

1. 导入 JDBC 驱动依赖

在使用 JDBC 连接数据库之前,需要导入相应数据库的 JDBC 驱动。如果是使用 Maven 构建项目,以 MySQL 为例,在pom.xml文件中添加如下依赖:

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version> <!-- 根据实际需求选择版本 -->
</dependency>

2. 加载 JDBC 驱动

在 Java 代码中,需要加载数据库的 JDBC 驱动,让 Java 程序知道使用哪个驱动来连接数据库。使用Class.forName()方法加载驱动类,例如连接 MySQL 数据库

try {Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {e.printStackTrace();
}

3. 建立数据库连接

使用DriverManager.getConnection()方法来建立与数据库的连接,该方法需要传入数据库的 URL、用户名和密码。以下是不同数据库连接 URL 的示例:

  • MySQL
String url = "jdbc:mysql://localhost:3306/mydatabase?useSSL=false&serverTimezone=UTC";
String username = "root";
String password = "123456";
try (java.sql.Connection connection = DriverManager.getConnection(url, username, password)) {System.out.println("数据库连接成功");
} catch (java.sql.SQLException e) {e.printStackTrace();
}

jdbc:mysql://是 MySQL 的 JDBC URL 前缀,localhost是数据库主机地址,3306是端口号,mydatabase是数据库名,后面的参数用于配置连接属性,如关闭 SSL 验证和设置时区。

  • PostgreSQL
String url = "jdbc:postgresql://localhost:5432/mydatabase";
String username = "postgres";
String password = "123456";
try (java.sql.Connection connection = DriverManager.getConnection(url, username, password)) {System.out.println("数据库连接成功");
} catch (java.sql.SQLException e) {e.printStackTrace();
}

jdbc:postgresql://是 PostgreSQL 的 JDBC URL 前缀,5432是默认端口号。

  • Oracle
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
String username = "scott";
String password = "tiger";
try (java.sql.Connection connection = DriverManager.getConnection(url, username, password)) {System.out.println("数据库连接成功");
} catch (java.sql.SQLException e) {e.printStackTrace();
}

jdbc:oracle:thin:是 Oracle 的 JDBC URL 前缀,1521是默认端口号,orcl是数据库实例名。

4. 创建 Statement 对象

连接建立后,需要创建StatementPreparedStatementCallableStatement对象,用于执行 SQL 语句

  • Statement:最基本的用于执行 SQL 语句的对象,适用于执行静态 SQL 语句,例如:
try (java.sql.Statement statement = connection.createStatement()) {// 执行SQL查询java.sql.ResultSet resultSet = statement.executeQuery("SELECT * FROM users");while (resultSet.next()) {System.out.println(resultSet.getString("username"));}
} catch (java.sql.SQLException e) {e.printStackTrace();
}
  • PreparedStatement:预编译 SQL 语句,能有效防止 SQL 注入攻击,并且性能更好,适用于执行动态 SQL 语句,例如:
String sql = "SELECT * FROM users WHERE username = ?";
try (java.sql.PreparedStatement preparedStatement = connection.prepareStatement(sql)) {preparedStatement.setString(1, "admin");java.sql.ResultSet resultSet = preparedStatement.executeQuery();while (resultSet.next()) {System.out.println(resultSet.getString("username"));}
} catch (java.sql.SQLException e) {e.printStackTrace();
}
  • CallableStatement:用于执行数据库中的存储过程,例如:
String sql = "{call get_user_count(?)}";
try (java.sql.CallableStatement callableStatement = connection.prepareCall(sql)) {callableStatement.registerOutParameter(1, java.sql.Types.INTEGER);callableStatement.execute();int count = callableStatement.getInt(1);System.out.println("用户数量: " + count);
} catch (java.sql.SQLException e) {e.printStackTrace();
}

5. 执行 SQL 语句

根据不同的需求,使用上述创建的对象执行 SQL 语句,如executeQuery()用于执行查询语句并返回结果集(ResultSet),executeUpdate()用于执行增删改操作并返回受影响的行数,execute()用于执行任意 SQL 语句并返回一个布尔值表示是否返回结果集。

6. 处理结果集(如果有)

当执行查询语句后,会得到一个ResultSet对象,通过调用ResultSet的方法(如getString()getInt()等)来获取查询结果集中的数据,并进行相应的处理。

7. 关闭资源

在完成数据库操作后,需要按照ResultSetStatement(或PreparedStatementCallableStatement)、Connection的顺序关闭资源,以释放数据库连接和其他相关资源,防止资源泄漏。示例代码如下:

java.sql.ResultSet resultSet = null;
java.sql.PreparedStatement preparedStatement = null;
try {// 执行操作...
} catch (java.sql.SQLException e) {e.printStackTrace();
} finally {if (resultSet != null) {try {resultSet.close();} catch (java.sql.SQLException e) {e.printStackTrace();}}if (preparedStatement != null) {try {preparedStatement.close();} catch (java.sql.SQLException e) {e.printStackTrace();}}if (connection != null) {try {connection.close();} catch (java.sql.SQLException e) {e.printStackTrace();}}
}

或者使用 Java 7 引入的try-with-resources语句,它会自动关闭实现了AutoCloseable接口的资源,简化代码编写:

try (java.sql.Connection connection = DriverManager.getConnection(url, username, password);java.sql.PreparedStatement preparedStatement = connection.prepareStatement(sql);java.sql.ResultSet resultSet = preparedStatement.executeQuery()) {// 处理结果集...
} catch (java.sql.SQLException e) {e.printStackTrace();
}

完美撒花~

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

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

相关文章

本地WSL部署接入 whisper + ollama qwen3:14b 总结字幕校对增强版

1. 实现功能 M4-4: 校对增强版 (最终完全体) 本脚本是整个 Module 的最终形态&#xff0c;采用了“代码预处理 LLM校对”的终极方案&#xff1a; 代码预处理: 确定性地在每个语音片段后添加逗号&#xff0c;生成一份“标点草稿”。LLM校对: LLM 的任务被简化为“校对和修正”这…

MySQL数据库简介

1 简介 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典 MySQL AB公司开发&#xff0c;属于 Oracle 旗下产品&#xff0c;是当今最流行的关系型数据库管理系统之一&#xff0c;在 WEB应用方面&#xff0c;MySQL是最好的RDBMS (Relational Database Management System&#…

[Oracle] UNPIVOT 列转行

Oracle数据库中的UNPIVOT是一种用于将列转换为行的SQL操作&#xff0c;它允许用户将多个列的数据转换为多行的形式&#xff0c;以便进行更灵活的数据分析和报表生成UNPIVOT主要用于将宽表(多列)转换为长表(多行)&#xff0c;减少表的列数&#xff0c;增加行数语法格式SELECT pi…

node.js 学习笔记3 HTTP

path模块 path模块主要用于操作路径。要使用path&#xff0c;首先需要引入path模块。require(path) path.resolve 用于拼接规范的绝对路径。 如果想拼接一个路径&#xff0c;有时候是使用字符串手动拼接的&#xff0c;但由于系统的规范不同&#xff0c;路径中的\和/无法统一…

Flutter Dialog、BottomSheet

属性说明title标题content内容actions按钮applicationName说明文字applicationVersion版本applicationLegalese版本基本使用class MyState extends State {AlertDialog delDialog(BuildContext context) {AlertDialog alertDialog AlertDialog(title: Text("提示"),…

《算法导论》第 19 章 - 斐波那契堆

引言斐波那契堆&#xff08;Fibonacci Heap&#xff09;是一种高效的可合并堆数据结构&#xff0c;由 Michael L. Fredman 和 Robert E. Tarjan 于 1984 年提出。它在许多优先队列操作中提供了极佳的 amortized&#xff08;摊还&#xff09;时间复杂度&#xff0c;尤其适用于需…

MySQL-日志

MySQL-日志前言一、错误日志&#xff08;error log&#xff09;二、慢查询日志(slow query log)三 、一般查询日志(general log)四、 事务日志重做日志&#xff08;redo log&#xff09;回滚日志&#xff08;undo log&#xff09;五、 二进制日志(bin log)/归档日志 > 数据同…

嵌入式C语言编程:策略模式、状态模式和状态机的应用

概述 在没有面向对象语法的C语言中&#xff0c;策略&#xff08;Strategy&#xff09;模式和状态&#xff08;State&#xff09;模式都通过“上下文 接口”组合来模拟多态。 它们在代码结构上几乎一致&#xff0c;但设计意图和应用场景却差异很大。 本文分三部分深入剖析&…

人工智能、机器学习、深度学习:2025技术革命的深度解析

目录 人工智能、机器学习、深度学习&#xff1a;技术革命的深度解析 引言 第一部分&#xff1a;人工智能的起源与演进 1.1 人工智能的定义 1.2 人工智能的历史 1.3 人工智能的关键概念 a.知识表示&#xff08;Knowledge Representation&#xff09; b.搜索算法&#xf…

【Python】常用内置模块

1.os 文件目录 import os# 创建文件夹 os.mkdir(dir) # 判断文件是否存在 os.path.exists(path) # 列出文件夹下文件列表 os.listdir(dir)""" 常用 """ # 当前文件相对路径 os.getcwd()# 当前文件绝对路径 os.path.abspath(__file__)# 当前文…

(Python)爬虫进阶(Python爬虫教程)(CSS选择器)

源代码&#xff1a;#导入库 import requests from bs4 import BeautifulSoup import pandas as pd#爬虫函数 def scrape_books():#1.基本网址连接base_url "http://books.toscrape.com"#2.获取基本网址responserequests.get(base_url)#3.检查是否正常访问if respons…

第七节 自然语言处理与Bert

自然语言处理与BERT模型&#xff1a;从基础到实践入门 自然语言处理&#xff08;NLP&#xff09;的核心目标之一是让计算机理解人类语言的语义和上下文。本文将从基础的字词表示出发&#xff0c;逐步解析传统模型的局限性、Self-attention的突破性思想&#xff0c;以及BERT如何…

攻击者瞄准加密技术的基础:智能合约

虽然利用许多智能合约中的安全漏洞已经成为网络攻击者的长期目标&#xff0c;但越来越多的安全公司开始关注使用欺诈性或混淆的智能合约从加密货币账户中窃取资金的骗局。 根据网络安全公司 SentinelOne 本周发布的分析报告&#xff0c;在最近一次引人注目的攻击中&#xff0c…

基于开源AI大模型、AI智能名片与S2B2C商城小程序的零售智能化升级路径研究

摘要&#xff1a;在零售业数字化转型浪潮中&#xff0c;人工智能技术正从“辅助工具”向“核心生产力”演进。本文聚焦开源AI大模型、AI智能名片与S2B2C商城小程序的协同应用&#xff0c;提出“数据感知-关系重构-生态协同”的三维创新框架。通过分析智能传感、动态画像与供应链…

机器学习 朴素贝叶斯

目录 一.什么是朴素贝叶斯 1.1 从 “概率” 到 “分类” 二.朴素贝叶斯的数学基础&#xff1a;贝叶斯定理 2.1 贝叶斯定理公式 2.2 从贝叶斯定理到朴素贝叶斯分类 2.3 “朴素” 的关键&#xff1a;特征独立性假设 三、朴素贝叶斯的三种常见类型 3.1 高斯朴素贝叶斯&…

A Logical Calculus of the Ideas Immanent in Nervous Activity(神经网络早期的M-P模型)

哈喽&#xff0c;各位朋友大家上午好&#xff01;今天我们要一起啃下这篇神经科学与逻辑学交叉领域的奠基之作——McCulloch和Pitts的《A Logical Calculus of the Ideas Immanent in Nervous Activity》。这篇论文篇幅不长&#xff0c;但每一个定理、每一个假设都像精密齿轮&a…

大语言模型提示工程与应用:提示工程-提升模型准确性与减少偏见的方法

语言模型可靠性优化 学习目标 在本课程中&#xff0c;我们将学习通过提示工程提升模型事实准确性、减少偏见的有效方法。 相关知识点 语言模型可靠性优化 学习内容 1 语言模型可靠性优化 1.1 事实准确性增强 LLM可能生成看似合理但实际虚构的内容。优化策略包括&#x…

遇到前端导出 Excel 文件出现乱码或文件损坏的问题

1. 检查后端返回的数据格式确认接口响应&#xff1a;确保后端返回的是二进制流&#xff08;如 ArrayBuffer&#xff09;或 Base64 编码的 Excel 文件&#xff0c;而非 JSON 字符串。用浏览器开发者工具&#xff08;Network 标签&#xff09;检查接口响应类型&#xff1a;正确的…

2025年Cloudflare WAF防护机制深度剖析:5秒盾绕过完全指南

2025年Cloudflare WAF防护机制深度剖析&#xff1a;5秒盾绕过完全指南 技术概述 Cloudflare作为全球领先的CDN和网络安全服务提供商&#xff0c;其WAF&#xff08;Web Application Firewall&#xff09;防护系统已经成为现代Web安全的标杆。特别是其标志性的"5秒盾"…

【Android调用相册、拍照、录像】等功能的封装

关于调用Android项目 关于Android中调用相机拍照、录像&#xff0c;调用相册选图等是比较繁琐的&#xff0c;为了减少代码冗余&#xff0c;肯定需要封装成工具类&#xff0c;最终使用大概如下&#xff0c;大部分代码使用Java编写&#xff0c;因为需要照顾到不适用kotlin的伸手…