JDBC中的Statement,PreparedStatement和CallableStatement

news2024/11/24 7:37:07

一旦获得连接,我们就可以与数据库进行交互。JDBC Statement、 CallableStatement 和 PreparedStatement 接口定义了方法和属性,这些方法和属性使您能够发送 SQL 命令并从数据库接收数据。

它们还定义了有助于弥合数据库中使用的 Java 和 SQL 数据类型之间的数据类型差异的方法。

下表总结了每个接口的用途,以决定要使用的接口。

Statement 对象

创建 Statement 对象

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

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

一旦创建了Statement对象,就可以使用其三个执行方法之一来执行SQL语句。

  • boolean execute (String SQL):如果可以检索到ResultSet对象,则返回布尔值true;否则返回false。当需要使用真正的动态SQL时,请使用此方法执行SQL DDL语句。

  • int executeUpdate (String SQL):返回受SQL语句执行影响的行数。使用此方法可以执行您希望影响其行数的SQL语句,例如INSERT,UPDATE或DELETE语句。

  • ResultSet executeQuery (String SQL):返回一个ResultSet对象。当您希望获得结果集时,请使用此方法,就像使用SELECT语句一样。

关闭Statement 对象

就像关闭Connection对象以节省数据库资源一样,出于同样的原因,您也应该关闭Statement对象。

一个简单的调用 close()方法就可以了。如果先关闭Connection对象,它也会关闭Statement对象。但是,您应该始终显式关闭Statement对象,以确保正确清理。

PreparedStatement 对象

PreparedStatement接口扩展了Statement接口,它为您提供了附加的功能,与泛型Statement对象相比具有一些优势。

该语句使您可以灵活地动态提供参数。

创建 PreparedStatement 对象

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

JDBC中的所有参数均由?符号表示,该符号称为参数标记。您必须在执行SQL语句之前为每个参数提供值。

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

每个参数标记都由其顺序位置引用。第一个标记代表位置1,第二个代表位置2,依此类推。此方法与Java数组索引的方法不同,后者从0开始。

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

关闭 PreparedStatement 对象

与关闭Statement对象一样,出于相同的原因,也应该关闭PreparedStatement对象。

CallableStatement对象

就像 Connection 对象创建 Statement 和 PreparedStatement 对象一样,它也创建 CallableStatement 对象,该对象将用于执行对数据库存储过程的调用。

创建 CallableStatement 对象

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

CREATE OR REPLACE PROCEDURE getEmpName 
   (EMP_ID IN NUMBER, EMP_FIRST OUT VARCHAR) AS
BEGIN
   SELECT first INTO EMP_FIRST
   FROM Employees
   WHERE ID = EMP_ID;
END;

NOTE: 上面的存储过程已经为Oracle编写,但是我们正在使用MySQL数据库,因此,让我们为MySQL编写相同的存储过程,如下所示,以便在EMP数据库中创建它-

DELIMITER $$

DROP PROCEDURE IF EXISTS `EMP`.`getEmpName` $$
CREATE PROCEDURE `EMP`.`getEmpName` 
   (IN EMP_ID INT, OUT EMP_FIRST VARCHAR(255))
BEGIN
   SELECT first INTO EMP_FIRST
   FROM Employees
   WHERE ID = EMP_ID;
END $$

DELIMITER ;

存在三种类型的参数: IN、 OUT 和 INOUT。PreparedStatement 对象只使用 IN 参数。CallableStatement 对象可以使用所有这三个。

这是每个的定义

范围描述
IN

创建 SQL 语句时值未知的参数。用 setXXX ()方法将值绑定到 IN something。

OUT

其值由返回的SQL语句提供的参数。使用getXXX()方法从参数中检索值。

INOUT

同时提供输入和输出值的参数。可以使用 setXXX ()方法绑定变量,并使用 getXXX ()方法检索值。

下面的代码片段展示了如何使用 Connection.prepareCall() 方法根据前面的存储过程-实例化 CallableStatement 对象

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

字符串变量SQL,表示带有参数占位符的存储过程。

使用CallableStatement对象与使用PreparedStatement对象非常相似。您必须在执行该语句之前将值绑定到所有参数,否则您将收到一个SQLException。

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

使用 OUT 和 INOUT 参数时,必须使用附加的 CallableStatement 方法 registerOutParameter ()。registerOutParameter ()方法将 JDBC 数据类型绑定到预期存储过程返回的数据类型。

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

关闭 CallableStatement 对象

就像关闭其他Statement对象一样,出于同样的原因,您也应该关闭CallableStatement对象。

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

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

相关文章

【阿Q送书第二期】《高并发架构实战:从需求分析到系统设计》

#挑战Open AI!马斯克宣布成立xAI,你怎么看?# 文章目录 你想成为架构师嘛?架构经验高并发高并发架构实战特点值得推荐赠书规则 你想成为架构师嘛? 很多软件工程师的职业规划是成为架构师,但是要成为架构师很…

C语言-ubuntu下的命令

目录 linux命令 【1】打开关闭终端 【2】终端 【3】ls命令 【4】cd 切换路径 【5】新建 【6】删除 【7】复制 【8】移动 【9】常用快捷键 【10】vi编辑器 【11】简单编程步骤 任务: linux命令 【1】打开关闭终端 打开终端: 1. 直接点击 …

【1】Vite+Vue3 登录功能

一、介绍 在当今前端开发的领域里,快速、高效的项目构建工具以及使用最新技术栈是非常关键的。ViteVue3 组合为一体的项目实战示例专栏将带领你深入了解和掌握这一最新的前端开发工具和框架。 作为下一代前端构建工具,Vite 在开发中的启动速度和热重载…

