在JAVA中实现数据库存储过程的统一调用

Java中通过jdbc调用oracle存储过程 Java调用Oracle存储过程步骤主要分为三类: (1)编写Oracle存储过程 (2)编写数据库获取连接工具类 (3)编写简单应用调用存储过程 1、Oracle中的存储过程程序 1.在Oracle SQL Developer中创建存储过程 在scott数据库用户中新建一个存储过程(查询某个员工姓名 月薪和职位): create or replace procedure query... 阅读详情

在业务处理过程中,总是要不停的访问数据库,如果仅仅利用SQL语句来实现数据的读取或更新插入,有时候往往导致业务处理层和数据层的逻辑结构过于复杂,接口太多难于管理.幸运的是,数据库的存储过程为我们保持接口的简洁和逻辑的清晰提供了很好的实现方式.通过存储过程,可以把复杂的操作都封装起来,提供的接口来实现复杂的功能.

但随着业务逻辑的进一步复杂,可能存储过程也很快膨胀起来,如果每调用一次存储过程都要重复建立数据库连接、传递参数、处理返回结果、释放连接等操作 ,无疑也会大大增加重复内容,不易对接口进行统一的管理。但如果统一起来,创建连接很好处理都一样的,但因传递的参数不同、返回结果不同,处理起来就比较麻烦了。

经过研究发现,可以把创建数据库连接、传递参数(用可变Object数组,具体类型在内部转换)、释放连接这几步抽象出来,把处理返回结果再根据不同的接口具体处理。

首先定义一个调用返回结果类,包括数据连接、一个结果集、一个字符串结果(常用的整型、字符串、日期型都可以自动转化成字符串型,在具体处理返回结果时可以再次进行转换,这样保证返回结果的简洁,只有两种类型便于处理):

package com.gftech.dp.bean;

import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.log4j.Logger;

import com.gftech.util.GFConn;
import com.gftech.util.GFString;

public class PLSQLResult {
    
private String srs;// 调用PLSQL后返回的整形结果

    
private ResultSet rs;// 返回的结果集

    
private GFConn gfconn;// 数据库连接

    
static Logger logger = Logger.getLogger(PLSQLResult.class);

    
public GFConn getGfconn() {
        
return gfconn;
    }


    
public void setGfconn(GFConn gfconn) {
        
this.gfconn = gfconn;
    }

 

    
public String getSrs() {
        
return srs;
    }


    
public void setSrs(String srs) {
        
this.srs = srs;
    }


    
public ResultSet getRs() {
        
return rs;
    }


    
public void setRs(ResultSet rs) {
        
this.rs = rs;
    }


    
public void close() {
        
if (rs != null)
            
try {
                rs.close();
            }
 catch (SQLException e) {
                logger.error(e);
            }

        
if (gfconn != null)
            gfconn.close();

    }

    
    
public int srs2int(){
        
if(srs!=null && GFString.isNumeric(srs)){
            
return GFString.cint(srs);
        }

        
        
return 0;
    }

    
    
public boolean srs2bool(){
        
if("1".equals(srs))
            
return true;
        
return false;
    }

}

 

抽象出创立连接、传递参数等共性的东西

 

