JDBC 之 Statement 对象

数据库系列- JDBC 的三种 Statement 是什么?它们有什么区别? 参数化的 SQL 语句可以让数据库区分哪些是数据,哪些是命令,从而避免被恶意篡改。上面的代码创建了一个 PreparedStatement 对象,然后调用了 setString 方法,为第一个参数赋值为 “Tom”,然后调用了 executeQuery 方法,执行预编译的 SQL 语句,返回了一个 ResultSet 对象。上面的代码创建了一个 Statement 对象,然后调用了 executeQuery 方法,传入了一个 SQL 查询语句,返回了一个 ResultSet 对象,表示查询结果集。 阅读详情

       Statement 对象用于将 SQL 语句发送到数据库中。实际上有三种 Statement 对象,它们都作为在给定连接上执行 SQL 语句的包容器:Statement、PreparedStatement(它从 Statement 继承而来)和CallableStatement(它从 PreparedStatement 继承而来)。它们都专用于发送特定类型的 SQL 语句: Statement 对象用于执行不带参数的简单 SQL 语句;PreparedStatement 对象用于执行带或不带 IN 参数的预编译 SQL 语句;CallableStatement 对象用于执行对数据库已存储过程的调用。
        Statement 接口提供了执行语句和获取结果的基本方法。PreparedStatement 接口添加了处理 IN 参数的方法;而 CallableStatement 添加了处理 OUT 参数的方法。

1、创建 Statement 对象
       建立了到特定数据库的连接之后,就可用该连接发送 SQL 语句。Statement 对象用 Connection 的方法 createStatement 创建,如下列代码段中所示:
       Connection con = DriverManager.getConnection(url, "sunny", "");
       Statement stmt = con.createStatement();
为了执行 Statement 对象,被发送到数据库的 SQL 语句将被作为参数提供给 Statement 的方法:
       ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table2");

2、使用 Statement 对象执行语句
        Statement 接口提供了三种执行 SQL 语句的方法:executeQuery、executeUpdate 和 execute。使用哪一个方法由 SQL 语句所产生的内容决定。
        方法 executeQuery 用于产生单个结果集的语句,例如 SELECT 语句。 
        方法 executeUpdate 用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。
        方法 execute 用于执行返回多个结果集、多个更新计数或二者组合的语句。
        执行语句的所有方法都将关闭所调用的 Statement 对象的当前打开结果集(如果存在)。这意味着在重新执行 Statement 对象之前,需要完成对当前 ResultSet 对象的处理。
        应注意,继承了 Statement 接口中所有方法的 PreparedStatement 接口都有自己的 executeQuery、executeUpdate 和 execute 方法。Statement 对象本身不包含 SQL 语句,因而必须给 Statement.execute 方法提供 SQL 语句作为参数。PreparedStatement 对象并不将 SQL 语句作为参数提供给这些方法,因为它们已经包含预编译 SQL 语句。CallableStatement 对象继承这些方法的 PreparedStatement 形式。对于这些方法的 PreparedStatement 或 CallableStatement 版本,使用查询参数将抛出 SQLException。

3、语句完成
        当连接处于自动提交模式时,其中所执行的语句在完成时将自动提交或还原。语句在已执行且所有结果返回时,即认为已完成。对于返回一个结果集的 executeQuery 方法,在检索完 ResultSet 对象的所有行时该语句完成。对于方法 executeUpdate,当它执行时语句即完成。但在少数调用方法 execute 的情况中,在检索所有结果集或它生成的更新计数之后语句才完成。
        有些 DBMS 将已存储过程中的每条语句视为独立的语句;而另外一些则将整个过程视为一个复合语句。在启用自动提交时,这种差别就变得非常重要,因为它影响什么时候调用 commit 方法。在前一种情况中,每条语句单独提交;在后一种情况中,所有语句同时提交。

4、关闭 Statement 对象
        Statement 对象将由 Java 垃圾收集程序自动关闭。而作为一种好的编程风格,应在不需要 Statement 对象时显式地关闭它们。这将立即释放 DBMS 资源,有助于避免潜在的内存问题。

5、Statement 对象中的 SQL 转义语法
        Statement 可包含使用 SQL 转义语法的 SQL 语句。转义语法告诉驱动程序其中的代码应该以不同方式处理。驱动程序将扫描任何转义语法,并将它转换成特定数据库可理解的代码。这使得转义语法与 DBMS 无关,并允许程序员使用在没有转义语法时不可用的功能。
转义子句由花括号和关键字界定:
        {keyword . . . parameters . . . }
