【Java 进阶篇】JDBC查询操作详解

在这里插入图片描述

在数据库编程中,查询是一项非常常见且重要的操作。JDBC(Java Database Connectivity)提供了丰富的API来执行各种类型的查询操作。本篇博客将详细介绍如何使用JDBC进行查询操作,包括连接数据库、创建查询语句、执行查询、处理结果集等方面的内容。无论你是初学者还是有一定经验的开发者,都可以从中获得有价值的信息。

准备工作

在进行JDBC查询操作之前,我们需要进行一些准备工作:

  1. 安装数据库驱动程序:首先,确保你已经安装了与你使用的数据库相对应的JDBC驱动程序。不同数据库有不同的JDBC驱动,你需要下载并将其添加到你的项目中。

  2. 创建数据库:如果还没有数据库,可以使用数据库管理工具(如MySQL Workbench)创建一个数据库,然后在该数据库中创建表格并插入一些数据,以便进行查询操作的演示。

  3. 导入JDBC库:在Java项目中,你需要导入JDBC库,通常是java.sql包下的类和接口。

连接数据库

在进行任何数据库操作之前,首先需要建立与数据库的连接。连接数据库是通过Connection对象来完成的。以下是连接到数据库的基本步骤:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;public class JDBCDemo {public static void main(String[] args) {// JDBC连接URL,其中mydatabase是数据库名String jdbcUrl = "jdbc:mysql://localhost:3306/mydatabase";String username = "your_username";String password = "your_password";try {// 创建数据库连接Connection connection = DriverManager.getConnection(jdbcUrl, username, password);// 在此处执行查询操作// 关闭连接connection.close();} catch (SQLException e) {e.printStackTrace();}}
}

在上面的代码中,我们首先指定了数据库的连接URL、用户名和密码。然后,通过DriverManager.getConnection()方法创建了与数据库的连接,并在最后关闭了连接。请替换jdbcUrlusernamepassword为你自己的数据库信息。

创建查询语句

一旦建立了数据库连接,我们就可以创建查询语句。查询语句是使用StatementPreparedStatement对象来执行的。这里我们介绍两种常见的创建查询语句的方式。

使用Statement

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 jdbcUrl = "jdbc:mysql://localhost:3306/mydatabase";String username = "your_username";String password = "your_password";try {Connection connection = DriverManager.getConnection(jdbcUrl, username, password);// 创建Statement对象Statement statement = connection.createStatement();// 在此处执行查询操作// 关闭连接和Statementstatement.close();connection.close();} catch (SQLException e) {e.printStackTrace();}}
}

上述代码中,我们通过connection.createStatement()方法创建了一个Statement对象,它用于执行SQL语句。这种方式适用于静态的SQL查询。

使用PreparedStatement

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 jdbcUrl = "jdbc:mysql://localhost:3306/mydatabase";String username = "your_username";String password = "your_password";try {Connection connection = DriverManager.getConnection(jdbcUrl, username, password);// 创建PreparedStatement对象,可以使用占位符String sql = "SELECT * FROM students WHERE age > ?";PreparedStatement preparedStatement = connection.prepareStatement(sql);// 设置占位符的值preparedStatement.setInt(1, 18);// 在此处执行查询操作// 关闭连接和PreparedStatementpreparedStatement.close();connection.close();} catch (SQLException e) {e.printStackTrace();}}
}

在上述代码中,我们使用connection.prepareStatement()方法创建了一个PreparedStatement对象,它可以包含占位符。这种方式适用于需要动态生成SQL查询的情况,同时也有助于防止SQL注入攻击。

执行查询

一旦创建了查询语句,我们就可以执行查询操作了。执行查询的方式主要有两种:使用executeQuery()方法执行查询并返回结果集,以及使用executeUpdate()方法执行更新操作。

使用executeQuery()

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class JDBCDemo {public static void main(String[] args) {String jdbcUrl = "jdbc:mysql://localhost:3306/mydatabase";String username = "your_username";String password = "your_password";try {Connection connection = DriverManager.getConnection(jdbcUrl, username, password);Statement statement = connection.createStatement();// 执行查询操作,将结果存储在ResultSet对象中String query = "SELECT * FROM students";ResultSet resultSet = statement.executeQuery(query);// 遍历结果集并处理数据while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");int age = resultSet.getInt("age");System.out.println("ID: " + id + ", Name: " + name + ", Age: " + age);}// 关闭连接、Statement和ResultSetresultSet.close();statement.close();connection.close();} catch (SQLException e) {e.printStackTrace();}}
}

在上面的代码中,我们使用executeQuery()方法执行了一个查询操作,并将结果存储在ResultSet对象中。然后,我们通过遍历ResultSet来访问查询结果的每一行。

使用executeUpdate()

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 jdbcUrl = "jdbc:mysql://localhost:3306/mydatabase";String username = "your_username";String password = "your_password";try {Connection connection = DriverManager.getConnection(jdbcUrl, username, password);Statement statement = connection.createStatement();// 执行更新操作,返回受影响的行数String update = "UPDATE students SET age = 20 WHERE id = 1";int rowsAffected = statement.executeUpdate(update);System.out.println("Rows affected: " + rowsAffected);// 关闭连接和Statementstatement.close();connection.close();} catch (SQLException e) {e.printStackTrace();}}
}

在上述代码中,我们使用executeUpdate()方法执行了一个更新操作,例如更新表中的某些数据。它返回受影响的行数,以便我们知道操作的结果。

处理结果集

一旦我们执行了查询操作并获得了结果集,就需要对结果集进行处理。常见的处理方式包括遍历结果集、提取数据以及关闭结果集。

// 遍历结果集并处理数据
while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");int age = resultSet.getInt("age");System.out.println("ID: " + id + ", Name: " + name + ", Age: " + age);
}// 提取数据
if (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");int age = resultSet.getInt("age");
}// 关闭结果集
resultSet.close();

遍历结果集时,我们使用next()方法来移动到结果集的下一行。然后,使用getXXX()方法(例如getInt()getString())来提取数据。最后,使用close()方法关闭结果集。

异常处理

在进行任何数据库操作时,务必进行异常处理以处理潜在的错误情况。在上述代码示例中,我们使用了try-catch块来捕获SQLException异常,并在异常发生时打印错误信息。

try {// 执行数据库操作
} catch (SQLException e) {e.printStackTrace();
}

这样可以确保在遇到问题时能够及时识别和解决。

总结

本篇博客介绍了如何使用JDBC进行查询操作的基本步骤,包括连接数据库、创建查询语句、执行查询操作和处理结果集。希望这些示例能够帮助你更好地理解和使用JDBC进行数据库查询操作。在实际开发中,你可以根据自己的需求和数据库类型来编写相应代码,来完成自己的需求。

作者信息

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

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

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

相关文章

python——Django框架

一、基本介绍 Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架。 使用 Django,只要很少的代码,Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容,并进一步开发出全功能的 Web 服务 Django 本身基于 MVC …

【Pytorch笔记】4.梯度计算

深度之眼官方账号 - 01-04-mp4-计算图与动态图机制 前置知识:计算图 可以参考我的笔记: 【学习笔记】计算机视觉与深度学习(2.全连接神经网络) 计算图 以这棵计算图为例。这个计算图中,叶子节点为x和w。 import torchw torch.tensor([1.]…

基于.Net Core实现自定义皮肤WidForm窗口

前言 今天一起来实现基于.Net Core、Windows Form实现自定义窗口皮肤,并实现窗口移动功能。 素材 准备素材:边框、标题栏、关闭按钮图标。 窗体设计 1、创建Window窗体项目 2、窗体设计 拖拉4个Panel控件,分别用于:标题栏、关…

【Redis】基础数据结构-字典

Redis 字典 基本语法 字典是Redis中的一种数据结构,底层使用哈希表实现,一个哈希表中可以存储多个键值对,它的语法如下,其中KEY为键,field和value为值(也是一个键值对): HSET key…

基于SSM农产品商城系统

基于SSM农产品商城系统的设计与实现,前后端分离,文档 开发语言:Java数据库:MySQL技术:SpringSpringMVCMyBatisVue工具:IDEA/Ecilpse、Navicat、Maven 系统展示 农产品列表 产品详情 个人中心 登陆界面 管…

以太网基础学习(二)——ARP协议

一、什么是MAC地址 MAC地址(英语:Media Access Control Address),直译为媒体访问控制位址,也称为局域网地址(LAN Address),MAC位址,以太网地址(Ethernet Addr…

【算法训练-字符串 三】字符串相加

废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【字符串相加】,使用【字符串】这个基本的数据结构来实现,这个高频题的站点是:CodeTop,筛选条件为&…

电脑突然提示mfc140u.dll丢失,缺失mfc140u.dll无法运行程序的解决方法

在当今信息化社会,电脑已经成为我们生活和工作中不可或缺的一部分。然而,随着技术的不断发展,电脑也会出现各种问题。其中,最常见的问题之一就是“mfc140u.dll丢失”。那么,当我们遇到这个问题时,应该如何解…

ISP图像信号处理——白平衡校正和标定介绍以及C++实现

从数码相机直接输出的未经过处理过的RAW图到平常看到的JEPG图有一系列复杂的图像信号处理过程,称作ISP(Image Signal Processing)。这个过程会经过图像处理和压缩。 参考文章1:http://t.csdn.cn/LvHH5 参考文章2:htt…

WebSocket实战之四WSS配置

一、前言 上一篇文章WebSocket实战之三遇上PAC ,碰到的问题只能上安全的WebSocket(WSS)才能解决,配置证书还是挺麻烦的,主要是每年都需要重新更新证书,我配置过的证书最长有效期也只有两年,搞不…

【数据结构】排序(2)—冒泡排序 快速排序

目录 一. 冒泡排序 基本思想 代码实现 时间和空间复杂度 稳定性 二. 快速排序 基本思想 代码实现 hoare法 挖坑法 前后指针法 时间和空间复杂度 稳定性 一. 冒泡排序 基本思想 冒泡排序是一种交换排序。两两比较数组元素,如果是逆序(即排列顺序与排序后…

定时任务管理平台青龙 QingLong

一、关于 QingLong 1.1 QingLong 介绍 青龙面板是支持 Python3、JavaScript、Shell、Typescript 多语言的定时任务管理平台,支持在线管理脚本和日志等。其功能丰富,能够满足大部分需求场景,值得一试。 主要功能 支持多种脚本语言&#xf…

我的企业证书是正常的但是下载应用app到手机提示无法安装“app名字”无法安装此app,因为无法验证其完整性解决方案

我的企业证书是正常的但是下载应用app到手机提示无法安装“app名字”无法安装此app,因为无法验证其完整性解决方案 首先,确保您从可信任的来源下载并安装企业开发者签名过的应用程序。如果您不确定应用程序的来源,建议您联系应用程序提供者…

你写过的最蠢的代码是?——AI领域的奇妙体验

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

Redis与分布式-哨兵模式

接上文 Redis与分布式-主从复制 1.哨兵模式 启动一个哨兵,只需要修改配置文件即可, sentinel monitor lbwnb 1247.0.0.1 6001 1先将所有服务关闭,然后修改配置文件,redis Master,redis Slave,redis Slave…

源码系列 之 ThreadLocal

简介 ThreadLocal的作用是做数据隔离,存储的变量只属于当前线程,相当于当前线程的局部变量,多线程环境下,不会被别的线程访问与修改。常用于存储线程私有成员变量、上下文,和用于同一线程,不同层级方法间传…

复习C语言数组的用法

实验内容 1.1设计一个函数fun&#xff0c;功能是有N*N的矩阵&#xff0c;根据给定的m值&#xff0c;m<N,将每行元素中的值&#xff0c;均往右移m个位置&#xff0c;左边置0 #include<stdio.h> void fun(int (*a)[3],int m){int n,j,i,k,num;int p2;//右移位置列数nu…

基于体素场景的摄像机穿模处理

基于上一篇一种基于体素的射线检测 使用射线处理第三人称摄像头穿模问题 基于体素的第三人称摄像机拉近简单处理 摄像机移动至碰撞点处 简单的从角色身上发射一条射线到摄像机&#xff0c;中途遇到碰撞就把摄像机移动至该碰撞点 public void UpdateDistance(float defaultDist…

OpenGL之光照贴图

我们需要拓展之前的系统,引入漫反射和镜面光贴图(Map)。这允许我们对物体的漫反射分量和镜面光分量有着更精确的控制。 漫反射贴图 我们希望通过某种方式对物体的每个片段单独设置漫反射颜色。我们仅仅是对同样的原理使用了不同的名字:其实都是使用一张覆盖物体的图像,让我…

软件测试教程 自动化测试selenium篇(二)

掌握Selenium常用的API的使用 一、webdriver API public class Main {public static void main(String[] args) {ChromeOptions options=new ChromeOptions();//参数表示允许所有请求options.addArguments("--remote-allow-origins=*");WebDriver webDriver=new Chr…