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

相关文章

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

oracle 11g导入\导出(expdp impdp)之导入过程

《oracle11g导入导出(expdpimpdp)之导入过程》导出需使用SEC.DMP格式,无分号;建立expdir目录(E:/exp)并确保存在;导入在cmd下执行,需sys用户权限;若需修... 目录准备文件导入(impdp)1、建立directory2、导入语句 3、更改密码总结上一个环节,我们讲了

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本