第七节 JDBC Statements, PreparedStatement和CallableStatement语句

当获得了与数据库的连接后,就可以与数据库进行交互了。 JDBC StatementCallableStatementPreparedStatement接口定义了可用于发送SQL或PL/SQL命令,并从数据库接收数据的方法和属性。

它们还定义了有助于在Java和SQL数据类型的数据类型差异转换的方法。
下表提供了每个接口定义,以及使用这些接口的目的的总结。

接口推荐使用
Statement用于对数据库进行通用访问,在运行时使用静态SQL语句时很有用。 Statement接口不能接受参数。
PreparedStatement当计划要多次使用SQL语句时使用。PreparedStatement接口在运行时接受输入参数。
CallableStatement当想要访问数据库存储过程时使用。CallableStatement接口也可以接受运行时输入参数。

1. Statement对象

1.1. 创建Statement对象

在使用Statement对象执行SQL语句之前,需要使用Connection对象的createStatement()方法创建一个Statement对象,如以下示例所示:

Statement stmt = null;
try {stmt = conn.createStatement( );. . .
}
catch (SQLException e) {. . .
}
finally {. . .
}

Java

在创建Statement对象后,可以使用它来执行一个SQL语句,它有三个执行方法可以执行。它们分别是 -

  • boolean execute (String SQL) : 如果可以检索到ResultSet对象,则返回一个布尔值true; 否则返回false。使用此方法执行SQLDDL语句或需要使用真正的动态SQL,可使用于执行创建数据库,创建表的SQL语句等等。
  • int executeUpdate (String SQL): 返回受SQL语句执行影响的行数。使用此方法执行预期会影响多行的SQL语句,例如:INSERTUPDATEDELETE语句。
  • ResultSet executeQuery(String SQL):返回一个ResultSet对象。 当您希望获得结果集时,请使用此方法,就像使用SELECT语句一样。

1.2. 关闭Statement对象

就像关闭一个Connection对象一样,以保存数据库资源一样,由于同样的原因,还应该关闭Statement对象。

一个简单的调用close()方法将执行该作业(工作)。 如果先关闭Connection对象,它也会关闭Statement对象。 但是,应该始终显式关闭Statement对象,以确保正确的清理顺序。

Statement stmt = null;
try {stmt = conn.createStatement( );. . .
}
catch (SQLException e) {. . .
}
finally {stmt.close();
}

Java

为了更好的理解,建议学习Statment示例教程 。

2. PreparedStatement对象

PreparedStatement接口扩展了Statement接口,它添加了比Statement对象更好一些优点的功能。

此语句可以动态地提供/接受参数。

2.1 创建PreparedStatement对象

PreparedStatement pstmt = null;
try {String SQL = "Update Employees SET age = ? WHERE id = ?";pstmt = conn.prepareStatement(SQL);. . .
}
catch (SQLException e) {. . .
}
finally {. . .
}

Java

JDBC中的所有参数都由 ? 符号作为占位符,这被称为参数标记。 在执行SQL语句之前,必须为每个参数(占位符)提供值。

setXXX()方法将值绑定到参数,其中XXX表示要绑定到输入参数的值的Java数据类型。 如果忘记提供绑定值,则将会抛出一个SQLException

每个参数标记是它其顺序位置引用。第一个标记表示位置1,下一个位置2等等。 该方法与Java数组索引不同(它不从0开始)。

所有Statement对象与数据库交互的方法(a)execute(),(b)executeQuery()和(c)executeUpdate()也可以用于PreparedStatement对象。 但是,这些方法被修改为可以使用输入参数的SQL语句。

2.2. 关闭PreparedStatement对象

就像关闭Statement对象一样,由于同样的原因(节省数据库系统资源),也应该关闭PreparedStatement对象。

简单的调用close()方法将执行关闭。 如果先关闭Connection对象,它也会关闭PreparedStatement对象。 但是,应该始终显式关闭PreparedStatement对象,以确保以正确顺序清理资源。

PreparedStatement pstmt = null;
try {String SQL = "Update Employees SET age = ? WHERE id = ?";pstmt = conn.prepareStatement(SQL);. . .
}
catch (SQLException e) {. . .
}
finally {pstmt.close();
}

Java

为了更好的理解,建议学习PreparedStatement示例代码 。

3. CallableStatement对象

类似Connection对象创建StatementPreparedStatement对象一样,它还可以使用同样的方式创建CallableStatement对象,该对象将用于执行对数据库存储过程的调用。

3.1. 创建CallableStatement对象

假设需要执行以下Oracle存储过程 -

CREATE OR REPLACE PROCEDURE getEmpName (EMP_ID IN NUMBER, EMP_FIRST OUT VARCHAR) AS
BEGINSELECT first INTO EMP_FIRSTFROM EmployeesWHERE ID = EMP_ID;
END;

