《Java SQL 操作指南:深入理解 Statement 用法与优化》

在 Java 数据库编程中,Statement 是用于执行 SQL 语句的接口,允许程序与数据库进行交互。本文将详细介绍 Statement 的基本概念、常见用法以及 PreparedStatementCallableStatement 等相关接口。

1. Statement 基本介绍

Statement 接口继承了 AutoCloseableWrapper 接口,使其具备自动关闭和封装功能。

  • AutoCloseable:提供 close() 方法,确保 Statement 在不再使用时释放资源。

  • Wrapper:提供 isWrapperFor(Class<?>)unwrap(Class<T>) 方法,允许 Statement 作为其他数据库 API 的封装。

        此外,Statement 还包含多个重要属性,如 cursorNamepoolableconnection 等。

Statement 是 JDBC 提供的用于执行 SQL 语句的接口,主要特点如下:

  1. 适用于执行静态 SQL 语句,每次执行都需要编译。

  2. 通过 executeQuery() 执行查询语句,返回 ResultSet

  3. 通过 executeUpdate() 执行更新语句,返回影响的行数。

  4. 存在 SQL 注入风险,建议使用 PreparedStatement 代替。

2. Statement 的基本用法

package JDBC;import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;
import java.util.Scanner;//JDBC注入机制演示public class Statement_ {public static void main(String[] args) throws Exception {//        Class.forName("com.mysql.jdbc.Driver");Scanner scanner = new Scanner(System.in);System.out.println("Enter SQL nameusr statement");String username =scanner.nextLine();System.out.println("Enter SQL pwd statement");String pwd =scanner.nextLine();Properties properties = new Properties();properties.load(new FileInputStream("src\\JDBC\\mysql.properties"));String url = (String) properties.get("url");String user =(String) properties.get("user");String password =(String) properties.get("password");String driver =(String) properties.get("driver");
//        实例化Class.forName(driver);Connection connection = DriverManager.getConnection(url, user, password);//        得到statementStatement statement = connection.createStatement();//        组织查询语句String sql = "select * from sql_injection where NAME='"+username+"'and  pwd = '"+pwd+"';" ;System.out.printf(sql+"\n");ResultSet resultSet = statement.executeQuery(sql);if (resultSet.next()) {System.out.println("查询成功");}else {System.out.println("查询失败");}//        关闭连接,安全操作resultSet.close();statement.close();connection.close();}
}

 2.1 主要方法

  • execute(String sql): 执行 SQL 语句,返回 boolean,如果执行的是查询语句,返回 true,否则返回 false

  • executeQuery(String sql): 仅用于 SELECT 语句,返回 ResultSet

  • executeUpdate(String sql): 仅用于 INSERTUPDATEDELETE 语句,返回受影响的行数。

  • addBatch(String sql): 添加 SQL 语句到批处理命令中。

  • executeBatch(): 执行批处理命令,返回每条 SQL 语句影响的行数。

  • clearBatch(): 清除已添加的批处理命令。

  • setQueryTimeout(int seconds): 设置查询超时时间。

  • getMoreResults(): 检查是否存在多个 ResultSet

  • close(): 关闭 Statement,释放资源。

2.2 执行更新操作

可以使用 executeUpdate() 进行 INSERTUPDATEDELETE 操作,例如:

Statement stmt = conn.createStatement();
int rowsAffected = stmt.executeUpdate("UPDATE users SET age = 30 WHERE id = 1");
System.out.println("更新影响的行数: " + rowsAffected);

3. Statement 的问题与优化

3.1 SQL 注入风险

使用 Statement 直接拼接 SQL 语句可能会导致 SQL 注入攻击,例如:

USE mydatabase;
SHOW DATABASES;SHOW TABLES;
CREATE TABLE sql_injection  ( -- 管理表NAME VARCHAR(32) NOT NULL UNIQUE,pwd VARCHAR(32) NOT NULL DEFAULT ''
)CHARACTER SET utf8;DROP TABLE sql_injection;
DESC sql_injection;INSERT INTO sql_injection VALUES( 'wangya' ,'1314520'
);SELECT * FROM sql_injection;SELECT *  FROM  sql_injectionWHERE NAME='wangya' AND pwd='1314520';-- sql 注入演示
-- 用户输入密码为: 1' or
-- 输入密码为:or '1'= '1
SELECT *  FROM  sql_injectionWHERE NAME='1' OR' or AND pwd='OR '1'= '1';SELECT *  FROM  sql_injectionWHERE NAME='wangya' OR pwd='1314520'  OR '1'='1' ;

