使用Java语言开发存储过程
如何用Java编写一个简单的数据库应用程序

如何用Java编写一个简单的数据库应用程序Java是一个非常强大的编程语言,它提供了多种处理数据库的方案。
下面我们将介绍如何用Java编写一个简单的数据库应用程序。
1.安装Java开发环境(JDK):首先,你需要安装Java开发环境(Java Development Kit,JDK)。
你可以从Oracle官方网站上下载最新版本的JDK,并按照它们提供的说明进行安装。
2.设置环境变量:一旦JDK安装完毕,你需要设置相应的环境变量。
在Windows系统中,你可以在“系统属性”中找到“高级”选项卡,点击“环境变量”,并添加JAVA_HOME变量指向JDK的安装路径。
3.下载并安装数据库:Java支持多种数据库,例如MySQL、Oracle和PostgreSQL。
你可以选择其中一个作为你的数据库。
在这个教程中,我们将使用MySQL作为示范。
从MySQL官方网站下载并安装最新版本的MySQL。
4.连接数据库:一旦数据库安装完毕,你需要编写Java代码来连接数据库。
首先,你需要下载MySQL JDBC驱动程序。
你可以从MySQL官方网站上找到最新版本的驱动程序,并将其添加到你的项目中。
接下来,你需要使用编程语言的`import`语句将这个驱动程序导入到你的Java代码中。
5.建立数据库连接:在你的Java代码中,你需要使用JDBC驱动程序提供的API来建立数据库连接。
这包括创建一个Connection对象,并传入数据库的URL、用户名和密码。
```javaimport java.sql.*;public class Main {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/mydatabase";String user = "root";String password = "mypassword";try {Connection conn = DriverManager.getConnection(url, user, password);System.out.println("Connected to the database");} catch (SQLException e) {System.out.println("An error occurred");e.printStackTrace();}}}```在上面的代码中,`url`变量指定了数据库的URL,`user`和`password`变量指定了连接数据库所需的用户名和密码。
存储过程调用java代码的方法

存储过程调用java代码的方法存储过程是一组SQL语句的集合,可以被视为一种预编译的SQL 语句,可以通过存储过程调用来实现对数据库的操作。
在Java中,我们可以通过以下方法来调用存储过程:1. 使用JDBC调用存储过程使用JDBC调用存储过程需要以下步骤:1)获取数据库连接。
2)创建CallableStatement对象,使用存储过程名称作为参数创建对象。
3)设置输入参数和输出参数。
输入参数可以通过setXXX()方法设置,输出参数可以使用registerOutParameter()方法注册。
4)执行存储过程。
可以使用execute()或executeUpdate()方法执行。
5)获取输出参数。
以下是一个简单的示例:```try(Connection conn = DriverManager.getConnection(url, user, password)) {CallableStatement cs = conn.prepareCall('{call procedure_name(?, ?)}');cs.setInt(1, 1); // 设置输入参数cs.registerOutParameter(2, Types.VARCHAR); // 注册输出参数cs.execute(); // 执行存储过程String result = cs.getString(2); // 获取输出参数System.out.println(result);} catch (SQLException e) {e.printStackTrace();}```2. 使用ORM框架调用存储过程使用ORM框架调用存储过程需要根据不同的框架进行配置。
以下是使用MyBatis调用存储过程的示例:1)在Mapper XML文件中定义存储过程调用语句。
```<select id='callProcedure' statementType='CALLABLE'>{call procedure_name(#{param1, mode=IN,jdbcType=INTEGER}, #{param2, mode=OUT, jdbcType=VARCHAR})}</select>```2)在Java代码中调用Mapper方法。
oracle存储过程调用javasource的方法

