Java数据库操作指南:快速上手JDBC【学术会议-2025年数字化教育与信息技术(DEIT 2025】

大会官网:www.ic-deit.org 

前言

在现代企业应用中,数据库是数据存储和管理的重要组成部分。Java作为一种广泛使用的编程语言,提供了多种方式与数据库进行交互。本文将介绍 JDBC(Java Database Connectivity),它是Java语言与数据库之间的桥梁,帮助开发者通过Java程序与数据库进行连接、查询、插入、更新和删除数据。

什么是JDBC?

JDBC(Java数据库连接)是Java提供的一套API,用于从Java程序中访问和操作关系型数据库。通过JDBC,Java程序能够执行SQL语句、管理数据库连接,并处理结果集。JDBC是Java平台的标准一部分,支持多种数据库管理系统(DBMS),如MySQL、Oracle、PostgreSQL、SQL Server等。

JDBC的核心组件

  1. DriverManager
    管理数据库驱动程序,负责选择正确的驱动程序并与数据库建立连接。

  2. Connection
    代表数据库连接,JDBC的核心对象之一。通过Connection可以执行SQL语句、获取Statement、PreparedStatement等对象。

  3. Statement
    用于执行SQL语句,分为以下几类:

    • Statement: 用于执行简单的SQL查询。
    • PreparedStatement: 用于执行预编译的SQL查询,避免SQL注入问题,并提高性能。
    • CallableStatement: 用于执行存储过程。
  4. ResultSet
    执行查询后返回的结果集。通过ResultSet对象,可以访问查询的结果数据。

配置JDBC

在使用JDBC时,需要确保以下几个步骤:

  1. 加载数据库驱动:首先要加载数据库的JDBC驱动,通常使用Class.forName()来动态加载。
  2. 建立数据库连接:使用DriverManager.getConnection()方法建立与数据库的连接。
  3. 执行SQL语句:通过StatementPreparedStatement对象执行SQL语句。
  4. 处理结果集:使用ResultSet对象读取查询的结果数据。
  5. 关闭连接:最后,关闭数据库连接以释放资源。

实践示例:JDBC数据库操作

1. 连接数据库

首先,我们需要添加数据库的JDBC驱动包。如果使用的是MySQL,可以下载并添加 MySQL JDBC 驱动(mysql-connector-java)。

然后,创建一个简单的Java程序来连接数据库。

import java.sql.*;public class JDBCExample {public static void main(String[] args) {// 数据库连接信息String url = "jdbc:mysql://localhost:3306/testdb";String user = "root";String password = "root";// 连接对象Connection connection = null;try {// 1. 加载数据库驱动(对于MySQL数据库)Class.forName("com.mysql.cj.jdbc.Driver");// 2. 获取数据库连接connection = DriverManager.getConnection(url, user, password);System.out.println("连接成功!");} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();} finally {// 关闭连接try {if (connection != null) {connection.close();}} catch (SQLException e) {e.printStackTrace();}}}
}

这段代码展示了如何加载MySQL驱动、建立数据库连接并进行简单的连接验证。

2. 执行查询操作

接下来,我们通过JDBC查询数据库,获取并输出查询结果。

public class JDBCQueryExample {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/testdb";String user = "root";String password = "root";String query = "SELECT * FROM users";  // 假设有一个名为users的表Connection connection = null;Statement statement = null;ResultSet resultSet = null;try {// 1. 加载数据库驱动Class.forName("com.mysql.cj.jdbc.Driver");// 2. 获取数据库连接connection = DriverManager.getConnection(url, user, password);// 3. 创建Statement对象statement = connection.createStatement();// 4. 执行SQL查询resultSet = statement.executeQuery(query);// 5. 处理结果集while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");String email = resultSet.getString("email");System.out.println("ID: " + id + ", Name: " + name + ", Email: " + email);}} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();} finally {// 关闭资源try {if (resultSet != null) resultSet.close();if (statement != null) statement.close();if (connection != null) connection.close();} catch (SQLException e) {e.printStackTrace();}}}
}

此代码通过executeQuery()方法执行一个SELECT语句,返回一个ResultSet对象,并通过next()方法遍历结果。

3. 插入数据

使用PreparedStatement进行数据插入,可以提高性能并避免SQL注入。