以上代码可能被攻击者利用,绕过密码验证。

总结

Statement 是 Java 数据库操作的基本接口,但由于其存在 SQL 注入风险,在实际开发中推荐使用 PreparedStatement。此外,CallableStatement 适用于调用存储过程,提高数据库访问效率。了解并正确使用这些接口,可以提升数据库操作的安全性和性能。

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

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

相关文章

FFMPEG录制远程监控摄像头MP4

手绘效果图 上图是录制功能的HTML前端页面&#xff0c;录制功能和解码视频放在一起。录制功能关键是录制(开始录制按钮)、停止录像按钮。当点击“录制”的时候则会开始录制MP4文件, 当点击停止的时候就会停止录制MP4。经过录制后&#xff0c;则会生成MP4,并放到我的RV1126的/tm…

数据类型及sizeof,进制转换

其实数据类型可以讲很多内容&#xff0c;这里看情况需要讲多久吧。 本篇基本都是理论。 目录 数据类型的分类 基本数据类型 构造数据类型 指针类型 空类型 计算数据类型或变量所占用的内存字节数 基本语法 进制转换 二进制 二进制的概念 二进制与十进制的转换 十六进…

网络安全之tcpdump工具

引言 wireshark是一款非常不错的抓包软件&#xff0c;在图形化界面占绝对统治地位&#xff1b;尽管其在字符界面下有些许选项可供使用&#xff0c;但终究不太方便&#xff0c;下面我再介绍一款NB的终端抓包工具 tcpdump 1、混杂模式 linux的网卡有混杂模式一说&#xff0c;当开…

建筑管理(2): 施工承包模式,工程监理,质量监督

文章目录 一. 施工承包模式1. 施工总承包模式1.1 施工总承包的特点1.2 施工总承包模式中的承包方 2. 平行承包模式3. 联合体与合作体承包模式 二. 工程监理1. 强制实行监理的工程范围1.1 国家重点建设工程1.2 大中型公用事业工程(重点)1.3 成片开发建设的住宅小区工程1.4 必须实…

[LeetCode热门100题]|137,260,268,面试17.19

1、137 只出现一次数字|| 1、题目描述 137 只出现一次数字||https://leetcode.cn/problems/single-number-ii/description/ 给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你…

MySQL中有哪几种锁?

大家好&#xff0c;我是锋哥。今天分享关于【MySQL中有哪几种锁&#xff1f;】面试题。希望对大家有帮助&#xff1b; MySQL中有哪几种锁&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在MySQL中&#xff0c;锁是用来控制并发访问的机制&#xff0c;确…

外贸企业可以申请网络专线吗?

在对外业务不断扩大的情况下&#xff0c;外贸企业对网络的需求愈发迫切。稳定、快速的网络连接不仅是企业开展国际业务的基础&#xff0c;更是提升竞争力的关键。外贸企业是否可以申请网络专线&#xff1f;如何选择适合的外贸网络专线服务&#xff1f;本文将为您详细解答。 网络…

python笔记2

变量&#xff1a;含义 一个容器&#xff0c;计算机当中的存储空间。 可以理解为一个用于标识或引用数据的名字或标签。 作用&#xff1a; 可以通过定义一个变量来给需要使用多次的数据命名&#xff0c;就像一个标签一样。下次需要使用这个数据时&#xff0c;只需要通过这个变…

【算法】动态规划

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;Linux 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 持续更新中...1、常规动态规划Fibonacci数列杨辉三角最小花费爬楼梯孩子们的游戏 2、背包问题3、最长公共子序列4、最长递增子序列…

ECU BootLoader开发——Flash编程

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 简单&#xff0c;单纯&#xff0c;喜欢独处&#xff0c;独来独往&#xff0c;不易合同频过着接地气的生活…