SQL

注意:上面的存储过程是针对Oracle编写的,但是如果您使用MySQL数据库,可使用以下方式来编写MySQL相同的存储过程,如下在EMP数据库中创建它 -

DELIMITER $$DROP PROCEDURE IF EXISTS `EMP`.`getEmpName` $$
CREATE PROCEDURE `EMP`.`getEmpName` (IN EMP_ID INT, OUT EMP_FIRST VARCHAR(255))
BEGINSELECT first INTO EMP_FIRSTFROM EmployeesWHERE ID = EMP_ID;
END $$DELIMITER ;

SQL

存在三种类型的参数:INOUTINOUTPreparedStatement对象只使用IN参数。CallableStatement对象可以使用上面三个参数类型。

以下是上面三种类型参数的定义 -

参数描述
IN创建SQL语句时其参数值是未知的。 使用setXXX()方法将值绑定到IN参数。
OUT由SQL语句返回的参数值。可以使用getXXX()方法从OUT参数中检索值。
INOUT提供输入和输出值的参数。使用setXXX()方法绑定变量并使用getXXX()方法检索值。

以下代码片段显示了如何使用Connection.prepareCall()方法根据上述存储过程来实例化一个CallableStatement对象 -

CallableStatement cstmt = null;
try {String strSQL = "{call getEmpName (?, ?)}";cstmt = conn.prepareCall (SQL);. . .
}
catch (SQLException e) {. . .
}
finally {. . .
}

Java

String变量strSQL表示存储过程,带有两个参数占位符。

使用CallableStatement对象就像使用PreparedStatement对象一样。 在执行语句之前,必须将值绑定到所有参数,否则将抛出一个SQLException异常。

如果有IN参数,只需遵循适用于PreparedStatement对象的相同规则和技术; 使用与绑定的Java数据类型相对应的setXXX()方法。

使用OUTINOUT参数时,必须使用一个额外的CallableStatement对象方法registerOutParameter()registerOutParameter()方法将JDBC数据类型绑定到存储过程并返回预期数据类型。

当调用存储过程,可以使用适当的getXXX()方法从OUT参数中检索该值。 此方法将检索到的SQL类型的值转换为对应的Java数据类型。

关闭CallableStatement对象

就像关闭其他Statement对象一样,由于同样的原因(节省数据库系统资源),还应该关闭CallableStatement对象。

简单的调用close()方法将执行关闭CallableStatement对象。 如果先关闭Connection对象,它也会关闭CallableStatement对象。 但是,应该始终显式关闭CallableStatement对象,以确保按正确顺序的清理资源。

CallableStatement cstmt = null;
try {String SQL = "{call getEmpName (?, ?)}";cstmt = conn.prepareCall (SQL);. . .
}
catch (SQLException e) {. . .
}
finally {cstmt.close();
}

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

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

相关文章

SSRF漏洞原理及其修复方式和加固方式

SSRF(Server Side Request Forgery)服务器端请求伪造漏洞是一种安全漏洞,攻击者利用该漏洞可以发起任意的网络请求,并可能访问内部系统资源。 SSRF漏洞的原理是,服务器端应用程序未对从用户输入中获取的URL进行充分验…

Flink 物理执行图

文章目录 物理执行图一、Task二、ResultPartition三、ResultSubpartition四、InputGate五、InputChannel 物理执行图 JobManager根据ExecutionGraph对作业进行调度,并在各个TaskManager上部署任务。这些任务在TaskManager上的实际执行过程就形成了物理执行图。物理…

Linux环境下使用线程方式操作UART读写功能

目录 概述 1 Linux环境下UART设备 2 轮询方式操作UART功能实现 2.1 打开串口函数:usr_serial_open 2.2 关闭串口函数: usr_serial_close 2.3 发送数据函数: usr_serial_sendbytes 2.4 接收数据函数: thread_uart_readbytes …

问题解决 | vscode无法连接服务器而ssh和sftp可以

解决步骤 进入家目录删除.vscode-server rm -rf .vscode-server 然后再次用vscode连接服务器时,会重新安装,这时可能报出一些缺少依赖的错 需要联系管理员安装相关依赖,比如 sudo apt-get install libstdc6 至此问题解决

Go语言框架路由Controller控制器设计思路gin路由根据控制器目录分层生成路由地址

Controller设计好处 框架设计用controller分请求路由层级,应用从app目录开始对应请求url路由地址,这样设计师方便开发时候通过请求地址层级快速定位接口方法对应的代码位置。 例如api接口请求路径为:​​http://localhost:8110/​​busines…

部署 LVS(nginx)+keepalived高可用负载均衡集群