/**
     * 调用PLSQL存储过程,返回调用结果,处理完毕后要记得调用close()关闭结果集和连接
     * 
@param gfdb 数据库
     * 
@param plsqlName 存储过程名称
     * 
@param oracleType 数据库类型,特指调用返回结果的类型
     * 
@param isIntegerNull 整形参数为0时是否按NULL指针传递
     * 
@param params 存储过程的参数列表
     * 
@return
     
*/

    
public static PLSQLResult callPLSQL(GFDB gfdb, String plsqlName, int oracleType, boolean isIntegerNull,
            Object... params) 
{
        PLSQLResult prs 
= null;
        ResultSet rs 
= null;
        String allName 
= null;
        GFConn gfconn 
= null;
        Connection conn 
= null;
        String srs 
= null;
        String cName 
= null;

        
long start = System.currentTimeMillis();
        PropertyConfigurator.configure(ConfParam.LOG4J_PROP_CONF);
        
if (gfdb != null && plsqlName != null && params != null) {
            allName 
= "{?=call " + plsqlName + "(";
            
for (int i = 0; i < params.length; i++) {
                
if (i == params.length - 1)
                    allName 
+= "?";
                
else
                    allName 
+= "?,";

            }

            allName 
+= ")}";

            
if (gfdb == null)
                
return null;

            
for (int i = 0; i < 3; i++) {
                gfconn 
= gfdb.getConn();
                
if (gfconn == null) {
                    
if (i == 2)
                        MonReport.errorReport(DPMain.conf.err_server_host, DPMain.conf.err_server_port, 
false,
                                
"DH-无法取得数据库连接");
                    
else
                        logger.error(
"DH-无法取得数据库连接");
                    
continue;
                }

                conn 
= gfconn.getConn();
                
if (conn != null) {
                    
try {
                        CallableStatement proc 
= conn.prepareCall(allName);
                        proc.registerOutParameter(
1, oracleType);

                        
for (int j = 0; j < params.length; j++) {
                            cName 
= GFCommon.getClassName(params[j]);

                            
if ("String".equals(cName)) {
                                proc.setString(j 
+ 2, (String) params[j]);
                                logger.debug(
"plsql_param_string:" + params[j]);
                            }
 else if ("Integer".equals(cName)) {
                                
if (isIntegerNull && ((Integer) params[j]).intValue() <= 0) {
                                    proc.setNull(j 
+ 2, Types.INTEGER);
                                    logger.debug(
"plsql_param_int:null");
                                }
 else {
                                    proc.setInt(j 
+ 2, ((Integer) params[j]).intValue());
                                    logger.debug(
"plsql_param_int:" + params[j]);
                                }


                            }
 else if ("Long".equals(cName)) {
                                proc.setLong(j 
+ 2, ((Long) params[j]).longValue());
                                logger.debug(
"plsql_param_long:" + params[j]);
                            }
 else if ("Double".equals(cName)) {
                                proc.setDouble(j 
+ 2, ((Double) params[j]).doubleValue());
                                logger.debug(
"plsql_param_double:" + params[j]);
                            }
 else if ("Float".equals(cName)) {
                                proc.setFloat(j 
+ 2, ((Float) params[j]).floatValue());
                                logger.debug(
"plsql_param_float:" + params[j]);
                            }
 else if (cName != null && cName.indexOf("Calendar") != -1) {
                                proc.setTimestamp(j 
+ 2, GFDate.cal2timestamp((Calendar) params[j]));
                                logger.debug(
"plsql_param_date:"
                                        
+ GFDate.cdate((Calendar) params[j], "yyyy-mm-dd hh24:mi:ss"));
                            }
 else {
                                proc.setString(j 
+ 2, null);
                                logger.debug(
"plsql_param_null:" + params[j]);

                            }


                        }

                        proc.executeUpdate();
                        
switch (oracleType) {
                        
case OracleTypes.CURSOR:
                            rs 
= (ResultSet) proc.getObject(1);
                            
break;
                        
case OracleTypes.INTEGER:
                        
case OracleTypes.VARCHAR:
                        
case OracleTypes.DATE:
                            srs 
= proc.getString(1);
                            
break;

                        }

                        prs 
= new PLSQLResult();
                        prs.setGfconn(gfconn);
                        prs.setSrs(srs);
                        prs.setRs(rs);
                        proc.close();

                    }
 catch (SQLException e) {
                        gfconn.close();
                        String err 
= "调用存储过程" + plsqlName + "时出错";
                        logger.error(err, e);
                        gfdb.catchException(e);
                        
continue;
                    }

                }
 else {
                    logger.error(
"can't get connection");
                    MonReport.errorReport(DPMain.conf.err_server_host, DPMain.conf.err_server_port, 
true, "无法取得数据库连接");
                }


                
break;
            }

        }


        DPMain.stat.addDbTime(System.currentTimeMillis() 
- start);
        DPMain.stat.addDbCount();
        
return prs;
    }

这样一来,我们在调用PLSQL时,就简单多了,测试用例如下:

 