oracle存储过程调用javasource的方法Oracle存储过程调用Java方法介绍在Oracle数据库中,我们可以使用存储过程来执行一系列的数据库操作。
有时候,我们希望在存储过程中调用Java方法,以实现一些比较复杂的逻辑。
本文将详细介绍在Oracle存储过程中调用Java方法的几种方法。
方法一:使用Java Stored ProcedureJava Stored Procedure是Oracle数据库提供的一种特殊的存储过程类型,在该类型的存储过程中可以直接调用Java方法。
步骤:1.创建Java类,并将其编译成字节码文件(.class文件)。
2.将字节码文件导入到数据库中,可以使用loadjava工具或通过SQL语句执行导入。
3.创建Java Stored Procedure,将其指定为刚导入的字节码文件,并编写实际的存储过程逻辑。
4.在需要的地方调用Java Stored Procedure。
优点:•简单易用,只需创建Java类和Java Stored Procedure即可。
•可以直接访问数据库,无需通过其他方式。
缺点:•必须将Java类编译成字节码文件并导入到数据库中,稍显麻烦。
•Java Stored Procedure在数据库中运行,可能会造成数据库性能的损耗。
方法二:使用外部过程调用Java方法Oracle数据库通过提供外部过程功能,允许我们在存储过程中调用外部的Java方法。
步骤:1.将Java方法包装成Java函数或Java过程,并将其编译成动态加载库文件(.so或.dll文件)。
2.使用CREATE LIBRARY语句在数据库中创建对应的外部库。
3.创建存储过程,将其指定为调用外部库中的函数或过程,并编写实际的存储过程逻辑。
4.在需要的地方调用存储过程。
优点:•可以方便地调用已存在的Java方法,无需修改原有代码。
•外部过程在数据库外部运行,不会对数据库性能造成影响。
JAVA通过MyBatis调用MySql存储过程和函数

