Java DB中的Java存储过程

1 Java存储过程

这篇文章是关于Java DB中的Java存储过程的。

Java DB是基于Java编程语言和SQL的关系数据库管理系统。 这是Apache软件基金会的开源Derby项目的Oracle版本。 Java SE 7 SDK中包含Java DB。

在数据库内调用的Java代码是一个存储过程(或多个过程)。 Java存储过程是数据库端JDBC(Java数据库连接)例程。

过程代码以Java类方法定义,并存储在数据库中。 这是使用SQL执行的。 该过程代码可以带有或不带有任何与数据库相关的代码。

其他数据库端(或服务器端)程序是触发器和表函数。

1.1 Java过程类型

根据在其中调用存储的事务,存储过程有两种类型:嵌套连接和非嵌套连接。

嵌套连接

这种过程使用与调用它的SQL语句相同的事务。 该过程代码使用与父SQL相同的连接,并使用连接URL语法jdbc:default:connection 。 以下是获得连接的示例代码位:

Connection c = DriverManager.getConnection("jdbc:default:connection");

请注意,此类型不支持连接URL属性。

示例代码位于: 2.1创建

非嵌套连接

这种类型的过程使用新的数据库连接。 该过程是在与调用SQL不同的事务中执行的。

存储过程代码也可以连接到其他数据库。

以下位置的示例代码: 3.1使用非嵌套连接

1.2过程中的SQL异常

过程中的SQL异常可以在过程代码中捕获和处理,或在调用程序中传播(捕获)。

2创建和使用Java存储过程

这描述了在Java DB数据库中创建Java存储过程以及在SQL和Java代码中以交互方式使用它的过程。 使用Java编程语言创建存储过程代码。 该过程是带有签名的public static void procedureMethod方法中的Java代码。 创建存储过程并将其作为数据库对象存储在Java DB数据库中。

使用SQL命令或使用JDBC API从Java程序调用(或调用)该过程。

2.1建立

创建一个Java方法,对其进行编译,然后将该过程存储在数据库中。

2.1.1创建Java方法

以下是示例方法。

public static void testProc(int iParam1, String iParam2, int [] oParam)throws SQLException {String connectionURL = "jdbc:default:connection";Connection conn = DriverManager.getConnection(connectionURL);String DML = "UPDATE TEST_TABLE SET NAME = ? WHERE ID = ?";PreparedStatement pstmnt = conn.prepareStatement(DML);pstmnt.setString(1, iParam2);pstmnt.setInt(2, iParam1);int updateRowcount = pstmnt.executeUpdate();oParam [0] = updateRowcount;
} // testProc()

该代码在Java类(例如JavaStoredProcs.java )中创建并进行编译。 一个类中可以创建任意数量的过程方法。

在示例代码中:

  • 程序方法具有三个参数。 前两个参数(iParam1和iParam2)分别为IN,第三个为OUT参数模式。 注意,OUT参数指定为数组。 每个OUT和INOUT参数都需要在过程方法中指定为数组,并且仅将数组的第一个元素用作过程参数变量(即映射)。
  • 该过程使用嵌套连接。
  • 抛出的任何SQL异常都可以在调用程序或过程方法中进行处理。 在这种情况下,异常将在调用代码中处理。

2.1.2在数据库中创建过程

该过程是使用CREATE PROCEDURE语句在数据库中创建的。 该命令使用ij交互式运行,或者使用JDBC API的java.sql.Statement接口从Java程序运行。

命令语法和详细信息如下:

CREATE PROCEDURE procedure-Name(ProcedureParameters)ProcedureElements

procedure-Name是存储在数据库中的过程名称; 如果未指定,则在默认架构中创建。

ProcedureParameters指定参数模式(IN,INOUT或OUT),可选名称和数据类型。 数据类型是数据库数据类型。 Java DB在过程中不支持长列类型(例如Long Varchar,BLOB等)。 参数是可选的。

ProcedureElements:此元素必须包含以下三个元素,并且可以具有其他可选元素。

  • 语言JAVA。 这是唯一的值。
  • 参数样式JAVA。 这是唯一的值。
  • 外部名称。 这指定了执行过程时要调用的Java方法,并采用ClassName.methodName Optional, procedure elements形式, ClassName.methodName Optional, procedure elements
    • 动态结果集整数
    • 确定性
    • 外部安全
    • 修改SQL数据(默认值),包含SQL,读取SQL数据,不使用SQL(无数据库相关代码的过程)

2.1.2.1使用ij交互式地在数据库中创建过程

ij是Java DB附带的命令行工具。 ij是一个JDBC工具,用于在Java DB数据库上运行交互式查询。

ij> CONNECT 'jdbc:derby:testDB';
ij> CREATE PROCEDURE PROC_NAME(IN id1 INTEGER, IN name2 VARCHAR(50), OUT count3 INTEGER) LANGUAGE JAVA EXTERNAL NAME 'JavaStoredProcs.testProc' PARAMETER STYLE JAVA;