该关键字指示转义子句的类型,如下所示:
        escape 表示 LIKE 转义字符
        字符“%”和“_”类似于 SQL LIKE 子句中的通配符(“%”匹配零个或多个字符,而“_”则匹配一个字符)。为了正确解释它们,应在其前面加上反斜杠(“/”),它是字符串中的特殊转义字符。在查询末尾包括如下语法即可指定用作转义字符的字符:
        {escape 'escape-character'}
例如,下列查询使用反斜杠字符作为转义字符,查找以下划线开头的标识符名:
        stmt.executeQuery("SELECT name FROM Identifiers
        WHERE Id LIKE `/_%' {escape `/'};
        fn 表示标量函数
       几乎所有 DBMS 都具有标量值的数值、字符串、时间、日期、系统和转换函数。要使用这些函数,可使用如下转义语法:关键字 fn 后跟所需的函数名及其参数。例如,下列代码调用函数 concat 将两个参数连接在一起:
        {fn concat("Hot", "Java")};
        可用下列语法获得当前数据库用户名: {fn user()}; 
        标量函数可能由语法稍有不同的 DBMS 支持,而它们可能不被所有驱动程序支持。各种 DatabaseMetaData 方法将列出所支持的函数。例如,方法 getNumericFunctions 返回用逗号分隔的数值函数列表,而方法 getStringFunctions 将返回字符串函数,等等。
        驱动程序将转义函数调用映射为相应的语法,或直接实现该函数。
        d、t 和 ts 表示日期和时间文字
        DBMS 用于日期、时间和时间标记文字的语法各不相同。JDBC 使用转义子句支持这些文字的语法的 ISO 标准格式。驱动程序必须将转义子句转换成 DBMS 表示。
例如,可用下列语法在 JDBC SQL 语句中指定日期:
         {d `yyyy-mm-dd'}
在该语法中,yyyy 为年代,mm 为月份,而 dd 则为日期。驱动程序将用等价的特定于 DBMS 的表示替换这个转义子句。例如,如果 '28- FEB-99' 符合基本数据库的格式,则驱动程序将用它替换 {d 1999-02-28}。
         对于 TIME 和 TIMESTAMP 也有类似的转义子句:
         {t `hh:mm:ss'}
         {ts `yyyy-mm-dd hh:mm:ss.f . . .'}
TIMESTAMP 中的小数点后的秒(.f . . .)部分可忽略。
         call 或 ? = call 表示已存储过程
         如果数据库支持已存储过程,则可从 JDBC 中调用它们,语法为:
         {call procedure_name[(?, ?, . . .)]}
         或(其中过程返回结果参数):
         {? = call procedure_name[(?, ?, . . .)]}
方括号指示其中的内容是可选的。它们不是语法的必要部分。输入参数可以为文字或参数。可通过调用方法DatabaseMetaData.supportsStoredProcedures 检查数据库是否支持已存储过程。
        oj 表示外部连接
外部连接的语法为 :{oj outer-join}
其中 outer-join 形式为
        table LEFT OUTER JOIN {table / outer-join} ON search-condition
        外部连接属于高级功能。有关它们的解释可参见 SQL 语法。JDBC 提供了三种 DatabaseMetaData 方法用于确定驱动程序支持哪些外部连接类型:supportsOuterJoins、supportsFullOuterJoins 和 supportsLimitedOuterJoins。
       方法 Statement.setEscapeProcessing 可打开或关闭转义处理;缺省状态为打开。当性能极为重要时,程序员可能想关闭它以减少处理时间。但通常它将出于打开状态。应注意: setEscapeProcessing 不适用于 PreparedStatement 对象,因为在调用该语句前它就可能已被发送到数据库。有关预编译的信息,参见 PreparedStatement。

6、使用方法 execute
        execute 方法应该仅在语句能返回多个 ResultSet 对象、多个更新计数或 ResultSet 对象与更新计数的组合时使用。当执行某个已存储过程或动态执行未知 SQL 字符串(即应用程序程序员在编译时未知)时,有可能出现多个结果的情况,尽管这种情况很少见。例如,用户可能执行一个已存储过程(使用 CallableStatement 对象),并且该已存储过程可执行更新,然后执行选择,再进行更新,再进行选择,等等。通常使用已存储过程的人应知道它所返回的内容。
       因为方法 execute 处理非常规情况,所以获取其结果需要一些特殊处理并不足为怪。例如,假定已知某个过程返回两个结果集,则在使用方法 execute 执行该过程后,必须调用方法 getResultSet 获得第一个结果集,然后调用适当的 getXXX 方法获取其中的值。要获得第二个结果集,需要先调用 getMoreResults 方法,然后再调用 getResultSet 方法。如果已知某个过程返回两个更新计数,则首先调用方法 getUpdateCount,然后调用 getMoreResults,并再次调用 getUpdateCount。
        对于不知道返回内容,则情况更为复杂。如果结果是 ResultSet 对象,则方法 execute 返回 true;如果结果是 Java int,则返回 false。如果返回 int,则意味着结果是更新计数或执行的语句是 DDL 命令。在调用方法 execute 之后要做的第一件事情是调用 getResultSet 或 getUpdateCount。调用方法 getResultSet 可以获得两个或多个 ResultSet 对象中第一个对象;或调用方法 getUpdateCount 可以获得两个或多个更新计数中第一个更新计数的内容。
        当 SQL 语句的结果不是结果集时,则方法 getResultSet 将返回 null。这可能意味着结果是一个更新计数或没有其它结果。在这种情况下,判断 null 真正含义的唯一方法是调用方法 getUpdateCount,它将返回一个整数。这个整数为调用语句所影响的行数;如果为 -1 则表示结果是结果集或没有结果。如果方法 getResultSet 已返回 null(表示结果不是 ResultSet 对象),则返回值 -1 表示没有其它结果。也就是说,当下列条件为真时表示没有结果(或没有其它结果):
        ((stmt.getResultSet() == null) && (stmt.getUpdateCount() == -1))
        如果已经调用方法 getResultSet 并处理了它返回的 ResultSet 对象,则有必要调用方法 getMoreResults 以确定是否有其它结果集或更新计数。如果 getMoreResults 返回 true,则需要再次调用 getResultSet 来检索下一个结果集。如上所述,如果 getResultSet 返回 null,则需要调用 getUpdateCount 来检查 null 是表示结果为更新计数还是表示没有其它结果。
        当 getMoreResults 返回 false 时,它表示该 SQL 语句返回一个更新计数或没有其它结果。因此需要调用方法 getUpdateCount 来检查它是哪一种情况。在这种情况下,当下列条件为真时表示没有其它结果:
        ((stmt.getMoreResults() == false) && (stmt.getUpdateCount() == -1))
下面的代码演示了一种方法用来确认已访问调用方法 execute 所产生的全部结果集和更新计数:
        stmt.execute(queryStringWithUnknownResults);
        while (true)
       {
            int rowCount = stmt.getUpdateCount();
            if (rowCount > 0)
             { // 它是更新计数
                 System.out.println("Rows changed = " + count);
                 stmt.getMoreResults();
                 continue;
             }
             if (rowCount == 0)
             { // DDL 命令或 0 个更新
             System.out.println(" No rows changed or statement was DDL command");
             stmt.getMoreResults(); 
             continue;
             }
             // 执行到这里,证明有一个结果集
             // 或没有其它结果
       }
       ResultSet rs = stmt.getResultSet; 
       if (rs != null)
       {
          . . . // 使用元数据获得关于结果集列的信息
          while ( rs )
             break; // 没有其它结果 

11、JDBC 中 Statement 对象的使用与操作指南 本文详细介绍了JDBC中三种常用的Statement对象:Statement、PreparedStatement和CallableStatement的使用方法和特点。通过具体代码示例,展示了它们在执行静态SQL查询、动态SQL查询以及调用存储过程方面的应用。文章还对三种对象进行了对比,并提供了在实际开发中选择合适对象的建议,帮助开发者提高数据库操作的效率和安全性。 阅读详情

相关推荐

中文实体关系抽取数据集大盘点:从百度Duie2.0到医疗CBLUE,哪个更适合你的NLP项目?

本文全面分析了中文实体关系抽取领域的主流数据集,包括百度DuIE 2.0、医疗CBLUE等,帮助开发者根据项目需求选择最适合的数据集。文章详细对比了各数据集的特点、适用场景及优化策略,为自然语言处理项目提供实用指南。

weixin_29284657的博客 121

JDBC系列教程(三)---语句

Statement 本概述是从《JDBCTM Database Access from JavaTM: A Tutorial and Annotated Reference 》这本书中摘引来的。JavaSoft 目前正在准备这本书。这是一本教程,同时也是 JDBC 的重要参考手册,它将作为 Java 系列的组成部份在 1997 年春季由 Addison-Wesley 出版公司出版。 4.1 概述

键者天行 2万+

KEGG数据库与KAAS工具:基因功能注释的实用指南

本文提供了使用KEGG数据库与KAAS工具进行基因功能注释的完整实用指南。详细阐述了如何从准备基因或蛋白序列开始,通过KAAS服务器获取KEGG Orthology(KO)编号,并解读注释结果。文章进一步介绍了如何利用KOBAS工具进行通路富集分析,将定性观察转化为定量洞察,并分享了提高注释准确率、处理大数据集及使用API等避坑技巧与高阶方法,为基因组学、转录组学研究者奠定坚实的数据分析基础。

weixin_29292535的博客 390

数据库 Statement(陈述说明)

创建JDBC应用程序的步骤 *(重要) 1. 载入JDBC驱动程序(数据库厂商提供) 2. 定义连接URL 3. 建立连接 4. 创建Statement对象(相当于一个执行器,向DBMS发出陈述说名,执行sql)5. 执行查询或更新 6. 结果处理 7. 关闭连接 下面是Statement的方法说明 public interface Statement Statement 对象用于执行一条静态的 SQL 语句并获取它产生的结果。 任何时侯每条语句仅能打开一个 ResultSet 。因此,如果对

顺其自然~专栏 6394

三维重建之条纹投影结构光(三)——相高模型标定

接上面两文: 三维重建之条纹投影结构光(一)https://blog.youkuaiyun.com/beyond951/article/details/123361852?spm=1001.2014.3001.5501三维重建之条纹投影结构光(二)——四步相移+三频外差法https://blog.youkuaiyun.com/beyond951/article/details/123769596?spm=1001.2014.3001.5501接下来对相高模型进行标定,其推导过程如下图所示 ...

beyond951的博客 4876

5个企业级SOC平台横向对比:IBM QRadar vs Splunk vs 奇安信NGSOC

本文深度对比了IBM QRadar、Splunk和奇安信NGSOC等五大企业级SOC平台的核心能力,从架构设计、威胁检测、运营效率、成本模型和行业适配度五个维度进行解析。文章特别强调安全运营中心(SOC)在现代企业中的关键作用,并提供了实战数据和优化建议,帮助企业选择最适合自身需求的SOC解决方案。

a1b2c的博客 663

Statement详解

对于一个给定的Statement对象,在execute()、executeQuery()、executeUpdate()、executeBatch()或clearParameters()方法调用之前,如果占位符已经使用setXXX()方法设置值,应用程序不可以再次调用setXXX()方法修改已经设置的值。可以将参数指定为序数参数或命名参数,必须为IN或INOUT参数的每个参数占位符设置一个值,必须为OUT或INOUT参数中的每个参数占位符调用registerOutParameter()方法。

BMZDT的博客 1780

硬件工程师八大细分岗位详解:从芯片到整机的技术分工与职业选择

硬件工程作为电子系统设计的核心领域,涉及从芯片级到整机级的完整技术链条。其基本原理是通过电路设计、信号处理和功率管理等技术,将电子元件集成为功能完备的硬件系统。随着产品复杂度提升,硬件工程师岗位出现高度专业化分工,这种细分不仅提升了技术深度,更优化了团队协作效率。在工程实践中,信号完整性和电源完整性成为高速数字设计的两个关键技术挑战,直接影响系统稳定性。本文基于行业热词"硬件工程师"和"信号完整性",深入解析八大细分岗位的技术差异,帮助从业者明确职业发展方向,构建系统化的硬件设计思维。

weixin_33811539的博客 450

JDBC中的statement对象

JDBC中的statement对象用于向数据库发送SQL语句,想要完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可 Statement对象的executeUpdate方法,用于向数据库发送增删改的SQL语句,executeUpdate执行完成后,会返回一个整数(即增删改语句导致了数据库几行数据发生了变化) statement.executeQuery方法用于向数据库发送查询语句,executeQuery方法返回代表查询结果的ResultSet对象 CRUD操作-insert 使.

TvTToT的博客 1205

结构函数分析与 JESD51-14 标准详解

结构函数(Structure Function)是将器件瞬态热响应曲线(冷却曲线)通过数学变换,转换为热阻(Rth)与热容(Cth)沿热流路径一维分布的图形化分析方法。它能“看到”热量从结(Junction)到壳(Case)或环境的过程中,经过每一层结构时的热学特性。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 57

QT C++ AI棉花智能变量灌溉工上位机(信创完整版)

北斗履带灌溉机器人/田间分区电磁阀基站 → 多层土壤温湿度/盐分EC传感器实时采集墒情 → 双目AI视觉扫描棉田长势、病苗分布 → AI融合**生育期+土壤墒情+盐分+棉株长势**计算变量灌溉定额、水肥配比、灌溉时长 → 分区电磁阀/变频水泵变量供水,病弱苗地块减量、干旱地块增量;墒情、盐分、长势多因子闭环修正灌水量;多层土壤含水率(0–10/20–40/40–80cm)、土壤EC盐分、土壤温度、空气温湿度、蒸发量、北斗地块坐标、管道水压、水肥罐液位、分区流量计、水泵电机负载、滴灌带压力反馈。

寒寒豆豆软件公司的博客 187

JDBC的Statement对象

以下内容引用自http://wiki.jikexueyuan.com/project/jdbc/statements.html: 一旦获得了数据库的连接,就可以和数据库进行交互。JDBC的Statement,CallableStatement和PreparedStatement接口定义的方法和属性,可以发送SQL命令或PL/SQL命令到数据库,并从数据库接收数据。 在数据库中,它们还...

angou6476的博客 240

第一节:Vben Admin介绍和初次运行

本文是【实战Vben Admin + Python】的第一节,本文内容主要是介绍Vben Admin框架和我们后端使用的技术,开发环境和工具的准备本节文章的目的是Vben Admin的简单介绍,通过配置可以让项目前端运行起来,由于项目默认开启了mock,展示的都是静态模拟数据,我们在此基础上,下一节将研究分析下Vben Admin的目录。为我们后端搭建准备。

cuiwin的专栏 7416

JDBC中对象的解释和statement对象详解

JDBC中对象的解释和statement对象详解

qq_46423017的博客 479

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【WEEK7】 【DAY4】JDBC—statement对象【中文版】

10.2.1.1.Jdbc中的statement队形用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。10.2.1.2.Statement对象的executeUpdate方法,用于向数据库发送增、删、改的SQL语句,executeUpdate执行结束后,将会返回一个整数(显示这些增删改语句导致了数据库中几行数据发生了变化)

2401_83329143的博客 891

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

第十五节 JDBC Statement对象执行批量处理实例

第十五节 JDBC Statement对象执行批量处理实例

weixin_43860634的博客 1088

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

JDBC(一)——statement对象、PreparedStatement对象

1. 数据库驱动 2. JDBC 3. 第一个JDBC程序 4. statement对象 5. PreparedStatement对象 6. 使用IDEA连接数据库 7. 事务 8. 数据库连接池

吃饭了吗 1031

【JDBC-2】JDBC入门:Statement对象详解

前言 在上一期中我们讲到要想使用JDBC从数据库中提取出数据,主要有六步: 加载驱动 用户信息和URL 得到数据库对象 得到SQL对象 执行SQL对象 释放连接 其中最重要的就是3、4、5步,那么这篇文章就来细细探讨下JDBC连接的第四步:得到SQL对象(Statement) Statement对象详解 jdbc中的Statement对象用于向数据库发送SQL语句,数据库的增删改查通过这个对象来完成(向数据库中发送指令)。 该对象主要有两个方法: statemen...

only-code的博客 1653

JDBC中Statement对象与PreParedStatement

jdbc中statement对象用于向数据库中发送sql语句,想完成对数据库的增删改查,只需要想

数据库 496

JDBC——Statement执行SQL语句的对象

Statement该对象用于执行静态SQL语句并返回它产生的结果。表示所有的参数在生成SQL的时候都是拼接好的,容易产生SQL注入的问题 PreparedStatement对象是一个预编译的SQL语句。动态SQL 功能1.执行SQL 3个方法 ①方法:execute() 可以执行任意的SQL,用的不多了解 修饰/返回值类型:boolean 2.executeUpdate() 执行DML语句 ...

helloworld 815

15-MySQL-JDBC-Statement对象详解

MySQL -> JDBC -> Statement对象详解 Statement对象: JDBC中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可; Statement对象的executeUpdate方法,用于向数据库发送增、删、改的sql语句,executeUpdate执行完后,将会返回一个整数,即增删改语句导致了数据库几行数据发生了改变; Statement对象的executeQuery方法用于向数据库发送查询

baidu_38126306的博客 393

JDBC Statement对象执行批量处理实例

此示例代码是基于前面章节中完成的环境和数据库设置编写的。对象的批处理的典型步骤序列 -执行上面代码如下所示 -以下代码片段提供了使用。编译上面代码,如下 -

unber的博客 533

JDBC-Statement 对象

Statement 对象 一旦我们获得了数据库的连接,我们就可以和数据库进行交互。JDBC 的 Statement,CallableStatement 和 PreparedStatement 接口定义的方法和属性,可以让你发送 SQL 命令或 PL/SQL 命令到数据库,并从你的数据库接收数据。 在数据库中,它们还定义了帮助 Java 和 SQL 数据类型之间转换数据差异的方法。 下表提供了...

weixin_30578677的博客 169
上一篇: JDBC 之 DriverManager 类
下一篇: JDBC 之 ResultSet 对象
topboy8381
博客等级 码龄22年 4粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值