/**
     * 判断是否是虚拟ID号
     * 
     * 
@param id
     * 
@return
     
*/

    
private boolean isVirtualID(String id) {
        
boolean result = false;
        String plsqlName 
= "pkg_deal_comm.f_is_virtual";

        GFDB gfdb 
= DPMain.getDB(3);
        
if(gfdb!=null){ 
            PLSQLResult pr 
= DPCommon.callPLSQL(gfdb, plsqlName, OracleTypes.INTEGER, false,id);
            
if (pr != null) {
                result
=pr.srs2bool();
                pr.close();
            }

        }

         

        
return result ;
    }


private void readSendList() {
        
final String plsqlName = "pkg_tenancy_comm.f_read_buffer";
        
// final String plsqlName = "pkg_tenancy_comm.f_temp";
        ResultSet rs = null;
        SmpSubmitPack sp 
= null;
        GFDB gfdb 
= DPMain.getDB(1);
        
if (gfdb != null) {
            PLSQLResult pr 
= DPCommon.callPLSQL(gfdb, plsqlName, OracleTypes.CURSOR, false);
            
if (pr != null) {
                rs 
= pr.getRs();
                
if (rs == null)
                    
return;
                
try {
                    
while (rs.next()) {
                        
boolean isFree = false;
                        
int biztype = BizType.GENERAL;
                        sp 
= new SmpSubmitPack();
                        sp.setSrcAddr(rs.getString(
1));
                        sp.addDestAddr(rs.getString(
2));
                        sp.setContent(rs.getString(
3));
                        FeeInfo fee 
= new FeeInfo();
                        fee.setFeeType((
byte) GFString.cint(rs.getString(5)));
                        
if (fee.getFeeType() != FeeType.FREE) {
                            biztype 
= BizType.VIRTUAL_TALK;
                            sp.setBizCode(rs.getString(
4));
                            fee.setFeeValue(rs.getInt(
6));
                            isFree 
= true;
                        }

                        sp.setFeeInfo(fee);
                        sp.setLinkID(rs.getString(
7));
                        sp.setMsgStamp(rs.getString(
8));
                        DPCommon.putSendBuffer(biztype, 
1, sp, isFree);

                    }

                }
 catch (SQLException e) {
                    logger.error(e);
                }


                pr.close();
            }

        }


    }

这样一来,大大降低了重复性的工作,并且有利代码的一致性,便于代码的维护。

说明:上述所示只是为主要的代码示例,可能包含其它需要依赖的类库才能直接运行。

 

