Java基础-JDBC

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹)

目录

一、JDBC简介

1.1 什么是JDBC

1.2 JDBC的作用

1.3 JDBC的架构

二、JDBC核心接口与类

2.1 DriverManager

2.2 Connection

2.3 Statement

2.4 PreparedStatement

2.5 ResultSet

三、JDBC操作数据库的基本步骤

四、代码示例

五、深入JDBC的高级特性与性能优化 

5.1 批处理(Batch Processing)

5.2 事务管理

5.3 类型安全的查询

5.4 性能优化

5.5 安全性

5.6 监控与日志


一、JDBC简介

1.1 什么是JDBC

JDBC是Java数据库连接(Java Database Connectivity)的缩写,它为Java应用程序提供了一种标准的方法来访问数据库。通过JDBC,Java程序可以发送SQL语句到数据库,并处理来自数据库的响应。JDBC API是Java SE的一部分,它定义了一组用于与数据库交互的类和接口。

1.2 JDBC的作用

  • 连接数据库:JDBC提供了与数据库建立连接的能力。
  • 执行SQL语句:通过JDBC,Java程序可以执行SQL语句来查询、更新、插入或删除数据库中的数据。
  • 处理结果集:JDBC允许Java程序处理数据库查询返回的结果集。

1.3 JDBC的架构

JDBC架构主要由两层组成:JDBC API和JDBC驱动管理器(DriverManager)。

  • JDBC API:提供了一组用于与数据库交互的接口和类。这些接口和类由Java平台定义,与具体的数据库无关。
  • JDBC驱动管理器(DriverManager):负责管理JDBC驱动程序的加载和注册,以及建立与数据库的连接。

二、JDBC核心接口与类

2.1 DriverManager

DriverManager类管理一组JDBC驱动程序的基本服务。它不直接与数据库交互,而是用于建立与数据库的连接。主要方法包括:

  • getConnection(String url, String user, String password):尝试建立到给定数据库URL的连接,使用指定的用户名和密码。

2.2 Connection

Connection接口代表与特定数据库的连接。通过Connection对象,可以执行SQL语句、管理事务等。主要方法包括:

  • createStatement():创建一个Statement对象,用于执行静态SQL语句并返回它所生成结果的对象。
  • prepareStatement(String sql):创建一个PreparedStatement对象,用于执行带参数的SQL语句。
  • setAutoCommit(boolean autoCommit):设置此连接是否自动提交事务。

2.3 Statement

Statement接口用于执行静态SQL语句并返回它所生成结果的对象。主要方法包括:

  • executeQuery(String sql):执行给定的SQL语句,该语句返回单个ResultSet对象。
  • executeUpdate(String sql):执行给定SQL语句,该语句可能为INSERT、UPDATE或DELETE语句,或者不返回任何内容的SQL语句(如SQL DDL语句)。
  • execute(String sql):执行给定的SQL语句,该语句可能返回多个结果。

2.4 PreparedStatement

PreparedStatement接口继承自Statement接口,它代表预编译的SQL语句。与Statement相比,PreparedStatement的主要优势在于:

  • 提高性能:预编译的SQL语句可以被数据库缓存和重用。
  • 防止SQL注入:通过参数化查询,可以有效防止SQL注入攻击。

2.5 ResultSet

ResultSet接口表示数据库查询的结果集,可以逐行遍历。主要方法包括:

  • next():将光标从当前位置向前移一行。
  • getString(String columnName):以String形式获取当前行的指定列的值。
  • getInt(String columnName):以int形式获取当前行的指定列的值。

三、JDBC操作数据库的基本步骤

  1. 加载并注册JDBC驱动:通过Class.forName()方法加载JDBC驱动,或者使用DriverManager.registerDriver()方法直接注册驱动(不推荐,因为可能导致内存泄漏)。

  2. 建立数据库连接:使用DriverManager.getConnection()方法建立与数据库的连接。

  3. 创建Statement或PreparedStatement:通过Connection对象创建StatementPreparedStatement对象,用于执行SQL语句。

  4. 执行SQL语句:使用StatementPreparedStatement对象执行SQL语句,并处理结果。

  5. 处理结果集:如果SQL语句是查询语句,则处理返回的ResultSet对象。

  6. 关闭连接:关闭ResultSetStatementConnection对象,释放数据库资源。

