JDBC操作调用Qracle中过程或函数取得数据

2024-08-30 19:48

本文主要是介绍JDBC操作调用Qracle中过程或函数取得数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    在java中可以通过直接向数据库传输SQL语言字符串的方式来调用数据库中的数据,但这样会有很多缺点,比如说容易被他人从网络注入SQL语句,传输数据量大影响效率之类的。

    所以一般的JAVA程序操作数据库的方式都是通过事先在数据库中用PL/SQL编程建立好我们需要操作的过程或者函数,然后由JAVA程序通过JDBC直接来调用数据库中的过程来达到我们的目的,这样他人就难以从网络悄悄的注入SQL语句来窃取我们数据库的数据了,并且传输的数据量也变小的,优化了效率。

    下面是用JDBC调用数据库中的过程和函数来达到获取和修改数据的目的的一个实例:

1.首先我们用scott用户登录,给它新建一个LOL表,再给表中插入一些数据

--新建一个表
create table lol(heronum number(5),heroname varchar2(10),herotype varchar2(10));

 

     (建立一个序列,来给表中的每一条数据一个连续的编号)

--新建一个序列()
create or replace sequence seq_lol
start with 1   --从0开始
increment by 1  --每次增加1
maxvalue 100  --最大值为100
nocycle      --不循环
nocache      --没有缓存(语句执行失败时不会增加)

 

 

 

--给表中插入数据
insert into lol values(seq_lol.nextval,'盖伦','肉盾');
insert into lol values(seq_lol.nextval,'赵信','近战');
insert into lol values(seq_lol.nextval,'易','近战');
insert into lol values(seq_lol.nextval,'提莫','射手');
insert into lol values(seq_lol.nextval,'瑞兹','法师');

2.(修改数据)我们发现表中插入的第一条数据错了,盖伦应该是近战类型的,这里定义一个过程来通过输入一个heroname来修改这条数据的herotype.

--通过输入一个英雄的名字,来修改他的类型
create or replace procedure pro_updateTypeByName(v_heroname varchar2,v_herotype varchar2) isbeginupdate lol set herotype=v_herotype where heroname=v_heroname;
end;

3.通过JDBC来调用数据库中的过程,修改名字为盖伦的英雄的类型.

    (1)首先在JAVA中写一个类用来获得连接数据库的连接对象(此处将这个类的构造方法私有化了,这样让外界只能通过调用它里面的静态方法来获得对象,然后再在这个取得对象的静态方法里作一系列判断,让程序的运行中只存在一个连接对象,这样就节约了程序的资源,优化了数据库与JAVA的连接效率).

/*** 连接数据库,获得数据库连接对象* @author yy**/
public class DBUtil {private static Connection conn;//将构造方法私有化,让这个类只能通过调用下面的静态方法来创建对象private DBUtil(){}public static Connection getconn(){if(conn==null){try {//装载驱动(此处先要在工程处引入外界的JDBC包)Class.forName("oracle.jdbc.driver.OracleDriver");String url = "jdbc:oracle:thin:@172.19.238.127:1521:ORCL";//获得数据库连接conn = DriverManager.getConnection(url, "scott", "scott");return conn;} catch (Exception e) {e.printStackTrace();}return null;}return conn;}
}

     (2).定义一个操作类,类中创建一个用来执行数据库中过程的方法.

public class EXEChw {/*** 通过名字修改类型* @param name 要修改英雄的名字* @param newtype 要修改成的类型*/public void setTypeByName(String name,String newtype){try{//获得数据库连接对象Connection conn = DBUtil.getconn();//定义调用过程的SQL语句(此处的?是一个占位符,在编译了SQL语句之后再给它赋值,这样可以防止全能等式的BUG)String sql = "{call pro_updateTypeByName(?,?)}";//获得编译对象CallableStatement cstm = conn.prepareCall(sql);//给?赋值cstm.setString(1, name);cstm.setString(2, newtype);//执行过程cstm.execute();}catch(Exception e){e.printStackTrace();}}
}

     (3).通过调用方法来执行数据库中的过程,修改数据库中的内容,将盖伦的类型改为近战

EXEChw eh = new EXEChw();
eh.setTypeByName("盖伦", "近战");

     (4).在数据库中查看lol表,看以上操作是否改变了盖伦的类型

SQL> select * from lol;HERONUM HERONAME   HEROTYPE
------- ---------- ----------1 盖伦       近战2 赵信       近战3 易         近战4 提莫       射手5 瑞兹       法师SQL> 

 3.(取得数据)我们要通过输入一个英雄的编号,取得这个英雄的所有信息

    (1).在数据库中创建这个过程.

--通过输入一个英雄的编号,来获得这个英雄的所有信息
create or replace procedure pro_getAllByNum(v_heronum in number,v_heroname out varchar2,v_herotype out varchar2) isbeginselect heroname,herotype into v_heroname,v_herotype from lol where heronum=v_heronum;
end;

    (2).在EXChw类中创建一个方法来通过JDBC调用这个过程,获得该编号英雄的名字和类型输出.

 

	/*** 通过编号来获得名字和类型* @param num 依据的编号*/public void getNameTypeByNum(int num){try{//获得数据库连接对象Connection conn = DBUtil.getconn();//定义调用过程的SQL语句(此处的?是一个占位符,在编译了SQL语句之后再给它赋值,这样可以防止全能等式的BUG)String sql = "{call pro_getAllByNum(?,?,?)}";//获得编译对象CallableStatement cstm = conn.prepareCall(sql);//给第一个?赋值cstm.setInt(1, num);//给第二三个?注册输出的参数cstm.registerOutParameter(2, java.sql.Types.VARCHAR);cstm.registerOutParameter(3, java.sql.Types.VARCHAR);//执行过程cstm.execute();//获得输出的参数的值String name = cstm.getString(2);String type = cstm.getString(3);//输出System.out.println("名字:"+name+",类型:"+type);}catch(Exception e){e.printStackTrace();}}

     (3).JAVA中的输出为

名字:易,类型:近战

 4.显示lol表中的所有数据(游标的使用)

太晚了,明天写  ≡ ‘(*>﹏<*)′ ~

 

这篇关于JDBC操作调用Qracle中过程或函数取得数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1121764

相关文章

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

作业提交过程之HDFSMapReduce

作业提交全过程详解 (1)作业提交 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。 第2步:Client向RM申请一个作业id。 第3步:RM给Client返回该job资源的提交路径和作业id。 第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。 第5步:Client提交完资源后,向RM申请运行MrAp

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi