`
xiamizy
  • 浏览: 85838 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
78437efc-ad8e-387c-847f-a092d52e81a6
spring framew...
浏览量:4753
社区版块
存档分类
最新评论

利用Java存储过程简化数据库操作

 
阅读更多
利用Java存储过程沟通SQL、XML、Java、J2EE和Web服务。 存储过程(stored procedure)允许将运行于数据库层中的持久性逻辑与运行于中间层中的商务逻辑有效地分离开来。这种分离可以降低整个应用程序的复杂性,并提供其重用性、安全性、性能和可伸缩性。 但是,妨碍存储过程广泛采用的一个主要障碍是不同数据库厂商使用各种专有的、且依赖于数据库的实现语言。使用基于Java的存储过程可以解决这一问题。Oracle已经实现了ANSI标准,这些标准规定了从SQL中将静态Java方法作为过程或函数进行调用的能力。这种实现被简单地称作"Java存储过程"。 在本文中,你将了解基于Java的存储过程如何帮助简化商务逻辑、提高其性能,并扩展数据库的功能。本文将介绍Oracle如何在数据库内启用基于Java的存储过程。还会介绍Java存储过程如何访问数据,以及如何创建基本Java存储过程。 选择PL/SQL还是Java 在考虑Oracle存储过程时,你可能会想到PL/SQL。不过,从Oracle8i开始,Oracle已经在数据库中支持Java,从而为存储过程提供了不同于PL/SQL的开放式和可移植的方法。我可以听到"$64 000问题":"我如何在PL/SQL和Java之间做出选择?我是否应当忘记已经学习的所有PL/SQL相关知识,而变为一个Java天地的新手?" 两种语言都适用于数据库编程,都有自己的优点和弱点。在决定选择哪一种语言时,可以参考下面根据经验得出的通用规则: 对于要求与SQL进行无缝集成的数据库中心来说则逻辑使用PL/SQL,从而完成对数据库对象、类型和特性的访问。 出于与数据库的无关性考虑时,可以选择Java作为开放式的语言来取代PL/SQL,同时也为了集成和沟通SQL、XML、J2EE和Web服务等各个领域。 OralceJVM使得Java可以运行在数据库中 从Oracle8i版本1(Oralce8.1.5)开始,Oracle便提供紧密集成的Java虚拟机(JVM),JVM支持Oralce的数据库会话期结构。任何数据库对话期都可以在第一Java代码调用时启动一个虚拟上专用的JVM,后续的用户可以使用这一已经存在的支持Java的会话期。事实上,所有会话共享同一JVM代码并保持"仅静态"的私有状态,而垃圾则收集在单个对话期空间内,从而为各个Java对话期提供了和SQL操作相同的对话期隔离和数据完整性能力。这里,不需要为了数据完整性而进行单独的Java支持的过程。这一基于对话期的结构提供了较小的内存占用率,并使OracleJVM具有与Oracle数据库一样的线性SMP可伸缩性。 创建Java存储过程 要将Java方法转换为Java存储过程需要几个步骤,包括:用loadjava实用程序将Java类加载到数据库中,利用调用规范(Call Spec)发布Java方法,将Java方法、参数类型和返回类型映射到其SQL的对应部分。下面部分说明如何完成这些步骤。 我将使用一个简单的Hello类,它有一个方法Hello.world(),返回字符串"Hello world": public class Hello { public static String world () { return "Hello world"; } } Loadjava 实用程序 Loadjava是加载Java源文件、Java类文件和Java资源文件的实用程序,它可以用来验证字节码,并将Java类和JAR文件布置到数据库中。它既可以通过命令行调用,也可以通过包含于DBMS_JAVA类中的loadjava()方法调用。为了加载我们的Hello.class示例,输入: loadjava -user scott/tiger Hello.class 从Oracle9i版本2开始,loadjava允许通过为包含在被处理的类中的方法创建相应的Call Specs来自动将Java类发布为存储过程。Oracle为开发、测试、调试和布置Java存储过程提供了Oracle9i JDeveloper。 The Resolver Spec 基于JDK的JVM在列于CLASSPATH中的目录中查找类引用,并对其进行解析。因为Oracle数据库类存在于数据库模式中,所以OracleJVM利用数据库解析器(resolver)通过列于Resolver Spec中的模式查找并解析类引用。与CLASSPATH不同(CLASSPATH可以应用于所有的类),Resover Spec根据每类的情况进行应用。缺省解析器首先在加载类的模式中搜寻类,然后在公共同义词(public synonyms)中搜索。 loadjava -resolve <myclass> 你可能需要指定不同的解析器,也可以在使用loadjava时强制进行解析,从而在布置时确定可能在以后运行时发生的任何问题。 loadjava -resolve -resolver "((* SCOTT) (foo/bar/* OTHERS) (* PUBLIC))" Call Spec和存储过程调用 为了从SQL中调用Java方法(以及从PL/SQl和JDBC中调用),必须首先通过Call Spec发布公共静态方法,它为SQL定义方法采用的参数以及返回的SQL类型。 在我们的例子中,我们将利用SQL*Plus连接到数据库,并为Hello.world()定义一个顶级Call Spec: SQL> connect scott/tiger SQL> create or replace function helloworld return VARCHAR2 as language java name 'Hello.world () return java.lang.String'; / Function created. 可以像下面这样调用Java存储过程: SQL> variable myString varchar2[20]; SQL> call helloworld() into :myString; Call completed. SQL> print myString; MYSTRING --------------------- Hello world Java存储过程可以通过其Call Spec从以下各项中进行调用:SQL DML语句(INSERT, UPDATE、DELETE、SELECT、CALL、EXPLAIN PLAN、LOCK TABLE和MERGE)、PL/SQL块、子程序、程序包以及数据库触发器。Call Spec的美妙之处在于存储过程实现可以从PL/SQL转换为Java,反之亦可,这一点对于请求者是透明的。 Call Spec从实现语言中(PL/SQL或Java)中抽象出调用界面,因而使之能够在原有应用程序和新的基于Java/J2EE的应用程序之间共享商务逻辑。但是,在从Java客户程序调用在数据库驻留的Java类时,你可能不希望通过PL/SQL包装器(wrapper)。在以后的版本中,Oracle计划提供一种机制,它可以使开发人员略过Call Spec。 高级数据访问控制 Java存储过程可用于控制和限制对Oracle数据的访问,其方法是只允许用户通过存储过程管理数据,而存储过程在其调用者的权限内执行,而不能对表本身进行访问。例如,你可以在特定时间内禁止更新数据,或者使管理者只具有查询工资数据的权利,而不能进行更新,或者记录所有的访问并通知某一安全机构。 原有应用程序与J2EE应用程序之间的数据逻辑共享 因为原有应用程序与J2EE应用程序都通过Call Spec调用存储过程,所以J2EE和非J2EE应用程序可以共享相同的数据逻辑。由于有了Call Spec,所以不用考虑所用的是何种实现语言(无论是PL/SQL还是Java),该数据逻辑都可以共享。 为BMP实体Bean自动生成主关键字 在对EJB实体bean应用BMP时,一个bean实例可以由自动生成的与新插入的数据相关联的主关键字惟一确定,它是ejbCreate()的返回值。可以利用一个插入相应数据的存储过程在一个数据库操作中检索ejbCeater()中的该值,并检索或计算主关键字。作为另一种方法,也可以利用JDBC3.0的RETURN_GENERATED_KEYS特性,以一个SQL语句插入该数据并检索相应的关键字(或ROWID)。但是,存储过程方法在各个JDBC驱动器版本和数据库之间更具可移植性。 可以用以下三个步骤实现这一模式:创建一个Java存储过程,在公共GenPk类中定义一个公共静态Java方法insertAccount()。此方法将插入数据、计算惟一的关键字(通过发出一个序列号),并返回计算出的关键字作为主关键字。 定义Call Spec CREATE OR REPLACE PROCEDURE insertAccount(owner IN varchar, bal IN number, newid OUT number) AS LANGUAGE JAVA NAME 'GenPK.insertAccount( java.lang.String [])'; / 在ejbCreate()内调用存储过程 Public AccountPK ejbCreate(String ownerName, int balance) throws CreateException { try { CallableStatement call = conn.prepareCall{ "{call insertAccount(?, ?, ?)}"}; return new AccountPK(accountID); } } 为CMP实体Bean定制主关键字查找器 查找器方法(Finder methods)用于检索已存在的EJB实体bean实例。主关键字查找器使你能够检索惟一标识的EJB实例。对于CMP实体bean,EJB容器根据声明描述,自动生成主关键字查找器findByPrimaryKey()方法。但是,在某些情况下,可能需要更多的控制,例如可能需要专门的查找器,如findByStoredProcKey()。在这些情况下,你可以结合使用Java存储过程和对象关系框架(如Oracle9i应用服务器[Oracle9iAS] TopLink)来实现定制的主关键字查找器方法。在将EJB查找器定义为REDIRECT或NAMED查找器后,TopLink将生成一个SQL查询用于检索bean实例。 数据驱动的EJB调用 在数据驱动体系结构中,商务逻辑调用可以作为数据库操作(如插入、更新或删除)的结果来触发。实现该数据逻辑的Java存储过程可以被声明为数据库触发器,用以调用运行于中间层J2EE应用服务器的EJB。EJB的调用既可以采用J2EE1.3兼容的服务器通过Interoperable Inter-ORB Protocol(IIOP)标准远程方法调用(remote method invocation,RMI)实现,也可以通过销售商特定的传输协议(如Oracle9iAS/Oc4J的ORMI,或者通过BEA WebLogic的T3)用RMI来实现。每个应用服务器提供商在提供基于IIOP的RMI,以提供互操作性的同时,都有其自己优化的协议。Oracle9iAS同时支持基于IIOP的RMI调用和基于ORMI协议的RMI调用。 数据驱动的消息传送 Oracle9i数据库嵌入了Advanced Queuing(AQ,高级排队),它是一种集成的、稳定、可靠、安全、可扩展和事务处理式的消息排队框架。Oracle通过标准的Java消息传送系统(Java Messaging System,JMS)API为Java开发人员提供AQ功能。Java存储过程可以通过JMS接口调用AQ操作,从而能够实现快速、在会话期内、可扩展的、数据驱动的消息传送。 Java存储过程可以利用JMS调用AQ操作。可以用以下4个步骤实现这一模式:创建并启动JMS Queue(为此,可以将以下一些操作嵌入SQL脚本内): execute dbms_aqadm.create_queue_table(queue_table => 'queue1', queue_payload_type => 'SYS.AQ$_JMS_TEXT_MESSAGE', comment => 'a test queue', multiple_consumers => false, compatible => '8.1.0'); execute dbms_aqadm.create_queue( queue_name => 'queue1', queue_table => 'queue1' ); execute dbms_aqadm.start_queue(queue_name => 'queue1'); 创建Java存储过程(代码摘录如下): public static void runTest(String msgBody) { try { // get database connection ora_drv = new OracleDriver(); db_conn = ora_drv.defaultConnection(); // setup sender (cf online code sample) .. // create message s_msg = s_session.createTextMessage(msgBody); // send message sender.send(s_msg); s_session.commit(); // receive message r_msg = (TextMessage) receiver.receive(); r_session.commit(); // output message text String body = r_msg.getText(); System.out.println("message was '"+body+"'"); ..} } 创建Call Spec: create or replace procedure jmsproc (t1 IN VARCHAR) as language java name 'jmsSample.main (java.lang.String[])'; / 调用存储过程: call jmsproc('hello'); 数据库辅助的Web发布(缓冲失效) 各应用程序结构必须面对的一个共同问题是如果可靠地将数据库信息进行缓存,以提高整个系统的性能。JCACHE是一种即将公布的标准规范(JSR 107),它可以解决这一问题。它说明了一种对Java对象临时在内存中进行缓存的方法,包括对象的创建、共享访问、假脱机(spooling)、失效、各JVM的一致性等。它可被用于缓存JSP内最经常读取的数据,如产品目录和价格列表。利用JCACHE,多数查询的反应时间会因为有缓存的数据而加快(内部测试表明反应时间大约快15倍)。 为了跟踪原始数据的所有变化,并刷新已缓存的数据,Java存储过程会作为一个触发器被附加在一个表上。这个表的任何变化都会自动调用该存储过程,后者再调出一个已定义的JSP使JCACHE对象失效,该对象将其状态映射到该数据库表。在失效时,紧跟其后的查询将强制缓存器根据数据库的数据进行更新。 下面的步骤 阅读关于Java存储过程的更多信息本文摘自白皮书"释放Java存储过程的能量(Unleash the Power of Java Stored Procedures)",可以在以下位置找到该白皮书: otn.oracle.com/tech/java/java_db/pdf/ OW_30820_JAVA_STORED_PROC_paper.PDF Oracle9i数据库第2版中的新PL/SQL特性 otn.oracle.com/tech/pl_sql/pdf/ Paper_30720_Doc.pdf Resolver Spec otn.oracle.com/docs/products/oracle9i/ doc_library/release2/java.920/a96659.pdf OracleJVM and Java 2 Security otn.oracle.com/docs/products/oracle9i/ doc_library/release2/java.920/a96656.pdf 下载代码练习本文中的代码示例: otn.oracle.com/sample_code/tech/ java/jsp/Oracle9iJSPSamples.html 了解作为Web服务的存储过程 otn.oracle.com/tech/webservices 扩展数据库的功能 在数据库中直接运行Java代码的一个妙处就在于要实现新的功能,只需要简单地加载代码或库,并利用Call Spec制作可用于SQL、PL/SQL、Java、J2EE和非Java API的进入点(公共静态方法)。Oracle9i数据库用户可以很容易地扩展数据库功能。Oracle自己利用这种能力来获得新的应用程序和工具包,如XML Developer Kits(XDKs)。 沟通SQL、PL/SQL、Java、J2EE、.NET和XML Oracle XDK是用Java编写的,并将其公共方法可用作Java存储过程,从而扩展了数据库的XML可编程能力。SQL、PL/SQL、Java、J2EE和非Java(.NET)商务逻辑都能够访问XML分析器、XSLT处理器、XPath引擎和XML SQL Utility(XSU)。 XML分析器可以通过xmlparser和xmldom包进行访问。XSU是一种Java实用程序,它可以由SQL查询结果或JDBC ResultSet生成XML文档,并将XML文档中的数据写入数据库表或视图中。利用XSU,XML输出可以输出为文本、Dom树或DTS。通过dbms_xmlquery和dbms_xmlsave包,XSU即可用于PL/SQL。 结论 Oracle数据库与Java VM的集成可以创建可移植、功能强大和与数据库无关的数据逻辑和持续性逻辑(persistence logic)。运行于中间层的商务逻辑和运行于数据库层的数据逻辑之间的分离提高了应用程序的可扩展性、灵活性和可维护性。    asp">oracleasp">存储过程
分享到:
评论

相关推荐

    基于Java+SQL Server实现(窗体)清朝名人数据库系统【100010307】

    首先,利用 Java 做出必要的界面,其中包括登录以及增删查改五个界面,其次,使用 JDBC 将已经存入名人、皇帝资料库的数据库连接起来,最后再加入指令代码,即可实现名人数据库管理系统。在名人数据库管理系统设计...

    Spring Boot+Mybatis集成H2数据库示例

    场景目标:通过集成Spring Boot+Mybatis+H2,可以简化数据库操作层的开发工作,提高开发效率。特别是在无需持久化数据至物理硬盘,仅需临时存储数据的场景(如演示环境、功能测试)下,H2内存数据库能提供便捷、高效...

    JAVA上百实例源码以及开源项目源代码

    Java存储与读取对象 1个目标文件 如题 Java调色板面板源代码 1个目标文件 摘要:Java源码,窗体界面,调色板  使用Java语言编写的一款用于反映颜色变化的面板,也就是大家熟悉的颜色调色板演示程序。原理是初始化颜色...

    JAVA上百实例源码以及开源项目

    Java存储与读取对象 1个目标文件 如题 Java调色板面板源代码 1个目标文件 摘要:Java源码,窗体界面,调色板  使用Java语言编写的一款用于反映颜色变化的面板,也就是大家熟悉的颜色调色板演示程序。原理是初始化颜色...

    Java课程设计&毕业设计-基于SpringBoot+MybatisPlus的博客系统(数据库+源码).zip

    你可以使用Mybatis Plus提供的注解和API来简化数据库操作。 5. 创建服务层和控制层:在服务层中,实现博客文章的增删改查等功能。在控制层中,处理HTTP请求,并调用服务层的方法来处理业务逻辑。 6. 创建用户认证...

    [其他类别]基于JAVA的脉搏邮件开源简化系统.zip

    MyBatis或Hibernate可以简化数据库操作,提供了方便的ORM(对象关系映射)功能,使得数据的持久化变得简单和高效。 通过以上技术选择和框架搭建,该项目可以实现一个高性能、可扩展性强的Web应用程序。开发人员可以...

    数据库设计和数据库部署工具BDB 2007 Pro V2.3

    您可以通过使用BDB来简化软件开发和部署过程: 1、数据库设计、数据库部署:支持和数据库之间的正向和反向工程。 既可以通过BDB进行新的数据库设计,自动创建或更新至实体数据库、 也可导出现有数据库结构,并为其...

    Mybatis使用手册.pdf

    mybatis看这一篇就够了,MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置...

    数据库设计和部署软件BDB 专业版V2.6

    &lt;br&gt;您可以通过BDB来简化软件开发和部署过程: &lt;br&gt;1,数据库设计。 通过BDB快速建立数据库模型。支持正向工程和反向工程, 以及数据库模型和实体数据库之间的比对更新和双向同步。 &lt;br&gt;2,数据库...

    Spring Boot Mybatis使用详解含示例(值得珍藏)

    简化数据库操作:MyBatis 简化了 JDBC 代码的编写,减少了手动设置参数和获取结果集的工作量。 支持事务管理:MyBatis 可以与 Spring 框架集成,利用 Spring 的事务管理功能,确保数据的完整性和一致性。 缓存机制:...

    数据库设计/自动安装工具BDB 2007 V2.3(For Oracle/MS SQLServer/Access/MySQL/SQLAnyWhere/Sybase)

    &lt;br&gt;此外、在BDB中提供了对开发语言的支持、 其数据库结构定义文件采用XML标准格式、 并且开放了外部读取数据库结构的源程序(C#/Delphi/JAVA)、 您可以通过使用BDB来简化软件开发和部署过程: &lt;br&gt;1...

    java开源包11

    利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类...

    java开源包4

    利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类...

    java开源包6

    利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类...

    java开源包9

    利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类...

    java开源包101

    利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类...

    java开源包5

    利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类...

    java开源包8

    利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类...

    java开源包10

    利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类...

    JAVA毕业设计之基于Spring Boot的装饰工程管理系统(springboot+mysql)完整源码.zip

    JPA(Java Persistence API):一个用于操作数据库的Java API,可以简化数据库操作的代码。 Hibernate:一个JPA实现,用于将Java对象映射到数据库表。 Bootstrap:一个前端框架,用于快速构建响应式和移动优先的Web...

Global site tag (gtag.js) - Google Analytics