目录 一、集群的概述 1、什么是集群 2、普通集群与负载均衡集群 2.1 普通集群(Regular Cluster) 2.2 负载均衡集群(Load Balancing Cluster) 2.3 高可用集群(High Availability Cluster) 2.4 区别 …

【LeetCode 算法专题突破】---二分查找(⭐⭐⭐)

前言 我在算法题目的海洋中畅游已久,也曾在算法竞赛中荣获佳绩。然而,我发现自己对于算法的学习,还缺乏一个系统性的总结和归类。尽管我已经涉猎过不少算法类型,但心中仍旧觉得有所欠缺,未能形成完整的算法体系。 因…

服务器又被挖矿记录

写在前面 23年11月的时候我写过一篇记录服务器被挖矿的情况,点我查看。当时是在桌面看到了bash进程CPU占用异常发现了服务器被挖矿。 而过了几个月没想到又被攻击,这次比上次攻击手段要更高明点,在这记录下吧。 发现过程 服务器用的是4090…

贪心算法(greedy algorithm,又称贪婪算法)详解(附例题)

目录 基本思想一)概念二)找出全局最优解的要求三)求解时应考虑的问题四)基本步骤五)贪心策略选择六)实际应用 1.零钱找回问题2.背包问题3.哈夫曼编码4.单源路径中的Djikstra算法5.最小生成树Prim算法 基本…

TCP包头

TCP包头: 1.序号:发送端发送数据包的编号 2.确认号:已经确认接收到的数据的编号(只有当ACK为1时,确认号才有用) TCP为什么安全可靠: 1.在通信前建立三次握手连接 SYN SYNACK ACK SYN是TCP包头的一个字段 tcp.port 端口号 抓包数据 2.在通信过程中通过序…

使用Apache Kafka的Golang实践指南

您是否在寻找构建可扩展、高性能应用程序的方法,这些应用程序可以实时处理流数据?如果是的话,结合使用Apache Kafka和Golang是一个很好的选择。Golang的轻量级线程非常适合编写类似Kafka生产者和消费者的并发网络应用程序。它的内置并发原语&…

探索HTTP协议:网络通信的基石

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

微信小程序重新加载页面 刷新页面

重新加载页面 使用wx.reLanuch(),url: 路径当前页面跳转, 页面所有数据重新初始化,已配置的数据不会保存 wx.reLaunch({url: /pages/orders/createOrder/createOrder, // 当前页面的路径}) reLanuch()的方法,会有一个…

【CSP试题回顾】202109-2-非零段划分

CSP-202109-2-非零段划分 关键点:差分数组 详见:【CSP考点回顾】差分数组 时间复杂度分析 使用差分数组的优势在于,它将问题转化为了在一次遍历中识别并利用关键变化点(波峰和波谷),从而避免了对每个可能…

Mysql中的MVCC

”真正学会,如你般自由~“ MVCC机制简介 MVCC(Multi-Version-Concurrency-Control)多版本并发控制,MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问;在编程中实现事务内存。 取自 MVCC存在被…

某准网招聘接口逆向之WebPack扣取

​​​​​逆向网址 aHR0cHM6Ly93d3cua2Fuemh1bi5jb20v 逆向链接 aHR0cHM6Ly93d3cua2Fuemh1bi5jb20vc2VhcmNoP3BhZ2VOdW09MSZxdWVyeT1weXRob24mdHlwZT01 逆向接口 aHR0cHM6Ly93d3cua2Fuemh1bi5jb20vYXBpX3RvL3NlYXJjaC9qb2IuanNvbg 逆向过程 请求方式:GET 参数构成…

目标检测:Anchor-Based Anchor-Free算法模型

Anchor-Based 目标检测: Anchor Boxes:Anchor-based 方法使用事先定义的一组锚框(Anchor Boxes)来作为候选框。这些锚框具有不同的尺度(大小)和长宽比(aspect ratio)。模型会预测每个…

Clickhouse表引擎介绍

作者:俊达 1 引擎分类 ClickHouse表引擎一共分为四个系列,分别是Log、MergeTree、Integration、Special。其中包含了两种特殊的表引擎Replicated、Distributed,功能上与其他表引擎正交,根据场景组合使用。 2 Log系列 Log系列…

k8s-生产级的k8s高可用(1) 24

高可用集群 实验至少需要三个master(控制节点),一个可以使外部可以访问到master的load balancer(负载均衡)以及一个或多个外部节点worker(也要部署高可用)。 再克隆三台主机 清理并重启 配置两…

LayerNorm的图是不是画错了

这是网上一张很流行的说明几个 Normalization 区别的图 这图出自Kaiming的文章 Group Norm 但是他这个 Layer Norm 的图是不是画错了? 我大四写毕设的时候就想问🤣🤣🤣 这都几年过去了 我觉得图应该是这样画的,相同颜色的区域…