【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块中创建了ConnectionStatement对象,这样在退出块时会自动关闭这些资源,无需手动关闭。

执行 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对象遍历查询结果。最后,我们关闭了ResultSetStatement对象,释放资源。

执行 SQL 更新语句

除了查询,Statement对象还可以用于执行SQL更新语句,如INSERTUPDATEDELETE。以下是一个示例,演示如何执行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

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

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

相关文章

【算法速查】一篇文章带你快速入门八大排序(上)

君兮_的个人主页 即使走的再远,也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们,这里是君兮_,首先在这里祝大家中秋国庆双节同乐!!今天用一篇文章为大家把八大排序算法都过一遍,当然由于篇幅的原因不是每…

AI智能问答系统源码/AI绘画商业系统/支持GPT联网提问/支持Midjourney绘画

一、AI创作系统 SparkAi创作系统是基于国外很火的ChatGPT进行开发的AI智能问答系统和AI绘画系统。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图…

opencv for unity package在unity中打开相机不需要dll

下载OpenCV for Unity 导入后,里面有很多案例 直接打开就可以运行 打开相机

CSP-J第二轮试题-2021年-1.2题

文章目录 参考:总结 [CSP-J 2021] 分糖果题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 样例 #3样例输入 #3样例输出 #3 提示答案1答案2-优化 [CSP-J 2021] 插入排序题目描述输入格式输出格式样例 #1样例输入 #1样…

为什么字节大量用GO而不是Java?

见字如面,我是军哥。 我看很多程序员对字节编程语言选型很好奇,为此我还特地问了在字节的两位4-1的技术大佬朋友,然后加上自己的思考,总结了一下就以下 2 个原因: 1、 选型上没有历史包袱 字节的早期的程序员大多来自于…

Linux常见操作命令(1)

​ 前言:作者也是初学Linux,可能总结的还不是很到位 ♈️今日夜电波:达尔文—林俊杰 0:30━━━━━━️💟──────── 4:06 🔄 ◀️ …

Interactive-slam imGui slam3dTool防坑手册

问题一、 glfw error 65544: X11: RandR gamma ramp support seems broken error : failed to compile shader /home/ros_proj/catkin_ws/src/interactive_slam/data/shader/rainbow.vert 0:1(10): error: GLSL 3.30 is not supported. Supported versions are: 1.10, 1.20, 1…

快看看你的手机有没有:谷歌Android全面封杀此类软件!

谷歌坐不住了,因为Android应用商店中,充斥着大量可窃取用户数据的应用,所以必然要出手整治了。 一款名叫“SonicSpy”软件是整个事情的导火索,而该应用是典型的窃取用户数据的应用,其除了可以从手机中提取个人数据外&…

cesium gltf控制

gltf格式详解 glTF格式本质上是一个JSON文件。这一文件描述了整个3D场景的内容。它包含了对场景结构进行描述的场景图。场景中的3D对象通过场景结点引用网格进行定义。材质定义了3D对象的外观,动画定义了3D对象的变换操作(比如选择、平移操作)。蒙皮定义了3D对象如何进行骨骼…

使用华为eNSP组网试验⑵-通过端口地址进行静态路由

有了网络模拟器可以对很多网络应用场景进行模拟,既方便学习又有利于实际的网络实施。 之前因为没有用过,用过了才知道eNSP的好处。但是与思科模拟器不同,连接是自动连接,不能确定端口,比如使用指定的光纤端口或者RJ45的…

【Redis】redis基本数据类型详解(String、List、Hash、Set、ZSet)

目录 RedisString(字符串)List(列表)Hash(字典)Set(集合)ZSet(有序集合) Redis Redis有5种基本的数据结构,分别为:string(字符串)、list(列表)、set(集合)、hash(哈希&a…

Fiddler抓取手机https包的步骤

做接口测试时,有时我们需要使用fiddler进行抓包分析,那么如何抓取https包。主要分为以下七步: 1.设置fiddler选项:Tools->Options,按如下图勾选 2.下载并安装Fiddler证书生成器 下载地址:http://www.telerik.com/…

python使用mitmproxy和mitmdump抓包在电脑上抓包(二)

在我的上篇文章中,主要记录如何安装mitmproxy和抓取https流量。参考链接: python使用mitmproxy和mitmdump抓包在电脑上抓包-CSDN博客 本篇主要使用python配合mitmdump来抓包和处理返回包,更加灵活,这也是mitmproxy(mitmdump)的最…

熔断、限流、降级 —— SpringCloud Alibaba Sentinel

Sentinel 简介 Sentinel 是阿里中间件团队开源的,面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性 Sentinel 提供了两个服务组件…

opencv实现目标跟踪及视频转存

创建跟踪器 def createTypeTracker(trackerType): 读取视频第一帧,选择跟踪的目标 读第一帧。 ok, frame video.read() 选择边界框 bbox cv2.selectROI(frame, False) 初始化跟踪器 tracker_type ‘MIL’ tracker createTypeTracker(tracker_type) 用第一…

手机电脑数码小程序商城的作用是什么

手机几乎是每个成年人人手一个以上,市场非常大,加之产品更新迭代速度快,每年都会推出多个型号、造型等,因此对高收入群体或爱机人群来说,新手机往往一年或二年时间就会换,或者直接购买当备用机等。 每个城…

Acwing 143. 最大异或对

Acwing 143. 最大异或对 题目描述思路讲解代码展示 题目描述 思路讲解 这道题的启示是&#xff1a;字典树不单单可以高效存储和查找字符串集合,还可以存储二进制数字 思路:将每个数以二进制方式存入字典树,找的时候从最高位去找有无该位的异. 代码展示 #include<iostream…

华为云云耀云服务器L实例评测 | 实例场景体验之搭建个人博客:通过华为云云耀云服务器构建个人博客

华为云云耀云服务器L实例评测 &#xff5c; 实例场景体验之搭建个人博客&#xff1a;通过华为云云耀云服务器构建个人博客 介绍华为云云耀云服务器 华为云云耀云服务器 &#xff08;目前已经全新升级为 华为云云耀云服务器L实例&#xff09; 华为云云耀云服务器是什么华为云云耀…

【调度算法】进程调度算法、内存页面置换算法、LRU算法、LFU算法、磁盘调度算法等重点知识汇总

目录 进程调度算法 内存页面置换算法 LRU算法实现 LFU算法实现 磁盘调度算法 进程调度算法 当 CPU 空闲时&#xff0c;操作系统就选择内存中的某个「就绪状态」的进程&#xff0c;并给其分配 CPU。 什么时候会发生 CPU 调度呢&#xff1f;通常有以下情况&#xff1a; 当…

CSS详细基础(五)选择器的优先级

本节介绍选择器优先级&#xff0c;优先级决定了元素最终展示的样式~ 浏览器是通过判断CSS优先级&#xff0c;来决定到底哪些属性值是与元素最为相关的&#xff0c;从而作用到该元素上。CSS选择器的合理组成规则决定了优先级&#xff0c;我们也常常用选择器优先级来合理控制元素…