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

相关文章

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程

《SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程》LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑,下面给大... 目录一、基础概念1.1 组件(Component)1.2 规则(Rule)1.3 上下文(Conte

使用SpringBoot整合Sharding Sphere实现数据脱敏的示例

《使用SpringBoot整合ShardingSphere实现数据脱敏的示例》ApacheShardingSphere数据脱敏模块,通过SQL拦截与改写实现敏感信息加密存储,解决手动处理繁琐及系统改... 目录痛点一:痛点二:脱敏配置Quick Start——Spring 显示配置:1.引入依赖2.创建脱敏

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Java Multimap实现类与操作的具体示例

《JavaMultimap实现类与操作的具体示例》Multimap出现在Google的Guava库中,它为Java提供了更加灵活的集合操作,:本文主要介绍JavaMultimap实现类与操作的... 目录一、Multimap 概述Multimap 主要特点:二、Multimap 实现类1. ListMult