sqlserver 获取根据特定符号分割字符串

CREATE function Get_StrArrayStrOfIndex (str varchar(1024), --要分割的字符串split varchar(10), --分隔符号index int --取第几个元素 ) returns varchar(1024) as begindeclare location intdeclare start intdeclare next intdeclare seed intset strltrim(rtrim(str))…

驾驶证——科目一笔记(三)

知识点1:红路灯 黄灯一直闪: 三个框的黄灯——信号暂时解除 一个框的黄灯——危险注意安全 知识点2:通行 看上半部分哪边有三角形 知识点2:禁停 知识点3:导向车道线 有齿可变,无齿导向(按…

详解使用JAVA将Julian date(儒略日)日期转换为年月日

一、什么是Julian date 朱莉安日历和普通日历显示是不一样的我就举例演示一下 正常的日历显示 朱莉安的日历显示 174表示的是从2016年1月1日开始到今天已有174天了 普通日历是按月计数,朱莉安日历是按年计数 二、用java将julian日期转换为年月日 将2023199朱莉安…

微信小程序主体名称迁移流程

前言 因一些业务需求,需更换小程序主体名称 按理说,有两种方法, 第一种:重新注册小程序 第二种:在微信公众平台 → 设置 → 基本信息 → 主体信息 → 小程序迁移 第一种方法操作起来是很简单,但是呢&…

ubuntu 20.04 4090 显卡驱动安装 深度学习环境配置

1. 显卡驱动安装 准备工作: 换源安装输入法:重启的步骤先不管(自选)sudo apt update && sudo apt upgrade 禁用nouveau驱动(这个驱动是ubuntu开源小组逆向破解NVIDIA的开源驱动,与英伟达的原有驱…

关于你欠缺的NoSQL中的redis和mongoDB

文章目录 前言一、在string list hash结构中,每个至少完成5个命令,包含插入 修改 删除 查询,list 和hash还需要增加遍历的操作命令1、STRING类型2、List类型数据的命令操作:3、举例说明list和hash的应用场景,每个至少一…

前端开发报表工具所必须的三大能力

摘要:本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 数据分析一直以来都是业务决策中非常重要的一环,在数字化时代尤其如此。然…

轻松实现文件夹批量重命名!教你如何使用顺序编号批量改名文件夹!

我们需要对大量文件夹进行重命名时,手动一个个改名无疑是一项耗时且繁琐的任务。不过,别担心!我们将向您介绍一种简单而高效的方法来实现文件夹的批量重命名:使用顺序编号。无论是对照片文件夹、音乐文件夹、还是其他文件夹进行改…

cuda 安装教程(win10)

cuda:compute unitifed device architecture-统一计算设备架构。 NVIDIA cuDNN is a GPU-accelerated library of primitives for deep neural networks. 目录 cuda完整安装: 检查显卡安装版本 下载版本 cuda安装步骤 cudnn下载安装(需要登陆账号&…

(2023.07.05-2023.07.15)论文阅读简单记录和汇总

(2023.07.05-2023.07.15)论文阅读简单记录和汇总 2023/07/05:端午回家还没玩几天就被老板召唤回学校了,采购的事情真是太麻烦了,一堆的差错。昨天跟师弟把他的第一篇论文投出去了,祝好运! 2023/07/10:可惜…

基于Java+SpringBoot+vue前后端分离社区团购系统设计实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

【Ceph的部署】

目录 一、基于 ceph-deploy 部署 Ceph 集群1、Ceph 生产环境推荐:2、Ceph 环境规划3、环境准备1、关闭 selinux 与防火墙2、根据规划设置主机名3、配置 hosts 解析4、安装常用软件和依赖包5、在 admin 管理节点配置 ssh 免密登录所有节点6、为每一个服务器配置时间同…

【129. 求根节点到叶节点数字之和

129. 求根节点到叶节点数字之和 原题链接:完成情况:解题思路:参考代码: 原题链接: 129. 求根节点到叶节点数字之和 https://leetcode.cn/problems/sum-root-to-leaf-numbers/ 完成情况: 解题思路&#x…

vue2项目使用?.语法报错如何解决?(@babel/plugin-proposal-optional-chaining)

文章目录 一、问题原因二、下载并配置插件第一步第二步第三步 一、问题原因 因为有些浏览器版本不兼容?.语法,可以使用$$来代替(如下图所示),但是为了团队协作避免麻烦使用?.带来的问题,可以使用这个(babel/plugin-p…

科技资讯|Apple Vision Pro新专利,关于相对惯性测量系统的校正

美国专利商标局正式授予苹果一项 Apple Vision Pro 相关专利,该专利涵盖了具有视觉校正功能的相对惯性测量系统。这样的系统用于弥补头显内的眼前庭不匹配,当 VR 头显中发生的事情与现实世界环境中发生的运动不匹配时,可能会导致恶心。 苹果…

web(三)前端

1.选择器: 1.伪类选择器: 伪选择器支持按照未被包含在文档树中的状态信息来选择元素超链接元素的四种伪类:1.link:表示没有访问过的的链接2.visited:表示访问过的链接3.hover:将鼠标移动至超链接上时超链接的状态4.active:鼠标点击超链接状态…

IDR: Self-Supervised Image Denoising via Iterative Data Refinement

文章目录 IDR: Self-Supervised Image Denoising via Iterative Data Refinement1. noisy-clean pair 比较难获取2. noiser-noisy pair 比较容易获取,但是训练效果呢?2.1 noiser-noisy 训练的模型,能够对 noisy 图像一定程度的降噪2.2 noiser…