public class JDBCInsertExample {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/testdb";String user = "root";String password = "root";String insertQuery = "INSERT INTO users (name, email) VALUES (?, ?)";Connection connection = null;PreparedStatement preparedStatement = null;try {// 1. 加载数据库驱动Class.forName("com.mysql.cj.jdbc.Driver");// 2. 获取数据库连接connection = DriverManager.getConnection(url, user, password);// 3. 创建PreparedStatement对象preparedStatement = connection.prepareStatement(insertQuery);preparedStatement.setString(1, "John Doe");preparedStatement.setString(2, "john.doe@example.com");// 4. 执行更新操作(插入数据)int rowsAffected = preparedStatement.executeUpdate();System.out.println("插入了 " + rowsAffected + " 行数据");} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();} finally {// 关闭资源try {if (preparedStatement != null) preparedStatement.close();if (connection != null) connection.close();} catch (SQLException e) {e.printStackTrace();}}}
}

PreparedStatement允许我们使用占位符?,在插入数据时动态绑定参数,避免SQL注入问题。

4. 更新数据

通过PreparedStatement更新数据:

public class JDBCUpdateExample {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/testdb";String user = "root";String password = "root";String updateQuery = "UPDATE users SET email = ? WHERE name = ?";Connection connection = null;PreparedStatement preparedStatement = null;try {// 1. 加载数据库驱动Class.forName("com.mysql.cj.jdbc.Driver");// 2. 获取数据库连接connection = DriverManager.getConnection(url, user, password);// 3. 创建PreparedStatement对象preparedStatement = connection.prepareStatement(updateQuery);preparedStatement.setString(1, "new.email@example.com");preparedStatement.setString(2, "John Doe");// 4. 执行更新操作int rowsAffected = preparedStatement.executeUpdate();System.out.println("更新了 " + rowsAffected + " 行数据");} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();} finally {// 关闭资源try {if (preparedStatement != null) preparedStatement.close();if (connection != null) connection.close();} catch (SQLException e) {e.printStackTrace();}}}
}

5. 删除数据

通过PreparedStatement删除数据:

public class JDBCDeleteExample {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/testdb";String user = "root";String password = "root";String deleteQuery = "DELETE FROM users WHERE name = ?";Connection connection = null;PreparedStatement preparedStatement = null;try {// 1. 加载数据库驱动Class.forName("com.mysql.cj.jdbc.Driver");// 2. 获取数据库连接connection = DriverManager.getConnection(url, user, password);// 3. 创建PreparedStatement对象preparedStatement = connection.prepareStatement(deleteQuery);preparedStatement.setString(1, "John Doe");// 4. 执行删除操作int rowsAffected = preparedStatement.executeUpdate();System.out.println("删除了 " + rowsAffected + " 行数据");} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();} finally {// 关闭资源try {if (preparedStatement != null) preparedStatement.close();if (connection != null) connection.close();} catch (SQLException e) {e.printStackTrace();}}}
}
扩展:

具体来说,setString(int parameterIndex, String x) 方法用于将指定位置的占位符(?)替换成指定的字符串值。

PreparedStatement 的工作原理

PreparedStatement 是一个接口,用于执行预编译的 SQL 查询。在 SQL 查询中,通常使用 ? 来表示占位符,表示参数将在运行时被动态传入,而不是在 SQL 查询字符串中直接硬编码。

例如,假设你要执行一个插入操作,SQL 语句可能是这样的:

INSERT INTO users (name, email) VALUES (?, ?);

这个 SQL 语句有两个 ? 占位符,表示你将动态地插入两个值(例如,nameemail)。

setString(int parameterIndex, String x) 详解

  • parameterIndex:这个参数表示要替换的占位符的位置(从1开始),也就是你想要设置哪个位置的参数。
  • x:这是你想要设置的值,类型必须与占位符的类型匹配。在这种情况下,我们使用 setString,意味着占位符将会被一个字符串值替换。

preparedStatement.setString(1, "John Doe");
 

  • 1:这是第一个 ? 占位符的位置(从1开始计数)。表示要将 ? 的位置替换为 John Doe
  • "John Doe":这是你要插入的实际值(字符串 "John Doe")。这个值会替代 SQL 语句中的第一个占位符 ?

等价于:

INSERT INTO users (name, email) VALUES ('John Doe', ?);

preparedStatement.setString(2, "john.doe@example.com");
  • 2:这是第二个 ? 占位符的位置,表示要将 SQL 中的第二个 ? 替换为 john.doe@example.com
  • "john.doe@example.com":这是你要插入的实际值(字符串 "john.doe@example.com")。这个值会替代 SQL 语句中的第二个占位符 ?