在示例中,过程PROC_NAMEtestDB数据库中创建。 先前创建的Java方法2.1.1创建Java方法 )被指定为EXTERNAL NAME。

要列出数据库中的过程,请使用命令SHOW PROCEDURES。

2.2.2更改或删除过程

要更改过程,请从数据库中删除该过程,然后再次创建。

使用ij删除过程的示例:

ij> DROP PROCEDURE procedureName;

2.2使用(调用)

使用SQL CALL命令以交互方式运行过程,或者使用JDBC API从客户端程序以交互方式运行过程。

CALL SQL命令仅支持IN参数。 JDBC API的CallableStatement接口用于调用带有IN,INOUT或OUT参数的过程。

2.2.1 CALL SQL语句

CALL语句用于调用过程。 这不会返回值。 使用CALL调用时,仅支持带有IN参数的过程。

以下示例显示了从ij运行的CALL命令,以调用过程MyProc. MyProc MyProc. MyProc是数据库中使用CREATE PROCEDURE定义的过程的名称。

ij> CALL MyProc();

2.2.2从Java程序调用过程

此示例代码调用了先前创建的过程(PROC_NAME)(2.1创建)。

该代码使用JDBC API的CallableStatement接口(有关更多详细信息,请参见2.2.3关于CallableStatement的说明 )。 在此示例方法的末尾,将设置过程的输入参数,并输出out参数值。 请注意,此Java类与创建过程的类不同。

private static void runStoredProc(Connection conn)throws SQLException {int iParam1 = 1;String iParam2 = "updated name data";String proc = "{call PROC_NAME(?, ?, ?)}";CallableStatement cs = conn.prepareCall(proc);cs.setInt(1, iParam1);cs.setString(2, iParam2);cs.registerOutParameter(3, java.sql.Types.INTEGER);cs.executeUpdate();String oParam = cs.getInt(3);System.out.println("Updated row count from the proc: " + oParam);
} // runStoredProc()

2.2.3关于CallableStatement的说明

Java JDBC API的CallableStatement接口扩展了PreparedStatement并在java.sql包中定义。 这用于执行SQL存储过程。

该API提供了一种存储过程SQL转义语法,该语法允许所有RDBMS以标准方式调用过程。 语法的一种形式包含结果参数,另一种形式不包含结果参数。 如果使用,则结果参数必须注册为OUT参数。 其他参数(arg1,arg2,…)可用于输入,输出或两者都使用。

以下是语法(分别具有返回值和不具有返回值):

{? = call <procedure-name> [(arg1, arg2, ...)]}
{call <procedure-name> [(arg1, arg2, ...)]}

使用从PreparedStatement继承的setter方法设置IN参数值。 在使用registerOutParameter()执行存储过程之前,必须先注册所有OUT参数的类型。 它们的值在执行后通过getXxx(int parameterIndex / StringparameterName)方法(getBoolean(),getArray()等)检索。

参数模式

参数属性IN(默认),OUT和INOUT是参数模式。

调用存储过程

String procName = "{call STORED_PRODURE_NAME(}";
CallableStatement cs = conn.prepareCall(procName);
ResultSet rs = cs.executeQuery();

要调用存储过程,请使用execute(),executeQuery()或executeUpdate()方法,具体取决于过程返回的ResultSet对象数。 如果不确定该过程返回多少ResultSet对象,请使用execute()方法。

cs = conn.prepareCall("{call INCR_PRICE(?, ?)}");
cs.setString(1, itemNameArg);				// (1)
cs.setFloat(2, newPriceArg);				// (2a)
cs.registerOutParameter(2, Types.NUMERIC); 	// (2b)
cs.execute();
float newPrice = cs.getFloat(2);			// (2c)

第一参数1是IN参数。

第二个参数具有参数模式INOUT。 IN值是通过调用setter方法2a指定的,并使用registerOutParameter()方法2b注册OUT类型的。 通过吸气剂方法2c检索输出值。

3个例子

有两个示例:第一个显示创建和使用非嵌套类型过程的代码,第二个是Java DB预定义过程的示例用法。

3.1使用非嵌套连接