四、代码示例

以下是一个使用JDBC连接MySQL数据库并执行查询操作的简单示例。

import java.sql.Connection;  
import java.sql.DriverManager;
import java.sql.Connection;  
import java.sql.DriverManager
public class JDBCExample {public static void main(String[] args) {  // 1. 加载并注册JDBC驱动(通常使用Class.forName()自动完成)  try {  Class.forName("com.mysql.cj.jdbc.Driver");  } catch (ClassNotFoundException e) {  e.printStackTrace();  return;  }  // 2. 建立数据库连接  String url = "jdbc:mysql://localhost:3306/yourdatabase?        useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";  String user = "yourusername";  String password = "yourpassword";  Connection conn = null;  try {  conn = DriverManager.getConnection(url, user, password);  // 3. 创建Statement对象  Statement stmt = conn.createStatement();  // 4. 执行SQL查询语句  String sql = "SELECT * FROM yourtable";  ResultSet rs = stmt.executeQuery(sql);  // 5. 处理结果集  while (rs.next()) {  // 假设我们查询的表有一个名为"id"和一个名为"name"的列  int id = rs.getInt("id");  String name = rs.getString("name");  System.out.println("ID: " + id + ", Name: " + name);  }  } catch (Exception e) {  e.printStackTrace();  } finally {  // 6. 关闭连接,释放资源  try {  if (conn != null) {  conn.close();  }  } catch (Exception e) {  e.printStackTrace();  }  }  }
}

五、深入JDBC的高级特性与性能优化 

5.1 批处理(Batch Processing)

批处理是JDBC中一个非常重要的特性,它允许你将多个SQL语句组合成一个批次,然后一次性发送给数据库执行。这可以显著提高执行大量SQL语句时的性能,尤其是在插入或更新数据时。使用StatementPreparedStatementaddBatch()executeBatch()方法可以实现批处理。

PreparedStatement pstmt = conn.prepareStatement("INSERT INTO yourtable (column1, column2) VALUES (?, ?)");  
for (int i = 0; i < 1000; i++) {  pstmt.setString(1, "value1_" + i);  pstmt.setInt(2, i);  pstmt.addBatch();  if (i % 100 == 0) { // 每100条执行一次批处理  pstmt.executeBatch();  pstmt.clearBatch();  }  
}  
if (pstmt.getBatchCount() > 0) {  pstmt.executeBatch();  pstmt.clearBatch();  
}

5.2 事务管理

JDBC提供了事务管理的支持,允许你将多个操作作为一个单一的工作单元来执行。如果事务中的任何操作失败,则整个事务可以被回滚到事务开始之前的状态。使用ConnectionsetAutoCommit(false)来禁用自动提交,并通过commit()rollback()方法来控制事务的提交和回滚。

try {  conn.setAutoCommit(false);  // 执行一系列数据库操作  // ...  conn.commit(); // 提交事务  
} catch (Exception e) {  try {  conn.rollback(); // 发生异常时回滚事务  } catch (SQLException se) {  se.printStackTrace();  }  
} finally {  conn.setAutoCommit(true); // 恢复自动提交  
}

5.3 类型安全的查询

虽然ResultSet提供了基于列名或列索引的方法来获取数据,但这些方法都是基于Object类型的,可能需要类型转换。为了提高代码的可读性和减少错误,JDBC 4.0引入了RowSet接口及其实现类,如CachedRowSet,它们提供了类型安全的访问方法。另外,也可以使用第三方库如MyBatis或Hibernate来实现更高级的对象关系映射(ORM)。

5.4 性能优化

  • 使用合适的数据库驱动:确保使用与你的数据库版本和Java版本兼容的最新JDBC驱动。
  • 优化SQL语句:避免在SQL语句中使用SELECT *,只查询需要的列。使用索引来加速查询。
  • 减少网络传输:尽量在数据库端处理数据,减少网络传输的数据量。
  • 合理设置连接池参数:如最大活跃连接数、最大空闲连接数、连接超时时间等,根据应用的实际需求进行调整。
  • 使用数据库缓存:合理利用数据库的查询缓存机制,减少数据库的I/O操作。

5.5 安全性

  • 防止SQL注入:始终使用PreparedStatement来执行带参数的SQL语句,避免将用户输入直接拼接到SQL语句中。
  • 加密敏感信息:在存储和传输敏感信息(如密码、个人身份信息)时,使用加密技术来保护数据的安全性。
  • 访问控制:实施严格的数据库访问控制策略,确保只有授权的用户才能访问数据库。

5.6 监控与日志

  • 监控数据库性能:使用数据库自带的监控工具或第三方监控软件来监控数据库的性能指标,如CPU使用率、内存使用情况、查询响应时间等。
  • 记录日志:在应用程序中记录详细的数据库操作日志,以便在出现问题时进行故障排查和性能分析。

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

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

相关文章

好好看 3.2.3 | 纯净无广告的四端追剧软件,高清秒播

好好看是一款全新的追剧软件&#xff0c;与网飞猫同一系列&#xff0c;纯净无广告&#xff0c;支持安卓、iOS、TV和PC四端。汇集了Netflix、电影、短剧、剧集、动漫、综艺等资源&#xff0c;并且各大平台资源同步更新。内置多条超清、蓝光、优质等线路&#xff0c;支持投屏、影…

Python爬虫如何处理验证码与登录

Python爬虫如何处理验证码与登录 Python 爬虫在抓取需要登录的网站数据时&#xff0c;通常会遇到两个主要问题&#xff1a;登录验证和验证码处理。这些机制是网站用来防止自动化程序过度抓取数据的主要手段。本文将详细讲解如何使用 Python 处理登录与验证码&#xff0c;以便进…

分布式光伏电站管理的有效措施

分布式光伏电站是一种将太阳能转化为电能的系统&#xff0c;其特点是“自发自用&#xff0c;余电上网”&#xff0c;也就是说&#xff0c;白天利用太阳能进行发电&#xff0c;晚上利用电网进行互补。这种电站建设周期短&#xff0c;见效快&#xff0c;适合于有闲置屋顶或空地的…

濮良贵《机械设计》第十版课后习题答案全解PDF电子版

《机械设计》(第十版)是“十二五”普通高等教育本科国家级规划教材&#xff0c; 是在《机械设计》(第九版)的基础上修订而成的。本次修订主要做了以下几项工作&#xff1a; 1. 内容的适当更新——自本书第九版出版以来&#xff0c; 机械工程及相关领域的新理论、新技术和新标准…

python之正则表达式总结

正则表达式 对于正则表达式的学习&#xff0c;我整理了网上的一些资料&#xff0c;希望可以帮助到各位&#xff01;&#xff01;&#xff01; 我们可以使用正则表达式来定义字符串的匹配模式&#xff0c;即如何检查一个字符串是否有跟某种模式匹配的部分或者从一个字符串中将与…

算法专题:字符串

目录 1. 最长公共前缀 1.1 算法原理 1.2 算法代码 2. 最长回文子串 2.1 算法原理 2.2 算法代码 3. 二进制求和 3.1 算法原理 3.2 算法代码 4. 字符串相乘 4.1 算法原理 4.2 算法代码 1. 最长公共前缀 . - 力扣&#xff08;LeetCode&#xff09; 1.1 算法原理 有以…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第十八集补充:制作空洞骑士独有的EventSystem和InputModule

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、制作空洞骑士独有的EventSystem和InputModule总结 前言 hello大家好久没见&#xff0c;之所以隔了这么久才更新并不是因为我又放弃了这个项目&#xff0c;而…

capl语言

capl:事件型语言 定时器代码 数据类型 capl运算符&#xff08;一&#xff09; capl运算符&#xff08;二&#xff09; 逻辑非&#xff1a;两个条件同时成立则为真&#xff08;1&#xff09;&#xff0c;否则为假&#xff08;0&#xff09;. 逻辑与&#xff1a;只有一个条件…

[渲染层网络层错误] net::ERR_CONTENT_LENGTH_MISMATCH 问题解决

问题描述 问题背景 微信小程序访问后端img资源的时候&#xff0c;偶尔出现这个感叹号&#xff0c;图片加载不出来&#xff0c;但是对应的url贴出来在浏览器中访问&#xff0c;或者重新加载是可以访问的。 错误描述 经查询前端报错 [渲染层网络层错误] net::ERR_CONTENT_LE…

跳蚤市场之商品发布功能

一 商品类别和小类的联动 以下是一个示例代码&#xff0c;展示了如何实现商品类别中大类和小类的联动。 商品大类选择框、小类选择框 的设计 html部分 <form id"category-form"><label for"major-category">大类&#xff1a;</label&g…

LabVIEW气体检测系统

随着工业化进程的加速&#xff0c;环境污染问题愈加严峻&#xff0c;尤其是有害气体的排放对人类生存环境构成了严重威胁。为了更好地监测这些有害气体&#xff0c;开发一个高效、准确且易于操作的气体检测系统显得尤为重要。LabVIEW软件开发的气体检测系统&#xff0c;采用激光…

【三维重建】Semantic Gaussians:开放词汇的3DGS场景理解

文章目录 摘要一、引言二、主要方法1.3D Gaussian Splatting2.其他方法2.1 Gaussian Grouping2.2 GARField 3. 2D Versatile 投影4. 3D Semantic Network4. 推理 四、实验1. 实验设置2.定量结果 论文&#xff1a;https://arxiv.org/pdf/2403.15624 摘要 开放词汇的三维场景理解…

机器学习—前向传播的一般实现

可以写一个函数来实现一个密集的层&#xff0c;那是神经网络的单层&#xff0c;所以定义稠密函数&#xff0c;它将上一层的激活作为输入以及给定层神经元的参数w和b。看下边图片所展示的例子&#xff0c;把所有这些权重向量堆叠成一个矩阵&#xff0c;wnp.array([[1,-3,5][2,4,…

Java实验六 网络和数据库

1. 利用InetAddress编写程序接受用户输入网址&#xff0c;输出这个网址的主机IP地址。 package project; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Scanner; public class GetIPAddress {public static void main(String[] args…

猎板PCB2到10层数的科技进阶与应用解析

1. 单层板&#xff08;Single-sided PCB&#xff09; 定义&#xff1a;单层板是最基本的PCB类型&#xff0c;导线只出现在其中一面&#xff0c;因此被称为单面板。限制&#xff1a;由于只有一面可以布线&#xff0c;设计线路上有许多限制&#xff0c;不适合复杂电路。应用&…

分布式任务调度实现原理

目录 分布式任务调度功能 分布式任务调度实现 1.Scheduler&#xff08;调度器&#xff09; 2.Trigger&#xff08;触发器&#xff09; 3.Job&#xff08;任务&#xff09; 分布式任务调度框架 xxl-job quartz Snail Job PowerJob elastic-job 分布式任务调度功能 通…

qt QFontDialog详解

1、概述 QFontDialog 是 Qt 框架中的一个对话框类&#xff0c;用于选择字体。它提供了一个可视化的界面&#xff0c;允许用户选择所需的字体以及相关的属性&#xff0c;如字体样式、大小、粗细等。用户可以通过对话框中的选项进行选择&#xff0c;并实时预览所选字体的效果。Q…

qt QStandardItem详解

1、概述 QStandardItem是Qt框架中QStandardItemModel的一个基础元素&#xff0c;用于在基于项的模型&#xff08;如QStandardItemModel&#xff09;中表示单个数据项。QStandardItem可以存储文本、图标、工具提示等丰富的信息&#xff0c;并且支持数据的编辑和自定义显示。通过…

【每日一题】LeetCode - 最接近的三数之和

LeetCode 的「最接近的三数之和」问题要求我们从给定整数数组中找到三个数的和&#xff0c;使它最接近目标值。适合初学者的原因在于它结合了双指针、排序等基本技巧&#xff0c;为大家理解基本的算法和数据结构提供了一个很好的机会。 如果你不知道什么是双指针可以参考我之前…

【青牛科技】GC8549替代LV8549/ONSEMI在摇头机、舞台灯、打印机和白色家电等产品上的应用分析

引言 在现代电子产品中&#xff0c;控制芯片的性能直接影响到设备的功能和用户体验。摇头机、舞台灯、打印机和白色家电等领域对控制精度、功耗和成本等方面的要求日益提高。LV8549/ONSEMI等国际品牌的芯片曾是这些产品的主要选择&#xff0c;但随着国内半导体技术的进步&…