等价于:

INSERT INTO users (name, email) VALUES ('John Doe', 'john.doe@example.com');

结合完整 SQL 语句

将这两行代码与 SQL 语句结合,最终执行的 SQL 语句就是:

INSERT INTO users (name, email) VALUES ('John Doe', 'john.doe@example.com');

这两行代码的作用是:

  • 第一行将 "John Doe" 作为第一个参数(name)传递给 SQL 查询。
  • 第二行将 "john.doe@example.com" 作为第二个参数(email)传递给 SQL 查询。

使用 PreparedStatement 设置参数有两个主要优点:

  1. 防止 SQL 注入攻击:通过占位符传递参数,避免直接将数据嵌入 SQL 语句中,减少了恶意 SQL 注入的风险。
  2. 提高性能:对于重复执行相同 SQL 查询的情况,JDBC 可以重用编译后的 SQL 执行计划,避免了每次都需要重新解析 SQL。

总结

本文展示了如何在Java中使用JDBC进行简单的数据库操作,包括连接数据库查询插入更新删除等基本操作。JDBC为Java应用程序提供了强大的数据库交互功能,但也需要注意资源管理(如连接的关闭)以及SQL注入等安全问题。希望本文能够帮助大家快速上手并实现Java与数据库的交互。

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

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

相关文章

神经网络的通俗介绍

人工神经网络,是一种模仿人类大脑工作原理的数学模型。人类的大脑是由无数的小“工作站”组成的,每个工作站叫做“神经元”。这些神经元通过“电线”互相连接,负责接收、处理和传递信息。 一、人类大脑神经网络 人类大脑的神经网络大概长这…

OpenEuler学习笔记(八):安装OpenEuler

在VMware Workstation中安装OpenEuler 准备工作 下载并安装VMware Workstation虚拟机软件。前往OpenEuler官网下载OpenEuler系统镜像文件。 创建虚拟机 打开VMware Workstation,点击“创建新的虚拟机”,选择“自定义”,点击“下一步”。选择…

Leetcode::119. 杨辉三角 II

119. 杨辉三角 II 已解答 简单 相关标签 相关企业 给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: rowIndex 3 输出: [1,3,3,1]示例 2: 输入: rowIndex 0…

让Android adb支持互联网调试脱离局域网

某些特殊场景下由于不方便,手机不在身边,但需要进行adb调试。 首先可以先开启adb的无线调试模式,我使用的是第二种方式。 在Android手机上安装一个终端模拟器,并赋予root权限,随后执行: setprop service.…

Dest1ny漏洞库:用友 U8-CRM 系统 ajaxgetborrowdata.php 存在 SQL 注入漏洞

用友U8-CRM系统ajaxgetborrowdata.php存在SQL注入漏洞,文件多个方法存在SQL注入漏洞,未经身份验证的攻击者通过漏洞执行任意SQL语句,调用xp_cmdshell写入后门文件,执行任意代码,从而获取到服务器权限。 hunter app.n…

能说说MyBatis的工作原理吗?

大家好,我是锋哥。今天分享关于【Redis为什么这么快?】面试题。希望对大家有帮助; 能说说MyBatis的工作原理吗? MyBatis 是一款流行的持久层框架,它通过简化数据库操作,帮助开发者更高效地与数据库进行交互。MyBatis…

DeepSeek崛起:中国AI新星如何撼动全球资本市场格局

引言 近期,中国人工智能实验室DeepSeek发布的两款开源模型——DeepSeek V3和DeepSeek R1——以其优异的性能和低廉的成本迅速爆火,引发了全球资本市场的震动,尤其对美国资本市场产生了显著影响。DeepSeek R1更是能够在数学、代码和推理任务上…

将5分钟安装Thingsboard 脚本升级到 3.9

稍微花了一点时间,将5分钟安装Thingsboard 脚本升级到最新版本 3.9。 [rootlab5 work]# cat one-thingsboard.shell echo "test on RHEL 8.10 " source /work/java/install-java.shell source /work/thingsboard/thingsboard-rpm.shell source /work/po…

算法刷题Day30

题目链接 描述 解题思路 考点:动态规划 dp[i][j]表示当前坐标的最小路径和dp初始化状态转移: dp[i][j] matrix[i][j] min(dp[i-1][j],dp[i][j-1]) 比较正上方和正左方的路径和哪个小。取小的那条路 代码 import copy class Solution:def minPathS…