JAV A通过MyBatis调用MySql存储过程和函数1.引言无论是采用SPRING MVC框架开发WEB画面,还是开发需按一定时间间隔执行的批处理,都可能要调用数据库的存储过程或函数。
其间调用参数设置不正会浪费大量调试时间初学者甚至放弃使用存储过程。
本文记录了通过MyBatis调用MySql存储过程和函数的具体参数设置内容,供参考。
2.MySql存储过程例/*全公司员工下一年度带薪休假一发赋予处理*/CREATE DEFINER=`DBuser`@`%` PROCEDURE `paid_vacation_compute `( OUT p_返回值 INT(11) ,INOUT p_员工号 CHAR(3) ,p_操作者ID VARCHAR(3))PROC_START:BEGIN/* 变量声明 */DECLARE done INT; #异常退出控制变量DECLARE empNo CHAR(3); #员工号DECLARE dateHire date; #分公司就职日DECLARE workYears INT; #集团内工作年数DECLARE lastYearRemainDays FLOAT; #昨年残日数(允许以小时为单位休假)DECLARE nowYearleaveDays FLOAT; #今年休暇日数(允许以小时为单位休假)DECLARE elapseYear INT; #入集团经过年度数/* 游标声明 */#上年带薪休假数据DECLARE staffPaidVacationDaysCur CURSOR FORSELECT a.EMP_NO, #员工号a.DATE_HIRE, #入职日期a.WORK_YEARS, #工作年限b.REMAIN_DAYS # 上年带薪休假应休但未休残日数FROM T_EMPLOYEE AS a,T_PAID_VACATION AS bWHERE a. EMP_NO = b. EMP_NO/* 程序退出规定声明 */DECLARE CONTINUE HANDLER FOR NOT FOUND SET SET done = 1;DECLARE EXIT HANDLER FOR SQLWARNING SET done = 2;DECLARE CONTINUE HANDLER FOR SQLEXCEPTIONBEGINSET done = 3;ROLLBACK; #SQL异常回滚END;/* 1.输入参数妥当性检查 */IF (p_操作者 IS NULL OR p_操作者 = '') THENSET p_返回值 = 9;LEAVE PROC_START;END IF;SET done = 0;START TRANSACTION;loop_label:LOOP# 读入一条记录, 代入到各个变量中FETCH staffPaidVacationDaysCurINTO empNo, #员工号dateHire, #就职日workYears, #集团内工作年数lastYearRemainDays #昨年残日数;IF done = 1 THENLEAVE loop_label;END IF;/*根据集团内工作年限+分公司就职年限计算下一年度带薪天数*/ SET elapseYear = YEAR(current_timestamp)- Year(dateHire)+ workYears;IF elapseYear = 0 THENSET nowYearLeaveDays = 10;ELSEIF elapseYear = 1 THENSET nowYearLeaveDays = 11;ELSEIF elapseYear = 2 THENSET nowYearLeaveDays = 12;ELSEIF elapseYear = 3 THENSET nowYearLeaveDays = 14;ELSEIF elapseYear = 4 THENSET nowYearLeaveDays = 16;ELSEIF elapseYear = 5 THENSET nowYearLeaveDays = 18;ELSEIF elapseYear >= 6 THENSET nowYearLeaveDays = 20;END IF;SET done = 0;SET p_员工号= empNo;UPDATE T_PAID_VACATIONSETLAST_YEAR_REMAIN_DAYS = lastYearRemainDays,THIS_YEAR_BASE_DAYS = nowYearLeaveDays,UPDATE_DATETIME = current_timestamp,UPDATE_USER_ID = 'SYS',UPDATE_TERMINAL_ID = 'MANUAL'WHERE EMP_NO = CONVERT(empNo USING binary);IF done = 3 THENSET p_返回值 = 6;LEAVE PROC_START;END IF;END LOOP;COMMIT;END3.MySql函数例CREATE DEFINER=`DBuser`@`%` FUNCTION ` paid_vacation_compute `( p_员工号 CHAR(3) ,p_操作者ID VARCHAR(3))) RETURNS int(11)BEGIN/* 变量声明 */DECLARE done INT; #异常退出控制变量DECLARE empNo CHAR(3); #员工号DECLARE dateHire date; #分公司就职日DECLARE workYears INT; #集团内工作年数DECLARE lastYearRemainDays FLOAT; #昨年残日数(允许以小时为单位休假)DECLARE nowYearleaveDays FLOAT; #今年休暇日数(允许以小时为单位休假)DECLARE elapseYear INT; #入集团经过年度数/* 游标声明 */#上年带薪休假数据DECLARE staffPaidVacationDaysCur CURSOR FORSELECT a.EMP_NO, #员工号a.DATE_HIRE, #入职日期a.WORK_YEARS, #工作年限b.REMAIN_DAYS # 上年带薪休假应休但未休残日数FROM T_EMPLOYEE AS a,T_PAID_VACATION AS bWHERE a. EMP_NO = b. EMP_NO/* 程序退出规定声明 */DECLARE CONTINUE HANDLER FOR NOT FOUND SET SET done = 1;DECLARE EXIT HANDLER FOR SQLWARNING SET done = 2;DECLARE CONTINUE HANDLER FOR SQLEXCEPTIONBEGINSET done = 3;ROLLBACK; #SQL异常回滚END;/* 1.输入参数妥当性检查 */IF (p_操作者 IS NULL OR p_操作者 = '') THENRETURN 9;END IF;SET done = 0;START TRANSACTION;loop_label:LOOP# 读入一条记录, 代入到各个变量中FETCH staffPaidVacationDaysCurINTO empNo, #员工号dateHire, #就职日workYears, #集团内工作年数lastYearRemainDays #昨年残日数;IF done = 1 THENLEAVE loop_label;END IF;/*根据集团内工作年限+分公司就职年限计算下一年度带薪天数*/ SET elapseYear = YEAR(current_timestamp)- Year(dateHire)+ workYears;IF elapseYear = 0 THENSET nowYearLeaveDays = 10;ELSEIF elapseYear = 1 THENSET nowYearLeaveDays = 11;ELSEIF elapseYear = 2 THENSET nowYearLeaveDays = 12;ELSEIF elapseYear = 3 THENSET nowYearLeaveDays = 14;ELSEIF elapseYear = 4 THENSET nowYearLeaveDays = 16;ELSEIF elapseYear = 5 THENSET nowYearLeaveDays = 18;ELSEIF elapseYear >= 6 THENSET nowYearLeaveDays = 20;END IF;SET done = 0;SET p_员工号= empNo;UPDATE T_PAID_VACATIONSETLAST_YEAR_REMAIN_DAYS = lastYearRemainDays,THIS_YEAR_BASE_DAYS = nowYearLeaveDays,UPDATE_DATETIME = current_timestamp,UPDATE_USER_ID = 'SYS',UPDATE_TERMINAL_ID = 'MANUAL'WHERE EMP_NO = CONVERT(empNo USING binary);IF done = 3 THENRETURN 6;END IF;END LOOP;COMMIT;END4.MySql存储过程调用时的iBatis用Mapper例BaseInfoEditMapper.xml<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE mapperPUBLIC"-////DTD Mapper 3.0//EN""/dtd/ibatis-3-mapper.dtd"><mapper namespace="com.xxx.web.mapper.base_info_edit"><select id="VacationProcedure"parameterType="VacationBean"statementType="CALLABLE"> { call paid_vacation_compute (#{ReturnValue,javaType=INTEGER, jdbcType=INTEGER, mode=OUT},#{StaffNumber,javaType=String, jdbcType=CHAR, mode=INOUT},#{HireDate,javaType=String, jdbcType=VARCHAR, mode=IN},#{OperateID,javaType=String, jdbcType=VARCHAR, mode=IN})}</select></mapper>5.MySql函数调用时的iBatis用Mapper例BaseInfoEditMapper.xml<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE mapperPUBLIC"-////DTD Mapper 3.0//EN""/dtd/ibatis-3-mapper.dtd"><mapper namespace="com.xxx.web.mapper.base_info_edit"><select id="VacationProcedure"parameterType="VacationBean"statementType="CALLABLE"> { #{ReturnValue,javaType=INTEGER, jdbcType=INTEGER, mode=OUT} =call paid_vacation_compute (#{StaffNumber,javaType=String, jdbcType=CHAR, mode=IN},#{HireDate,javaType=String, jdbcType=VARCHAR, mode=IN},#{OperateID,javaType=String, jdbcType=VARCHAR, mode=IN} )} </select></mapper>6.JAVA调用例1(MySql存储过程和函数相同)package com.XXX.impl;import java.util.ArrayList;import java.util.List;import com.XXX.web.bean.VacationCreateBean;import com.XXX.web.dao.BaseInfoEditDAO;import com.XXX.web.util.BasicSqlSupport;public class BaseInfoEditDAOImpl extends BasicSqlSupport implements BaseInfoEditDAO { public boolean addBaseInfo(BaseInfoEditBean objUserInfo) throws Exception {boolean blnFlag=false;//成功FLAG;//全公司员工下一年度带薪休假一发赋予处理VacationCreateBean objVacationCreateBean = new VacationCreateBean();objVacationCreateBean.setStaffNumber(objUserInfo.getSTAFF_NUMBER());objVacationCreateBean.setHireDate(objUserInfo.getDATE_HIRE().toString());objVacationCreateBean.setOperateID(objUserInfo.getCREATE_USER_ID());objVacationCreateBean.setDhcWorkYearsShinKi(objUserInfo.getDHC_WORK_YEARS());String returnValue = (String)this.session.selectOne("com.XXX.web.mapper.base_info_edit.VacationProcedure", objVacationCreateBean);//System.out.println("staffNumber=" + objVacationCreateBean.getStaffNumber());//System.out.println("result=" + objVacationCreateBean.getReturnValue());//System.out.println("returnValue=" + returnValue);//追加結果の判断blnFlag=true;return blnFlag;}}7.処理DAO接口package com.XXX.web.dao;import java.util.List;import com.XXX.web.bean.BaseInfoEditBean;/*** 员工基本信息画面の処理DAO*/public interface BaseInfoEditDAO {public List<BaseInfoEditBean> selectAuthoriyList() throws Exception;public String selectStaffId() throws Exception;public int selectOpetateTimeNum(String strStaffNumber) throws Exception;public boolean addBaseInfo(BaseInfoEditBean objUserInfo) throws Exception;public boolean updateBaseInfo(BaseInfoEditBean objUserInfo) throws Exception;public BaseInfoEditBean searchBaseInfo(String strStaffNumber) throws Exception; }8.共同処理package com.XXX.web.util;import org.apache.ibatis.session.SqlSession;public class BasicSqlSupport{protected SqlSession session;public SqlSession getSession() {return session;}public void setSession(SqlSession session) {this.session = session;} }9. DAO与MAP间的交互BEANpackage com.XXX.web.bean;import java.io.Serializable;public class VacationCreateBean implements Serializable{private int ReturnValue;private String StaffNumber;private String HireDate;private String OperateID;private int WorkYearsShinKi;public int getReturnValue() {return ReturnValue;}public void setReturnValue(int returnValue) {ReturnValue = returnValue;}public String getStaffNumber() {return StaffNumber;}public void setStaffNumber(String staffNumber) {StaffNumber = staffNumber;}public String getHireDate() {return HireDate;}public void setHireDate(String hireDate) {HireDate = hireDate;}public String getOperateID() {return OperateID;}public void setOperateID(String operateID) {OperateID = operateID;}public int getDhcWorkYearsShinKi() {return dhcWorkYearsShinKi;}public void setDhcWorkYearsShinKi(int dhcWorkYearsShinKi) {this.dhcWorkYearsShinKi = dhcWorkYearsShinKi;}}10.通过MAIN函数进行调用package com.ohc.pms.batch;import java.io.FileInputStream;import java.io.IOException;import java.sql.CallableStatement;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.util.Properties;import org.apache.log4j.Logger;import org.apache.log4j.PropertyConfigurator;public class VacationCreate {/**JDBC驱动名 */static String jdbcDriver = "com.mysql.jdbc.Driver";/**DB URL */static String dbURL = "jdbc:mysql://172.999.999.35:3306/empdb";/** DB用户名 */static String user = "empuser";/**DB密码 */static String pass = "empuser123";/**日志输出 */static protected Logger log = Logger.getLogger(VacationCreate.class );public static void main(String[] args) {Connection conn = null;CallableStatement stmt = null;try{PropertyConfigurator.configure(System.getProperty("user.dir") + "\\" + "log4j.properties");("実行路径:" + System.getProperty("user.dir"));String fileName = "jdbc.properties"; // 属性文件名Properties conf = new Properties();try {conf.load(new FileInputStream(System.getProperty("user.dir") + "\\" + "jdbc.properties"));} catch (IOException e) {System.err.println("Cannot open " + fileName + ".");e.printStackTrace();System.exit(-1); // 程序終了}// 读入jdbcDriver = conf.getProperty("driver");dbURL = conf.getProperty("url");user = conf.getProperty("user");pass = conf.getProperty("password");//JDBC driver登録Class.forName("com.mysql.jdbc.Driver");("DB连接。
java调用sql函数_java调用数据库中的函数和存储过程

