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

相关文章

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

SpringBoot整合liteflow的详细过程

《SpringBoot整合liteflow的详细过程》:本文主要介绍SpringBoot整合liteflow的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...  liteflow 是什么? 能做什么?总之一句话:能帮你规范写代码逻辑 ,编排并解耦业务逻辑,代码

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

MySQL中的InnoDB单表访问过程

《MySQL中的InnoDB单表访问过程》:本文主要介绍MySQL中的InnoDB单表访问过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、访问类型【1】const【2】ref【3】ref_or_null【4】range【5】index【6】

MySQL 中 ROW_NUMBER() 函数最佳实践

《MySQL中ROW_NUMBER()函数最佳实践》MySQL中ROW_NUMBER()函数,作为窗口函数为每行分配唯一连续序号,区别于RANK()和DENSE_RANK(),特别适合分页、去重... 目录mysql 中 ROW_NUMBER() 函数详解一、基础语法二、核心特点三、典型应用场景1. 数据分

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机