Java 调用MySQL存储过程 (1)相关API:java.sql.CallableStatement 使用到java.sql.CallableStatement接口,该接口专门用来调用存储过程,该对象的获得依赖于java.sql.Connection,通过Connection实例的prepareCall()方法返回CallableStatement对象, prepareCall()内部为一固定写法{call 存储过程名(参 阅读详情

相关推荐

Java 开发中 Hibernate 的存储过程调用

本文旨在为Java开发者提供全面的Hibernate存储过程调用指南,涵盖从基础概念到高级应用的所有方面。我们将探讨Hibernate 5.x及更高版本中存储过程调用的最佳实践,包括传统XML配置和现代注解方式。文章首先介绍核心概念,然后深入技术实现细节,接着通过实际案例展示应用场景,最后讨论工具资源和未来趋势。每个部分都包含详细的代码示例和理论分析。Hibernate:Java生态中最流行的ORM框架之一,提供对象-关系映射功能存储过程:预编译的SQL语句集合,存储在数据库中,可通过名称调用。

AI开发架构师 673

通过java反射实现统一入口调用不同service的方法

1.入口controller如下: interfaceClassName:代表类名,即需要调用哪个类 methodName:方法名,即需要调用的interfaceClassName类中的方法 clientId、password业务参数,根据自己需求来确定要不要 reqData:业务参数,所有业务数据封装在里面,根据自己具体需求来写 package com.example.invoketest.controller; import com.alibaba.fastjson.JSONObject; i

weixin_38972910的博客 4417

Java调用数据库存储过程[mysql测试通过]

Java调用数据库存储过程[mysql测试通过]

Java中调用数据库存储过程

本文介绍了Java通过JDBC调用数据库存储过程的方法。存储过程是预编译的SQL语句集,具有性能高、网络流量少、安全性好和可复用性强等优点。文章详细讲解了Java调用存储过程的9个基本步骤,包括获取连接、创建CallableStatement对象、参数设置与获取等,并提供了4种典型示例:无参数存储过程调用、IN参数传递、OUT参数获取以及INOUT参数处理。通过具体代码展示了如何执行查询型存储过程、处理输入输出参数等常见场景,为开发者实现数据库业务逻辑提供实用参考。

shangjg3的博客 1678

Java实现调用MySQL存储过程详解

相信大家都知道存储过程是在大型数据库系统中,一组为了完成特定功能的SQL语句集。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。Java调用mysql存储过程,实现如下,有需要的朋友们可以参考借鉴,下面来一起看看吧。

【操作系统】实验楼操作系统实验三——系统调用

操作系统实验3——系统调用 环境配置 ​ 首先同样是配置环境 cd /home/shiyanlou/oslab tar -zxvf hit-oslab-linux-20110823.tar.gz -C /home/shiyanlou 实验步骤 添加函数声明 cd ~/oslab/linux-0.11/include/linux gedit sys.h //添加内容: extern int sys_whoami(); extern int sys_iam(); fn_ptr_sys_call_table

qq_46612803的博客 6357

Java调用存储过程

原文:http://www.onjava.com/pub/a/onjava/2003/08/13/stored_procedures.html by Nic Ferrier      本文阐述了怎么使用DBMS存储过程。我阐述了使用存储过程的基本的和高级特性,比如返回ResultSet。本文假设你对DBMS和JDBC已经非常熟悉,也假设你能够毫无障碍地阅读其它语言写成的代码(即不是Java的语言)

My urban life 3195

LlamaIndex 入门实战

LlamaIndex是一个“数据框架”,用于帮助构建LLM应用程序。它提供了各种工具,包括数据连接器,用于摄取现有数据源和数据格式(API,PDF,文档,SQL等),以及用于将数据结构化(索引,图形)以便与LLM轻松使用的方式。此外,LlamaIndex还提供了高级的检索/查询接口,可以输入任何LLM输入提示,并返回检索到的上下文和增强知识的输出。它还允许与外部应用程序框架(如LangChain,Flask,Docker,ChatGPT等)轻松集成。

AIGC搞起 1万+

解决多条SQL使用同一会话SqlSession问题

如果遇到特殊的业务场景,并不需要事务的回滚以及其他特性,只需要保持同一会话,那我们可以使用SqlSessionFactory来创建SqlSession会话。我们都知道事务可以保持方法内的同一会话,所以我们可以使用。@Transactional事务注解保持同一会话。

m0_70208993的博客 466

ARM芯片内部的高速公路:手把手教你用AMBA Designer配置NIC-400互连控制器

本文详细介绍了如何使用AMBA Designer工具配置ARM芯片中的NIC-400互连控制器,涵盖从基础拓扑构建到高级QoS设置的完整流程。通过实际案例演示,帮助开发者掌握AXI协议下的高效片上网络设计,提升SoC性能与能效比。

weixin_26750481的博客 310

智驾系统分层架构:从传感器到执行器的全链路解析

本文深入解析了智能驾驶系统的分层架构,从传感器数据采集融合、应用层决策到车辆管理层执行,完整呈现了从感知到控制的全链路工作流程。文章重点阐述了架构设计的核心优势在于接口标准化与模块解耦,以ACC和LKA协同场景为例,说明了各层级如何通过清晰分工与高效协作,实现复杂系统的可靠、灵活与易于升级。

weixin_29219189的博客 399

java Jdbc调用存储过程

作者:hellboys ,摘自【ChinaJavaWorld.com技术论坛】 » 『 JDBC/JDO/Hibernate 』  Java调用存储过程本文阐述了怎么使用DBMS存储过程。我阐述了使用存储过程的基本的和高级特性,比如返回ResultSet。本文假设你对DBMS和JDBC已经非常熟悉,也假设你能够毫无障碍地阅读其它语言写成的代码(即不是Java的语言),但是,并不要求你有任何

stevene的专栏 1万+

Ubuntu Rtx3090 Cuda11.7 安装 pytorch3d

pytorch ubuntu pytorch3d 安装

G果的博客 2273

Java调用DB的存储过程

2015/12/7 使用数据库存储过程的java代码:   try {            con = (Connection) DBProxy.getConnection(null);            cStm = con.prepareCall("{call web_show_proc("+("sp".equalsIgnoreCase(showPara[0])?"true":"fals

乐在克里特的博客 491

RT-DETR改进策略【卷积层】| CVPR2025 GBConv轻量门控瓶颈卷积 低秩瓶颈降参 + 门控聚焦形态,强效捕捉纤细目标

裂缝形态不规则、纹理纤细,传统卷积参数大、计算冗余,且无法动态聚焦裂缝形态;背景噪声强易干扰特征提取,需要轻量且能自适应聚焦裂缝形态的卷积单元,因此提出轻量门控瓶颈卷积 GBC。

Limiiiing的博客 140

手把手教你学GPU的KMD专栏--2.4 GPU固件加载与初始化流程

GPU固件(Firmware)是嵌入在GPU芯片ROM或EEPROM中的低级代码,是GPU启动时首先执行的程序。它负责GPU硬件的基础初始化和基本功能配置,是GPU与操作系统之间的"第一道桥梁"。与操作系统驱动不同,固件在CPU启动后、操作系统加载前就已执行,是硬件层面的"启动代码"。关键认知:GPU固件是GPU的"BIOS",没有它,GPU硬件无法进入可操作状态。就像CPU需要BIOS来初始化内存和外设一样,GPU需要固件来初始化其核心组件。

MHD0815的博客 111

在Java中如何调用数据库的存储过程,无参,有参

package cn.hncu.jdbc; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; import org.junit.Test; import cn...

小琼 4630

7、刚度矩阵与弹簧元素:有限元分析的核心

本文深入探讨了有限元分析中的核心概念——刚度矩阵与弹簧元素。详细介绍了刚度矩阵的定义、构建方法及其对称性、正定性和稀疏性等性质,同时解析了弹簧和阻尼器元素的特性及其在模拟复杂系统中的应用,如液压缸、减震器等。通过结合刚度矩阵与弹簧元素,可以提高结构模型的精度并模拟复杂的工程系统。文章还讨论了优化策略、验证流程、误差分析及实际应用案例,展示了这些技术在桥梁分析、汽车悬挂系统等领域的重要作用,并展望了其在未来新材料、智能结构和数字孪生技术中的发展潜力。

nice1的博客 234

Java 调用 Oracle 的存储过程

文章目录一、环境准备二、Oracle连接测试三、Java 调用存储过程四、Java 调用存储函数 一、环境准备 需要的 jar 包:ojdbc14.jar,ojdbc6.jar 对应的 pom 配置: <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</mave

南淮北安的博客 2449

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Java调用MySQL存储过程的终极指南

你是否曾经在Java项目中需要调用MySQL存储过程?是否觉得这个过程有些复杂?不用担心,我将带你一步步了解如何在Java中轻松调用MySQL存储过程。通过本文,你将掌握如何设置连接、编写代码以及处理结果集,让你的项目更加高效和稳定。让我们一起探索吧!

Q2024107的博客 812

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

JAVA调用数据库存储过程

下面将举出JAVA对ORACLE数据库存储过程的调用          ConnUtils连接工具类:用来获取连接、释放资源 复制代码 package com.ljq.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet;

JAVA之迷 1953

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

java调用sql server存储过程_Java调用SQL Server存储过程

1、调用普通存储过程(1)创建存储过程CREATE Procedure [dbo].[GetContactListByName] /*根据联系人姓名获取联系人信息*/@Name nvarchar(50)Asbeginselect Contact.Id,Contact.Name,Phone,Email,QQ,GroupName from Contact,ContactGroupwhere Cont...

weixin_42499681的博客 2024
上一篇: 在文本文件当中实现按列读取
下一篇: 重拾ICTCLAS,继续学习
sinboy
博客等级 码龄25年 239粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值