java调用sql函数_java调用数据库中的函数和存储过程Java是一种常用的编程语言,用于开发各种类型的应用程序,包括与数据库进行交互的应用程序。
在Java程序中,我们可以使用JDBC(Java Database Connectivity)技术来连接和操作数据库。
通过JDBC,我们可以调用数据库中的函数和存储过程来执行一些特定的任务。
在Java中调用SQL函数和存储过程的基本步骤如下:2. 建立数据库连接:使用JDBC连接字符串、用户名和密码等相关参数来创建与数据库的连接。
JDBC提供了一个名为Connection的接口来表示与数据库的连接。
可以使用DriverManager类的静态方法getConnection来获取数据库连接对象。
```javaString username = "用户名";String password = "密码";Connection connection = DriverManager.getConnection(url, username, password);```3. 创建CallableStatement对象:CallableStatement是一个表示可以执行存储过程或函数的SQL语句的接口。
使用Connection对象的prepareCall方法创建一个CallableStatement对象。
```javaString sql = "{call 存储过程或函数名称(参数1, 参数2, ...)}";CallableStatement statement = connection.prepareCall(sql);```4. 设置参数:如果存储过程或函数需要输入参数,可以使用setXXX 方法设置参数的值。
XXX表示参数的数据类型,例如setInt、setString 等。
参数索引从1开始。
```javastatement.setString(1, "参数值");```5. 执行SQL语句:使用execute方法执行存储过程或函数。
TN_ORA_0001_oracle存储过程调用java程序或外部bat文件