NetLink内核套接字案例分析

一、基础知识 Netlink 是 Linux 系统中一种内核与用户空间通信的高效机制&#xff0c;而 Netlink 消息是这种通信的核心载体。它允许用户态程序&#xff08;如网络配置工具、监控工具&#xff09;与内核子系统&#xff08;如网络协议栈、设备驱动&#xff09;交换数据&#xff…

Linux 配置静态 IP

一、简介 在 Linux CentOS 系统中默认动态分配 IP 地址&#xff0c;每次启动虚拟机服务都是不一样的 IP&#xff0c;因此要配置静态 IP 地址避免每次都发生变化&#xff0c;下面将介绍配置静态 IP 的详细步骤。 首先先理解一下动态 IP 和静态 IP 的概念&#xff1a; 动态 IP…

开源:LMDB 操作工具:lmcmd

目录 什么是 LMDB为什么编写 lmcmd安装方法如何使用 连接数据库命令列表 小结 1. 什么是 LMDB LMDB&#xff08;Lightning Memory-Mapped Database&#xff09;是一种高效的键值存储数据库&#xff0c;基于内存映射&#xff08;memory-mapping&#xff09;技术&#xff0c;提供…

进程管理:前后台切换

前后台切换 [rootxxx ~]# yum install -y xclock #安装xclock&#xff08;这里是用来解释前后台&#xff09; [rootxxx ~]# xclock -update 1 #前台运行&#xff08;如果把1改成2&#xff0c;就是秒针两秒走动一次&#xff09; [rootxxx ~]# xclock -update 1…

【CF】Day6——Codeforces Round 942 (Div. 2) BC + Codeforces Round 941 (Div. 2) C

B. Coin Games 题目&#xff1a; 思路&#xff1a; 虽然标签是博弈论&#xff0c;但我感觉更像一个找规律的思维题 由于题目告诉我们每次只能选U&#xff0c;那我们不妨来考虑选U会造成什么情况&#xff08;以下都为选中间U&#xff09; ①.UUU -3*U 此时选了U会导致两侧…

视频推拉流EasyDSS案例分析:互联网直播/点播技术与平台创新应用

随着互联网技术的快速发展&#xff0c;直播/点播平台已成为信息传播和娱乐的重要载体。特别是在电视购物领域&#xff0c;互联网直播/点播平台与技术的应用&#xff0c;不仅为用户带来了全新的购物体验&#xff0c;也为商家提供了更广阔的营销渠道。传统媒体再一次切实感受到了…

鸿蒙初级考试备忘

Module类型 Module按照使用场景可以分为两种类型&#xff1a; Ability类型的Module&#xff1a; 用于实现应用的功能和特性。每一个Ability类型的Module编译后&#xff0c;会生成一个以.hap为后缀的文件&#xff0c;我们称其为HAP&#xff08;Harmony Ability Package&#x…

【QT】文件系统相关 -- QFile

一、Qt 文件概述 &#x1f525; 文件操作是应用程序必不可少的部分。Qt 作为⼀个通用开发库&#xff0c;提供了跨平台的文件操作能力。Qt 提供了很多关于⽂件的类&#xff0c;通过这些类能够对文件系统进行操作&#xff0c;如文件读写、文件信息获取、文件制或重命名等 二、输…

EasyCVR安防视频汇聚平台助力工业园区构建“感、存、知、用”一体化智能监管体系

在现代工业园区的安全管理和高效运营中&#xff0c;视频监控系统扮演着不可或缺的角色。然而&#xff0c;随着园区规模的扩大和业务的复杂化&#xff0c;传统的视频监控系统面临着诸多挑战&#xff0c;如设备众多难以统一管理、数据存储分散、智能分析能力不足、信息利用率低下…

鸿蒙路由 HMrouter 配置及使用一

1、学习链接 HMRouter地址 https://gitee.com/hadss/hmrouter/blob/dev/HMRouterLibrary/README.md 2、工程配置 下载安装 ohpm install hadss/hmrouter 添加编译插件配置 在工程目录下的build-profile.json5中&#xff0c;配置useNormalizedOHMUrl属性为true (我这项目创…