大数据Hadoop入门2

目录 第三部分(Hadoop MapReduce和Hadoop YARN) 1.课程内容-大纲-学习目标 2.理解先分再合、分而治之的思想 3.hadoop团队针对MapReduce的设计构思 4.Hadoop MapReduce介绍、阶级划分和进程组成 5.Hadoop MapReduce官方示例-圆周率PI评估 6.Hadoo…

基于ESP8266的多功能环境监测与反馈系统开发指南

项目概述 本系统集成了物联网开发板、高精度时钟模块、环境传感器和可视化显示模块,构建了一个智能环境监测与反馈装置。通过ESP8266 NodeMCU作为核心控制器,结合DS3231实时时钟、DHT11温湿度传感器、光敏电阻和OLED显示屏,实现了环境参数的…

开发环境搭建-3:配置 JavaScript 开发环境 (fnm+ nodejs + pnpm + nrm)

在 WSL 环境中配置:WSL2 (2.3.26.0) Oracle Linux 8.7 官方镜像 node 官网:https://nodejs.org/zh-cn/download 点击【下载】,选择想要的 node 版本、操作系统、node 版本管理器、npm包管理器 根据下面代码提示依次执行对应代码即可 基本概…

npm:升级自身时报错:EBADENGINE

具体报错信息如下: 1.原因分析 npm和当前的node版本不兼容。 // 当前实际版本: Actual: {"npm":"10.2.4","node":"v20.11.0"}可以通过官网文档查看与自己 node 版本 兼容的是哪一版本的npm,相对应进行更新即可…

WPS数据分析000005

目录 一、数据录入技巧 二、一维表 三、填充柄 向下自动填充 自动填充选项 日期填充 星期自定义 自定义序列 1-10000序列 四、智能填充 五、数据有效性 出错警告 输入信息 下拉列表 六、记录单 七、导入数据 ​编辑 八、查找录入 会员功能 Xlookup函数 VL…

翼星求生服务器搭建【Icarus Dedicated Server For Linux】

一、前言 本次搭建的服务器为Steam平台一款名为Icarus的沙盒、生存、建造游戏,由于官方只提供了Windows版本服务器导致很多热爱Linux的小伙伴无法释怀,众所周知Linux才是专业服务器的唯一准则。虽然Github上已经有大佬制作了容器版本但是容终究不够完美,毕竟容器无法与原生L…

机器学习-线性回归(参数估计之经验风险最小化)

给定一组包含 𝑁 个训练样本的训练集 我们希望能够 学习一个最优的线性回归的模型参数 𝒘 现在我们来介绍线性回归的一种模型参数估计方法:经验风险最小化。 我们前面说过,对于标签 𝑦 和模型输出都为连续的实数值&…

前部分知识复习02

一、物体的屏幕UV坐标 float2 ScreenUV i.pos.xy / _ScreenParams.xy; 二、抓取屏幕图像 GrabPass{" _A "} //_A为贴图图像名称 之后需在Pass中声明该贴图才能在Pass中引用此贴图 三、屏幕抓取并制作热效应代码 Shader"unity/HeatDistort 07" {Pr…

【MQ】探索 Kafka

高性能 消息的顺序性、顺序写磁盘 零拷贝 RocketMQ内部主要是使用基于mmap实现的零拷贝,用来读写文件 减少cpu的拷贝次数和上下文切换次数,实现文件的高效读写操作 Kafka 零拷贝 Kafka 使用到了 mmap 和 sendfile 的方式来实现零拷贝。分别对应 Jav…

VMware 和本机(Win10)安装共享文件

1. 安装VM-tools, sudo apt-get install open-vm-tools-desktop -y 2. VMware->设置-> 选项中启动共享文件夹. 3. 本机设置共享文件夹(文件目录为data),右键属性设置: VMware, Other Locations->Computer->mnt->data 即可。 ps: 还有个…

2025美赛MCM数学建模A题:《石头台阶的“记忆”:如何用数学揭开历史的足迹》(全网最全思路+模型)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ 《石头台阶的“记忆”:如何用数学揭开历史的足迹》 目录 《石头台阶的“记忆”:如何用数学揭开历史的足迹》 ✨摘要✨ ✨引言✨ 1. 引言的结构 2. 撰写步骤 (1)研究背景 &#…