【Java 进阶篇】JDBC Statement:执行 SQL 语句的重要接口
在Java应用程序中,与数据库进行交互是一项常见的任务。为了执行数据库操作,我们需要使用JDBC(Java Database Connectivity)来建立与数据库的连接并执行SQL语句。Statement
接口是JDBC中的一个重要接口,它用于执行SQL语句并与数据库进行交互。本文将详细介绍Statement
接口的使用,包括如何创建Statement
对象、执行SQL语句、处理结果等内容。
什么是 JDBC Statement?
Statement
接口是JDBC的一部分,它允许我们向数据库发送SQL查询和更新语句,并从数据库中获取结果。Statement
接口有多个子接口和实现类,常用的有以下几种:
-
Statement
:用于执行普通的SQL语句,不带有参数。 -
PreparedStatement
:用于执行预编译的SQL语句,可以带有参数,防止SQL注入攻击。 -
CallableStatement
:用于执行数据库存储过程。
在本文中,我们将主要关注Statement
接口及其用法。
创建 JDBC Statement 对象
在执行SQL语句之前,首先需要创建Statement
对象。Statement
对象通常与Connection
对象关联,通过Connection
对象的createStatement()
方法创建。下面是创建Statement
对象的示例代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;public class StatementExample {public static void main(String[] args) {// JDBC连接参数String url = "jdbc:mysql://localhost:3306/mydatabase";String username = "root";String password = "password";// 创建Connection对象try (Connection connection = DriverManager.getConnection(url, username, password)) {// 创建Statement对象Statement statement = connection.createStatement();// 在此处执行SQL语句// 关闭Statementstatement.close();} catch (SQLException e) {e.printStackTrace();}}
}
在上述代码中,我们首先创建了一个Connection
对象,然后使用createStatement()
方法创建了一个Statement
对象。需要注意的是,我们在try-with-resources
块中创建了Connection
和Statement
对象,这样在退出块时会自动关闭这些资源,无需手动关闭。
执行 SQL 查询语句
一旦创建了Statement
对象,我们可以使用它来执行SQL查询语句。以下是一个简单的示例,演示如何执行SELECT
查询并处理查询结果:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class SelectExample {public static void main(String[] args) {// JDBC连接参数String url = "jdbc:mysql://localhost:3306/mydatabase";String username = "root";String password = "password";try (Connection connection = DriverManager.getConnection(url, username, password)) {// 创建Statement对象Statement statement = connection.createStatement();// 执行SQL查询语句String sql = "SELECT * FROM employees";ResultSet resultSet = statement.executeQuery(sql);// 处理查询结果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);}// 关闭ResultSet和StatementresultSet.close();statement.close();} catch (SQLException e) {e.printStackTrace();}}
}
在上述代码中,我们使用executeQuery()
方法执行SELECT
查询语句,然后使用ResultSet
对象遍历查询结果。最后,我们关闭了ResultSet
和Statement
对象,释放资源。
执行 SQL 更新语句
除了查询,Statement
对象还可以用于执行SQL更新语句,如INSERT
、UPDATE
和DELETE
。以下是一个示例,演示如何执行INSERT
语句来插入新数据:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;public class InsertExample {public static void main(String[] args) {// JDBC连接参数String url = "jdbc:mysql://localhost:3306/mydatabase";String username = "root";String password = "password";try (Connection connection = DriverManager.getConnection(url, username, password)) {// 创建Statement对象Statement statement = connection.createStatement();// 执行SQL更新语句String sql = "INSERT INTO employees (name, salary) VALUES ('John', 50000)";int rowsAffected = statement.executeUpdate(sql);if (rowsAffected > 0) {System.out.println("Insertion successful. Rows affected: " + rowsAffected);} else {System.out.println("Insertion failed.");}// 关闭Statementstatement.close();} catch (SQLException e) {e.printStackTrace();}}
}
在上述代码中,我们使用executeUpdate()
方法执行INSERT
语句,并检查受影响的行数来确定是否插入成功。
防止 SQL 注入攻击
在使用Statement
执行SQL语句时,要注意防止SQL注入攻击。SQL注入攻击是一种常见的网络安全威胁,它可以通过恶意构造的输入来破坏数据库操作。为了防止SQL注入攻击,应该使用PreparedStatement
而不是Statement
来执行带有参数的SQL语句。PreparedStatement
允许将参数绑定到SQL语句中,从而避免直接拼接用户输入,如下所示:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class PreparedStatementExample {public static void main(String[] args) {// JDBC连接参数String url = "jdbc:mysql://localhost:3306/mydatabase";String username = "root";String password = "password";try (Connection connection = DriverManager.getConnection(url, username, password)) {// 创建PreparedStatement对象String sql = "INSERT INTO employees (name, salary) VALUES (?, ?)";PreparedStatement preparedStatement = connection.prepareStatement(sql);// 设置参数preparedStatement.setString(1, "Alice");preparedStatement.setDouble(2, 60000);// 执行SQL更新语句int rowsAffected = preparedStatement.executeUpdate();if (rowsAffected > 0) {System.out.println("Insertion successful. Rows affected: " + rowsAffected);} else {System.out.println("Insertion failed.");}// 关闭PreparedStatementpreparedStatement.close();} catch (SQLException e) {e.printStackTrace();}}
}
在上述代码中,我们使用PreparedStatement
来执行INSERT
语句,并使用setString()
和setDouble()
方法设置参数值。这样可以确保用户输入不会被误解为SQL代码,提高了安全性。
总结
Statement
接口是JDBC中执行SQL语句的关键接口之一。通过创建Statement
对象,我们可以执行查询和更新等各种数据库操作。然而,为了提高安全性,建议在执行SQL语句时使用PreparedStatement
,尤其是涉及用户输入的情况下。希望本文能够帮助您更好地理解JDBC中的Statement
接口以及如何使用它来与数据库进行交互。
作者信息 作者 : 繁依Fanyi CSDN: https://techfanyi.blog.csdn.net 掘金:https://juejin.cn/user/4154386571867191 |
相关文章:

【Java 进阶篇】JDBC Statement:执行 SQL 语句的重要接口
在Java应用程序中,与数据库进行交互是一项常见的任务。为了执行数据库操作,我们需要使用JDBC(Java Database Connectivity)来建立与数据库的连接并执行SQL语句。Statement接口是JDBC中的一个重要接口,它用于执行SQL语句…...

Python与数据分析--Pandas操作进阶
目录 1.文件读取方式 1.1.绝对路径读取文件 1.2.相对路径读取文件 2.列表数据操作 2.1.列索引指定 2.2.代码数据对齐 3.创建新CSV文件 4.缺失值处理 4.1.缺失值创建 4.2.缺失值检索 4.3.缺失值查询 4.3.1.isnull()函数判断 4.3.2.notnull()函数判断 4.3.3.any()函数…...
国庆小练习
一、二、三 一、 创建一个双向链表, 将26个英文字母通过头插的方式插入到链表中 通过尾删的方式将数据读取出来并删除。main.c #include <my_head.h> #include "dblink.h"int main(int argc, const char *argv[]) {dblink *h create_head();for…...
springboot单体项目如何拆分成微服务
要将一个Spring Boot单体项目拆分成微服务,可以按照以下步骤进行操作: 识别业务域:首先,需要对单体项目进行业务域的划分。将项目中的功能按照业务领域进行分类,每个业务领域可以成为一个独立的微服务。 定义服务接口…...
解决recovery页面反转的问题
1.前言 在android 10.0的系统rom定制化开发工作中,在系统中recoverv的页面也是相关重要的一部分,在系统recovery ta升级等功能,都是需要recoverv功能的,在某些产品定制化中 在recovery的时候,发现居然旋转了180度&…...
如何使用nuScenes数据集格式的单帧数据推理(以DETR3D为例)
【请尊重原创!转载和引用文章内容务必注明出处!未经许可上传到某文库或其他收费阅读/下载网站赚钱的必追究责任!】 无论是mmdetection3D还是OpenPCDet都只有使用数据集(使用哪个数据集由配置文件里指定)训练和测试的代码,没有使用…...

大语言模型之十三 LLama2中文推理
在《大语言模型之十二 SentencePiece扩充LLama2中文词汇》一文中已经扩充好了中文词汇表,接下来就是使用整理的中文语料对模型进行预训练了。这里先跳过预训练环节。先试用已经训练好的模型,看看如何推理。 合并模型 这一步骤会合并LoRA权重࿰…...
iOS AVAudioSession 详解
iOS AVAudioSession 详解 - 简书 默认没有options,category 7种即可满足条件 - (BOOL)setCategory:(AVAudioSessionCategory)category error:(NSError **)outError API_AVAILABLE(ios(3.0), watchos(2.0), tvos(9.0)) API_UNAVAILABLE(macos); 有optionsÿ…...

26-网络通信
网络通信 什么是网络编程? 可以让设备中的程序与网络上其他设备中的程序进行数据交互(实现网络通信的)。 java.net.包下提供了网络编程的解决方案! 基本的通信架构有2种形式:CS架构( Client客户端/Server服…...

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石③
嵌入式Linux应用开发-基础知识-第十九章驱动程序基石③ 第十九章 驱动程序基石③19.5 定时器19.5.1 内核函数19.5.2 定时器时间单位19.5.3 使用定时器处理按键抖动19.5.4 现场编程、上机19.5.5 深入研究:定时器的内部机制19.5.6 深入研究:找到系统滴答 1…...

一文拿捏SpringMVC的调用流程
SpringMVC的调用流程 1.核心元素: DispatcherServlet(前端控制器)HandlerMapping(处理器映射器)HandlerAdapter(处理器适配器) ---> Handler(处理器)ViewResolver(视图解析器 )---> view(视图) 2.调用流程 用户发送请求到前端控制器前端控制器接收用户请求…...
一文详解 JDK1.8 的 Lambda、Stream、LocalDateTime
Lambda Lambda介绍 Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。 Lambda表达式的结构 一个 Lamb…...

WebSocket实战之二协议分析
一、前言 上一篇 WebSocket实战之一 讲了WebSocket一个极简例子和基础的API的介绍,这一篇来分析一下WebSocket的协议,学习网络协议最好的方式就是抓包分析一下什么就都明白了。 二、WebSocket协议 本想盗一张网络图,后来想想不太好&#x…...
LeetCode //C - 208. Implement Trie (Prefix Tree)
208. Implement Trie (Prefix Tree) A trie (pronounced as “try”) or prefix tree is a tree data structure used to efficiently store and retrieve keys in a dataset of strings. There are various applications of this data structure, such as autocomplete and s…...

【Python】time模块和datetime模块的部分函数说明
时间戳与日期 在说到这俩模块之前,首先先明确几个概念: 时间戳是个很单纯的东西,没有“时区”一说,因为时间戳本质上是经过的时间。日常生活中接触到的“日期”、“某点某时某分”准确的说是时间点,都是有时区概念的…...

Python 无废话-基础知识元组Tuple详讲
“元组 Tuple”是一个有序、不可变的序列集合,元组的元素可以包含任意类型的数据,如整数、浮点数、字符串等,用()表示,如下示例: 元组特征 1) 元组中的各个元素,可以具有不相同的数据类型,如 T…...
【Win】Microsoft Spy++学习笔记
参考资料 《用VisualStudio\Spy查窗口句柄,监控窗口消息》 1. 安装 Spy是VS中的工具,所以直接安装VS就可以了; 2. 检查应用程序架构 ChatGPT-Bing: 对于窗口应用程序分析,确定应用程序是32位还是64位是很重要的,因…...

如何解决版本不兼容Jar包冲突问题
如何解决版本不兼容Jar包冲突问题 引言 “老婆”和“妈妈”同时掉进水里,先救谁? 常言道:编码五分钟,解冲突两小时。作为Java开发来说,第一眼见到ClassNotFoundException、 NoSuchMethodException这些异常来说&…...

数据结构—归并排序-C语言实现
引言:归并排序跟快速排序一样,都运用到了分治的算法,但是归并排序是一种稳定的算法,同时也具备高效,其时间复杂度为O(N*logN) 算法图解: 然后开始归并: 就是这个思想,拆成最小子问题…...

Multiple CORS header ‘Access-Control-Allow-Origin‘ not allowed
今天在修改天天生鲜超市项目的时候,因为使用了前后端分离模式,前端通过网关统一转发请求到后端服务,但是第一次使用就遇到了问题,比如跨域问题: 但是,其实网关里是有配置跨域的,只是忘了把前端项…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...

Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL
ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...

【若依】框架项目部署笔记
参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作: 压缩包下载:http://download.redis.io/releases 1. 上传压缩包,并进入压缩包所在目录,解压到目标…...
stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)
这是系统中断服务程序的默认处理汇编函数,如果我们没有定义实现某个中断函数,那么当stm32产生了该中断时,就会默认跑这里来了,所以我们打开了什么中断,一定要记得实现对应的系统中断函数,否则会进来一直循环…...

简约商务通用宣传年终总结12套PPT模版分享
IOS风格企业宣传PPT模版,年终工作总结PPT模版,简约精致扁平化商务通用动画PPT模版,素雅商务PPT模版 简约商务通用宣传年终总结12套PPT模版分享:商务通用年终总结类PPT模版https://pan.quark.cn/s/ece1e252d7df...