在此示例中,Java过程访问的数据库和连接与调用程序中使用的数据库和连接不同。 该过程返回OUT整数参数值。

  • 创建并编译过程代码。
    public static void testProc4(int [] retval)throws SQLException {String connectionURL = "jdbc:derby:testDB2";Connection conn = DriverManager.getConnection(connectionURL);Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery("SELECT * FROM ID_TABLE");int nextid = 0;while(rs.next()) {nextid = rs.getInt("ID");}retval[0] = nextid;conn.close(); // alternative: shutdown the database.
    } // testProc4()
  • 在数据库中创建过程。
    CREATE PROCEDURE PROC_NAME_4(OUT paramname INTEGER)LANGUAGE JAVAEXTERNAL NAME 'JavaStoredProcs.testProc4'PARAMETER STYLE JAVAREADS SQL DATA;

    过程元素READS SQL DATA指定SQL in过程方法只能使用SELECT语句。

  • 调用客户端程序中的过程。
    private static void runStoredProc4(Connection conn)throws SQLException {String proc = "{call PROC_NAME_4(?)}";CallableStatement cs = conn.prepareCall(proc);cs.registerOutParameter(1, java.sql.Types.INTEGER);cs.execute();int oParamData = cs.getInt(1); // proc output value
    } // runStoredProc4()

3.2 Java DB内置系统过程

SYSCS_UTIL.SYSCS_BACKUP_DATABASE是预定义的且特定于Java DB的系统过程。 这会将数据库备份到指定目录。 语法为SYSCS_BACKUP_DATABASE(IN backupDirPath VARCHAR)。 该过程不返回值。

以下示例SQL命令调用该过程:

CALL SYSCS_UTIL.SYSCS_BACKUP_DATABASE('c:/backupdir');

注意:在http://www.javaquizplayer.com/blogposts/blogpost4.html上,标题为“ 备份Java DB数据库 ”的博客文章中提供了详细的Java代码示例。

4笔记

4.1与客户端代码相比,过程的某些优势

  • 该例程允许将代码一次存储在数据库服务器上,并且可以从多个应用程序进行访问。 而且,与SQL相比,代码可能很复杂。
  • 该代码在服务器上执行,因此减少了客户端-服务器应用程序中的网络流量。 这样可以提高应用程序的性能。

4.2其他RDBMS

Oracle的10g和HyperSQL数据库(HSQLDB)是其他一些支持Java存储过程的数据库。

5参考

  • Apache Derby>文档(10.8手册)
  • Java SE 7 API> java.sql程序包

翻译自: https://www.javacodegeeks.com/2013/09/java-stored-procedures-in-java-db.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367546.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一些职场感想

教训 不要相信领导给你画的大饼 离开了&#xff0c;就不要回去 他说的为你好&#xff0c;都是套路而已 你会比你想象的更优秀 不要认为提增加工资不好意思&#xff0c;你不提&#xff0c;他永远不会给你加工资 怎么才算努力 这就看你所处的队友是怎么样的&#xff1b;如果队友是…

php聊天室发送表情,聊天室技术(六)-- 表情和动作_PHP

表情和动作极大的丰富了聊天的乐趣,一般的聊天室主要通过2种方法发送(1) 按钮菜单的方法通过在一个固定的下拉菜单里面进行选择,找到自己满意的表情,然后选中,按发送按钮发出(2) 通过手工输入代号比如网易的以手工输入 //hello 代表欢迎的一段动作,以 //bye 代表再见的一段动作…

Java 8的新增功能(第I部分-JavaFX)

免责声明&#xff1a;我不为Oracle工作&#xff0c;也不以任何方式代表Oracle。 此功能列表不是官方的。 作为“局外人”&#xff0c;这只是我研究的一部分。 Java 8已在大约两个月前完成功能&#xff0c;并且开发者预览版即将来临&#xff08;两周后&#xff09;。 这篇博客文…

mysql数据库sql语句优化