oracle存储过程调用java程序或外部bat文件by 胡珏1.调用bat文件1.1.创建java sourcecreate or replace and compile java source named exesyscommand as import java.io.*;publicclass ExeSysCommand{publicstatic String ExeCmd(String cmd) {Process proc=null;int exitValue;try {System.out.println(cmd);proc = Runtime.getRuntime().exec(cmd);exitValue = proc.waitFor();if (exitValue == 0) {return"PASS";} else {return"FAIL";}} catch (Exception e) {return e.getMessage();}}publicstaticvoid P_ExeCmd(String cmd) {Process proc = null;int exitValue;try {System.out.println(cmd);proc = Runtime.getRuntime().exec(cmd);exitValue = proc.waitFor();} catch (Exception e) {System.out.println(e.getMessage());}//proc.destroy();//proc=null;}publicstaticvoid main(String[] args)1.2.创建函数或存储引用该java source1.3.授权1.4.定义bat文件1.5.执行2.调用java程序2.1.创建java sourcecreate or replace and compile java source named httprequest asimport java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import .URL;import .URLConnection;import .URLEncoder;import java.util.List;import java.util.Map;publicclass HttpRequest {finalstatic String username = "cluster";finalstatic String password = "cluster";finalstatic String url_encode = "UTF-8";publicstaticvoid main(String[] args) {//发送 GET 请求Strings=HttpRequest.sendGet("http://192.168.117.2:8081/kettle/executeTrans/ ", "trans=D:/KETTLE/sms.ktr&content=22");System.out.println(s);//发送 POST 请求Stringsr=HttpRequest.sendPost("http://192.168.117.2:8081/kettle/executeTran s/", "trans=D:/KETTLE/sms.ktr&content=22");System.out.println(sr);}* 向指定URL发送GET方法的请求** @param url* 发送请求的URL* @param param* 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
JAVA调用存储过程

CallableStatement对象为所有的DBMS提供了一种以标准形式调用已储存过程的方法。
已储存过程储存在数据库中。
对已储存过程的调用是CallableStatement对象所含的内容。
这种调用是用一种换码语法来写的,有两种形式:一种形式带结果参,另一种形式不带结果参数。
结果参数是一种输出(OUT)参数,是已储存过程的返回值。
两种形式都可带有数量可变的输入(IN参数)、输出(OUT参数)或输入和输出(INOUT参数)的参数。
问号将用作参数的占位符。
在JDBC中调用已储存过程的语法如下所示。
注意,方括号表示其间的内容是可选项;方括号本身并非语法的组成部份。
{call过程名[(?,?,...)]}返回结果参数的过程的语法为:{?=call过程名[(?,?,...)]}不带参数的已储存过程的语法类似:{call过程名}通常,创建CallableStatement对象的人应当知道所用的DBMS是支持已储存过程的,并且知道这些过程都是些什么。
然而,如果需要检查,多种DatabaseMetaData方法都可以提供这样的信息。
例如,如果DBMS支持已储存过程的调用,则supportsStoredProcedures方法将返回true,而getProcedures方法将返回对已储存过程的描述。
CallableStatement继承Statement的方法(它们用于处理一般的SQL语句),还继承了PreparedStatement的方法(它们用于处理IN参)。
CallableStatement中定义的所有方法都用于处理OUT参数或INOUT参数的输出部分:注册OUT参数的JDBC类型(一般SQL类型)、从这些参数中检索结果,或者检查所返回的值是否为JDBC NULL。
1、创建CallableStatement对象CallableStatement对象是用Connection方法prepareCall创建的。
代码调用存储过程 java

代码调用存储过程java如何在Java中调用存储过程?在Java开发中,有时候需要调用数据库中已经定义好的存储过程来执行特定的操作。
存储过程是一组预定义的SQL语句集合,它们经过编译,存储在数据库中并可以多次重复调用。
本文将详细介绍如何在Java中调用存储过程,并给出逐步的代码示例。
步骤一:建立数据库连接首先,我们需要建立与数据库的连接。
在Java中,可以使用JDBC(Java Database Connectivity)技术来实现与数据库的连接。
JDBC是Java提供的一个标准API,用于与各种关系型数据库进行交互。
在调用存储过程之前,需要先加载数据库驱动和建立数据库连接。
下面的代码展示了如何加载MySQL数据库驱动并建立与数据库的连接:import java.sql.*;public class CallStoredProcedure {public static void main(String[] args) {Connection conn = null;Statement stmt = null;try{Class.forName("com.mysql.jdbc.Driver");conn =DriverManager.getConnection("jdbc:mysql:localhost/testdb", "username", "password");}catch(SQLException se){se.printStackTrace();}catch(Exception e){e.printStackTrace();}}}其中,"com.mysql.jdbc.Driver"是MySQL数据库的驱动类名,"jdbc:mysql:localhost/testdb"是数据库连接的URL,"username"和"password"分别是数据库的用户名和密码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Oracle8i中使用Java语言来开发存储过程本篇文章来源与时代朝阳数据库(原晓通数据库)培训部Oracle 资料库。
在Oracle8i之前,开发人员只能使用PL/SQL来开发存储过程。
而在Oracle8i 之中,不仅可以使用原有的PL/SQL开发存储过程,而且也可以使用Java语言来开发存储过程。
本篇文章将简单介绍关于这方面的知识,包括以下内容:●存储过程简介;●Java存储过程●Java存储过程的开发步骤●使用Java开发过程;●使用Java开发函数;●使用Java开发包;●使用Java开发触发器;●使用Java开发对象方法;●使用JDeveloper开发JSP。
存储过程简介存储过程是存储在数据库中的一段存储程序。
当创建存储过程时,系统会对其进行编译,并将执行代码存储到数据库中。
1.设计存储过程的方针●在定义存储过程时,要使用其完成单一、相对集中的任务。
●在定义存储过程时,不要定义已经由其它特征所提供功能的过程。
例如,不要定义强制数据完整性的过程(使用完整性约束)。
2.存储过程的优点1)安全性当创建了存储过程之后,可以将执行该过程的权限授予其它用户,从而使得他可以执行特定的数据库操作,而不能访问其它模式对象(例如表)。
例如,你可以将执行过程(更新表)的权限授予其它用户,但不授予它们直接访问该表的权限。
2)性能●存储过程只被发送到数据库一次,相对于SQL语句或PL/SQL块而言,其网络通信量更小。
●当调用存储过程时,数据库会直接运行该存储过程,无需进行编译。
相对于SQL语句或PL/SQL块而言,其执行速度更快。
3)内存分配存储过程充分利用了Oracle共享内存的能力。
在将存储过程装载到内存中后,多个用户可以同时调用该存储过程,从而降低了应用对Oracle的实际内存需求。
4)生产力存储过程提高了开发生产力。
通过将公共集合编写为存储过程,避免了冗余代码,从而提高了开发生产力。
例如,我们可以编写用于插入、更新、删除AUTHS表的过程,此后应用可以直接调用这些过程,而无需重写SQL语句。
当管理数据的方法发生变化时,只需要修改过程,而不需要对应用进行任何修改。
Java存储过程在以前的Oracle版本中,开发存储过程是通过PL/SQL来完成的。
而在Oracle8i 版本中,我们不仅可以使用PL/SQL开发存储过程,而且还可以使用Java语言来开发存储过程。
1.PL/SQL与Java存储过程比较与PL/SQL相比,使用Java语言开发存储过程有以下优点:●Java语言具有更强大的运算能力,提供了更多的运算方法。
当要完成进行复杂运算的存储过程时,使用JSP将是你最好的选择。
●PL/SQL只能用于Oracle数据库,而Java语言可以应用于更多的数据库系统(如Sybase、DB2、Informix等等),所以Java存储过程将具有更好的兼容性、可移植性。
2.JSP分类Java存储过程包括过程、函数、触发器以及对象方法四种类型。
3.调用JSP的四种方法●CALL语法;●DML语句;●PL/SQL块、子程序、包;●由触发器隐含调用。
Java存储过程的开发步骤1.编写Java源代码当开发Java存储过程时,首先应该编写Java源代码。
如下图所示:注意事项:●当以public方式声明类时,类名必须与其文件名完全一致。
●只有public static方法可以作为Java存储过程。
2.装载Java代码及类到Oracle8i数据库中在编写了Java源代码之后,接下来应该将Java代码及相应的Java类装载到Oracle8i数据库中。
如下图所示:装载Java代码及类到RDBMS有以下两种方法:●使用loadjava工具,通过该工具可以快速装载Java源代码(.java)、Java二进制代码(.class)以及Java打包文件(.jar)。
●使用CREATE Java、ALTER Java装载Java代码。
其中,前一种方法相对简单,并且我们推荐你使用这种方法。
3.生成调用说明在装载了Java类之后,接下来应该生成对public static方法的调用说明,最终完成Java存储过程的开发工作。
如下图所示:完成上述步骤之后,就完成了Java存储过程的开发工作,然后就可以调用并执行该Java存储过程了。
使用Java开发过程过程用于执行某种操作。
需要注意的是,过程所对应的Java方法返回值必须为空(void)。
本节以创建用于插入、修改和删除AUTHS表的JSP为例,说明使用Java开发过程的方法。
如下图所示:下面讲述完成上述任务的方法及过程:1.编写Java源代码程序清单如下(manipulate_auths.java):/* 导入Java类 */import java.sql.*;import java.io.*;import oracle.jdbc.driver.*;/* 主类 */public class manipulate_auths {public static void insert_auths(String code,String name,int sex,String birthdate,String entry_date_time)throws SQLException {/* 建立到数据库的缺省连接 */Connection conn = new OracleDriver().defaultConnection();/* 构造动态SQL语句 */String sql = "INSERT INTO auths(author_code,name,sex,birthdate,entry_date_time) "+"VALUES (?,?,?,?,?)";/* 使用try ... catch语句抓取并抛出例外 */try {/* 准备动态SQL语句 */PreparedStatement pstmt = conn.prepareStatement(sql);/* 设置动态SQL参数值 */pstmt.setString(1, code);pstmt.setString(2, name);pstmt.setInt(3, sex);pstmt.setString(4, birthdate);pstmt.setString(5, entry_date_time);/* 执行动态SQL语句 */pstmt.executeUpdate();/* 关闭动态SQL语句 */pstmt.close();} catch (SQLException e) { }}public static void delete_auths (String code)throws SQLException {/* 建立到数据库的缺省连接 */Connection conn = new OracleDriver().defaultConnection(); /* 构造动态SQL语句 */String sql = "DELETE FROM auths WHERE author_code = ?"; /* 使用try ... catch语句抓取并抛出例外 */try {/* 准备动态SQL语句 */PreparedStatement pstmt = conn.prepareStatement(sql); /* 设置动态SQL参数值 */pstmt.setString(1, code);/* 执行动态SQL语句 */pstmt.executeUpdate();/* 关闭动态SQL语句 */pstmt.close();} catch (SQLException e) { }}public static void modify_salary (String code,float salary) throws SQLException {/* 建立到数据库的缺省连接 */Connection conn = new OracleDriver().defaultConnection();/* 构造动态SQL语句 */String sql = "UPDATE auths SET salary = ? WHERE author_code = ?";/* 使用try ... catch语句抓取并抛出例外 */try {/* 准备动态SQL语句 */PreparedStatement pstmt = conn.prepareStatement(sql);/* 设置动态SQL参数值 */pstmt.setFloat(1, salary);pstmt.setString(2, code);/* 执行动态SQL语句 */pstmt.executeUpdate();/* 关闭动态SQL语句 */pstmt.close();} catch (SQLException e) { }}}2.装载Java代码及类到Oracle8i数据库中在编写了Java源代码之后,就可以将Java对象装载到Oracle8i数据库中了。
下面是完成这项任务的方法:3.发行Java,生成调用说明在装载了Java类后,就可以发行该Java类,并生成调用其方法的过程说明了。
下面是完成该项任务的方法:4.调用JSP在生成了调用Java方法的过程说明之后,我们就可以调用JSP了。
例如:使用Java开发函数函数用于返回特定数据。
本节将通过创建用于返回作者的文章标题,以及某种类型的文章个数为例,说明使用Java开发函数的方法。
如下图所示:下面讲述完成上述任务的方法和过程。
1.编写Java源代码程序清单如下(query_article.java):/* 导入Java类 */import java.sql.*;import java.io.*;import oracle.jdbc.driver.*;/* 主类 */public class query_article {public static String auths_article(String code)throws SQLException {/* 建立到数据库的缺省连接 */Connection conn = new OracleDriver().defaultConnection();/* 构造动态SQL语句 */String sql1 = "SELECT name FROM auths WHERE author_code=?";String sql2 = "SELECT title FROM article WHERE author_code=?";/* 声明并初始化auths_article变量 */String auths_article = new String();/* 使用try ... catch语句抓取并抛出例外 */try {/* 准备动态SQL语句 */PreparedStatement pstmt = conn.prepareStatement(sql1);/* 设置动态SQL参数值 */pstmt.setString(1, code);/* 执行查询,并将结果保存到结果集中 */ResultSet rset = pstmt.executeQuery();/* 循环获取并处理结果集数据 */while(rset.next())auths_article =auths_article + rset.getString(1);/* 关闭结果集 */rset.close();/* 关闭动态SQL语句 */pstmt.close();} catch (SQLException e) {}auths_article = auths_article + "所编写文章的标题如下:\n";try {/* 准备动态SQL语句 */PreparedStatement pstmt = conn.prepareStatement(sql2);/* 设置动态SQL参数值 */pstmt.setString(1, code);/* 执行查询,并将结果保存到结果集中 */ResultSet rset = pstmt.executeQuery();/* 循环获取并处理结果集数据 */while(rset.next()) {auths_article =auths_article + " " + rset.getString(1) + "\n";}/* 关闭结果集 */rset.close();/* 关闭动态SQL语句 */pstmt.close();} catch (SQLException e) {}return auths_article;}public static String query_type_article_number(String code)throws SQLException {/* 建立到数据库的缺省连接 */Connection conn = new OracleDriver().defaultConnection();/* 构造动态SQL语句 */String sql = "SELECT count(*) FROM article WHERE article_code IN "+ "(SELECT article_code FROM article_type WHEREtype_code=?)";String article_number = new String("类型为" + code + "的文章共有 ");/* 使用try ... catch语句抓取并抛出例外 */try {/* 准备动态SQL语句 */PreparedStatement pstmt = conn.prepareStatement(sql);/* 设置动态SQL参数值 */pstmt.setString(1, code);/* 执行查询,并将结果保存到结果集中 */ResultSet rset = pstmt.executeQuery();/* 循环获取并处理结果集数据 */while(rset.next())article_number = article_number + rset.getString(1) + "篇";/* 关闭结果集 */rset.close();/* 关闭动态SQL语句 */pstmt.close();} catch (SQLException e) {}return article_number;}}2.装载Java代码及类到Oracle8i数据库中在编写了Java源代码之后,就可以将Java对象装载到Oracle8i数据库中了。