昨天帮同事优化了一个sql语句发出来共勉下: SELECT T.*, ( SELECT S.codeName FROM sys_codelist S WHERE S.codeValue T.packagingtype AND S.kindCode PACKAGING ) AS packagingtypeName, S.codeName AS codename, ( SELECT picpath FROM zl_b_gd_pic WHERE 1 1 AND gdid …

CopyPropertis

commons-beanutils.jar PropertyUtils.copyProperties(Object dest, Object orig) spring-beans.jar BeanUtils.copyProperties(Object source, Object target)CopyPropertis对List的操作需要手动转载于:https://www.cnblogs.com/xingzc/p/8663119.html

java调用外联服务用xml,Spring IOC 依赖注入的两种方式:XML和注解

IoC&#xff0c;直观地讲&#xff0c;就是容器控制程序之间的关系&#xff0c;而非传统实现中&#xff0c;由程序代码直接操控。这也就是所谓“控制反转”的概念所在。控制权由应用代码中转到了外部容器&#xff0c;控制权的转移是所谓反转。IoC还有另外一个名字——“依赖注入…

Wicket模型的干净方法

Apache Wicket Web框架的核心概念之一是模型和IModel作为其编程接口。 Wicket组件严重依赖模型&#xff0c;这使它们成为体系结构的重要组成部分。 Apache Wicket是一个有状态框架&#xff0c;将页面及其组件存储到通常位于HTTP会话中的页面存储中。 组件根据模型的内容创建面向…

jquery选择器大全

jQuery 选择器大全选择器 实例 选取 * $("*") 所有元素 #id $("#lastname") id"lastname" 的元素 .class $(".intro") 所有 class"intro" 的元素 element $("p") 所有 <p> 元素 .class.class $(".intr…

第7章 输入/输出系统

总览 I/O系统基本概念 外部设备 输入设备&#xff1a;键盘、鼠标 输出设备&#xff1a;显示器、打印机 外存储器&#xff1a;硬盘存储器、磁盘阵列、光盘存储器 I/O接口 I/O接口的功能和基本结构 I/O端口及其编址 I/O方式 程序查询方式 程序中断方式 中断的基本概念&#xff0c…

python第一个程序HelloWorld

在写第一个python程序之前&#xff0c;我们还需要了解的一个东西就是python解释器 解释器&#xff0c;顾名思义&#xff0c;就是解释一段代码的机器&#xff0c;程序运行的平台&#xff0c;例如Java的解释器就是jdk。 我们在写好的python代码&#xff0c;需要在解释器上执行&am…

Java字符串的十大问题

以下是有关Java字符串的十大常见问题 。 1.如何比较字符串&#xff1f; 使用“ ”还是使用equals&#xff08;&#xff09;&#xff1f; 简而言之&#xff0c;“ ”测试引用是否相等&#xff0c;而equals&#xff08;&#xff09;测试值是否相等。 除非您要检查两个字符串是否…

php原生sql语法,thinkphp执行原生SQL语句的实现方法

怎样在thinkphp里面执行原生的sql语句&#xff1f;$Model new Model();//或者 $Model D(); 或者 $Model M();$sql "select * from order";$voList $Model->query($sql);只是需要new一个空的模型继承Model中的方法。注意query是查功能&#xff0c;execute是增…

Jquery中如何获取元素的文本,值,属性和内容

jQuery DOM 操作jQuery 中非常重要的部分&#xff0c;就是操作 DOM 的能力。jQuery 提供一系列与 DOM 相关的方法&#xff0c;这使访问和操作元素和属性变得很容易。提示&#xff1a;DOM Document Object Model&#xff08;文档对象模型&#xff09;DOM 定义访问 HTML 和 XML …

Python中的__new__()方法的使用

__new__() 函数只能用于从object继承的新式类。 先看下object类中对__new__()方法的定义&#xff1a; class object:staticmethod # known case of __new__def __new__(cls, *more): # known special case of object.__new__""" T.__new__(S, ...) -> a new …

什么是消息中间件

面向消息的中间件&#xff1a;Message-oriented Middleware, MOM 基本功能&#xff1a; 将信息以消息的形式&#xff0c;从一个应用程序传送到另一个或多个应用程序 主要特点&#xff1a; 消息异步接受&#xff0c;类似手机短信的行为&#xff0c;消息发送者不需要等待消息接受…

用Java分割大型XML文件

上周&#xff0c;我被要求用Java编写一些东西&#xff0c;该东西能够将单个30GB XML文件拆分为可配置文件大小的较小部分。 该文件的使用者将是一个中间件应用程序&#xff0c;该应用程序存在XML较大的问题。 在后台&#xff0c;它使用某种DOM解析技术&#xff0c;使它在一段时…

am82.top 1.php,Droppy v2.1.3 – PHP在线网盘系统

更新跨度比较大从1.4.6-2.1.3的更新日志我都贴出来利V2.1.9 (10 July, 2019)- Added option to define maximum upload chunk size in the admin panel- Fixed an issue where downloads were corruptedV2.1.8 (10 July, 2019)- Fixed an issue where upload password field wa…

抛出异常–缓慢而丑陋

这篇文章是关于历史经验以及最近应用的性能优化技术的。 几年前&#xff0c;我在特定的应用程序中发誓&#xff0c;我不得不发现隐藏在真正聪明的工程“技术”之下的无证行为。 它是一个典型的用于发票的单片Java EE应用程序。 最好忘记确切的代码&#xff0c;但是我记得开发人…

信号与线性系统翻转课堂笔记9——傅里叶变换概念

信号与线性系统翻转课堂笔记9——傅里叶变换 The Flipped Classroom9 of Signals and Linear Systems 对应教材&#xff1a;《信号与线性系统分析&#xff08;第五版&#xff09;》高等教育出版社&#xff0c;吴大正著 一、要点 &#xff08;1&#xff0c;重点&#xff09;…

abstract修饰符

1、一个类不能同时被 abstract 和 final 修饰。 2、如果一个类包含抽象方法&#xff0c;那么该类一定要声明为抽象类&#xff0c;否则将出现编译错误。 3、抽象类可以包含抽象方法和非抽象方法。 4、抽象方法是由子类来实现。 5、抽象方法不能被声明成 final 和 static。 6、任…