???
?
Oracle8i中使用Java語言來開發(fā)存儲過程
本篇文章來源與時代朝陽數(shù)據(jù)庫(原曉通數(shù)據(jù)庫)培訓部Oracle?資料庫。
在Oracle8i之前,開發(fā)人員只能使用PL/SQL來開發(fā)存儲過程。而在Oracle8i之中,不僅可以使用原有的PL/SQL開發(fā)存儲過程,而且也可以使用Java語言來開發(fā)存儲過程。本篇文章將簡單介紹關于這方面的知識,包括以下內(nèi)容:
?
l???????? 存儲過程簡介;
l???????? Java存儲過程
l???????? Java存儲過程的開發(fā)步驟
l???????? 使用Java開發(fā)過程;
l???????? 使用Java開發(fā)函數(shù);
l???????? 使用Java開發(fā)包;
l???????? 使用Java開發(fā)觸發(fā)器;
l???????? 使用Java開發(fā)對象方法;
l???????? 使用JDeveloper開發(fā)JSP。 存儲過程簡介
存儲過程是存儲在數(shù)據(jù)庫中的一段存儲程序。當創(chuàng)建存儲過程時,系統(tǒng)會對其進行編譯,并將執(zhí)行代碼存儲到數(shù)據(jù)庫中。
?
1.???????? 設計存儲過程的方針
?
l???????? 在定義存儲過程時,要使用其完成單一、相對集中的任務。
l???????? 在定義存儲過程時,不要定義已經(jīng)由其它特征所提供功能的過程。例如,不要定義強制數(shù)據(jù)完整性的過程(使用完整性約束)。
?
2.???????? 存儲過程的優(yōu)點
1)??????? 安全性
?
當創(chuàng)建了存儲過程之后,可以將執(zhí)行該過程的權限授予其它用戶,從而使得他可以執(zhí)行特定的數(shù)據(jù)庫操作,而不能訪問其它模式對象(例如表)。例如,你可以將執(zhí)行過程(更新表)的權限授予其它用戶,但不授予它們直接訪問該表的權限。
?
2)??????? 性能
?
l???????? 存儲過程只被發(fā)送到數(shù)據(jù)庫一次,相對于SQL語句或PL/SQL塊而言,其網(wǎng)絡通信量更小。
l???????? 當調(diào)用存儲過程時,數(shù)據(jù)庫會直接運行該存儲過程,無需進行編譯。相對于SQL語句或PL/SQL塊而言,其執(zhí)行速度更快。
?
3)??????? 內(nèi)存分配
?
存儲過程充分利用了Oracle共享內(nèi)存的能力。在將存儲過程裝載到內(nèi)存中后,多個用戶可以同時調(diào)用該存儲過程,從而降低了應用對Oracle的實際內(nèi)存需求。
?
4)??????? 生產(chǎn)力
?
存儲過程提高了開發(fā)生產(chǎn)力。通過將公共集合編寫為存儲過程,避免了冗余代碼,從而提高了開發(fā)生產(chǎn)力。例如,我們可以編寫用于插入、更新、刪除AUTHS表的過程,此后應用可以直接調(diào)用這些過程,而無需重寫SQL語句。當管理數(shù)據(jù)的方法發(fā)生變化時,只需要修改過程,而不需要對應用進行任何修改。 Java存儲過程
在以前的Oracle版本中,開發(fā)存儲過程是通過PL/SQL來完成的。而在Oracle8i版本中,我們不僅可以使用PL/SQL開發(fā)存儲過程,而且還可以使用Java語言來開發(fā)存儲過程。
?
1.???????? PL/SQL與Java存儲過程比較
?
與PL/SQL相比,使用Java語言開發(fā)存儲過程有以下優(yōu)點:
?
l???????? Java語言具有更強大的運算能力,提供了更多的運算方法。當要完成進行復雜運算的存儲過程時,使用JSP將是你最好的選擇。
l???????? PL/SQL只能用于Oracle數(shù)據(jù)庫,而Java語言可以應用于更多的數(shù)據(jù)庫系統(tǒng)(如Sybase、DB2、Informix等等),所以Java存儲過程將具有更好的兼容性、可移植性。
?
2.???????? JSP分類
Java存儲過程包括過程、函數(shù)、觸發(fā)器以及對象方法四種類型。
?
3.???????? 調(diào)用JSP的四種方法
?
l???????? CALL語法;
l???????? DML語句;
l???????? PL/SQL塊、子程序、包;
l???????? 由觸發(fā)器隱含調(diào)用。 Java存儲過程的開發(fā)步驟
1.???????? 編寫Java源代碼
?
當開發(fā)Java存儲過程時,首先應該編寫Java源代碼。如下圖所示:
注意事項:
?
l????????? 當以public方式聲明類時,類名必須與其文件名完全一致。
l????????? 只有public static方法可以作為Java存儲過程。
?
2.???????? 裝載Java代碼及類到Oracle8i數(shù)據(jù)庫中
在編寫了Java源代碼之后,接下來應該將Java代碼及相應的Java類裝載到Oracle8i數(shù)據(jù)庫中。如下圖所示:
裝載Java代碼及類到RDBMS有以下兩種方法:
?
l???????? 使用loadjava工具,通過該工具可以快速裝載Java源代碼(.java)、Java二進制代碼(.class)以及Java打包文件(.jar)。
l???????? 使用CREATE Java、ALTER Java裝載Java代碼。
?
其中,前一種方法相對簡單,并且我們推薦你使用這種方法。
?
3.???????? 生成調(diào)用說明
?
在裝載了Java類之后,接下來應該生成對public static方法的調(diào)用說明,最終完成Java存儲過程的開發(fā)工作。如下圖所示:
?
完成上述步驟之后,就完成了Java存儲過程的開發(fā)工作,然后就可以調(diào)用并執(zhí)行該Java存儲過程了。 使用Java開發(fā)過程
過程用于執(zhí)行某種操作。需要注意的是,過程所對應的Java方法返回值必須為空(void)。本節(jié)以創(chuàng)建用于插入、修改和刪除AUTHS表的JSP為例,說明使用Java開發(fā)過程的方法。如下圖所示:
下面講述完成上述任務的方法及過程:
?
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 {
?
??? /* 建立到數(shù)據(jù)庫的缺省連接 */
??? Connection conn = new OracleDriver().defaultConnection();
??? /* 構(gòu)造動態(tài)SQL語句 */
String sql = "INSERT INTO auths
?(author_code,name,sex,birthdate,entry_date_time) " +
???????????????? "VALUES (?,?,?,?,?)";
??? /* 使用try ... catch語句抓取并拋出例外 */
??? try {
????? /* 準備動態(tài)SQL語句 */
????? PreparedStatement pstmt = conn.prepareStatement(sql);
????? /* 設置動態(tài)SQL參數(shù)值 */
????? pstmt.setString(1, code);
????? pstmt.setString(2, name);
????? pstmt.setInt(3, sex);
????? pstmt.setString(4, birthdate);
????? pstmt.setString(5, entry_date_time);
????? /* 執(zhí)行動態(tài)SQL語句 */
????? pstmt.executeUpdate();
????? /* 關閉動態(tài)SQL語句 */
????? pstmt.close();
??? } catch (SQLException e) { }
? }
?
? public static void delete_auths (String code)
? throws SQLException {
?
??? /* 建立到數(shù)據(jù)庫的缺省連接 */
??? Connection conn = new OracleDriver().defaultConnection();
??? /* 構(gòu)造動態(tài)SQL語句 */
??? String sql = "DELETE FROM auths? WHERE author_code = ?";
??? /* 使用try ... catch語句抓取并拋出例外 */
??? try {
????? /* 準備動態(tài)SQL語句 */
????? PreparedStatement pstmt = conn.prepareStatement(sql);
????? /* 設置動態(tài)SQL參數(shù)值 */
????? pstmt.setString(1, code);
????? /* 執(zhí)行動態(tài)SQL語句 */
????? pstmt.executeUpdate();
????? /* 關閉動態(tài)SQL語句 */
????? pstmt.close();
??? } catch (SQLException e) { }
? }
?
? public static void modify_salary (String code,float salary)
? throws SQLException {
?
??? /* 建立到數(shù)據(jù)庫的缺省連接 */
??? Connection conn = new OracleDriver().defaultConnection();
??? /* 構(gòu)造動態(tài)SQL語句 */
??? String sql = "UPDATE auths SET salary = ? WHERE author_code = ?";
??? /* 使用try ... catch語句抓取并拋出例外 */
??? try {
????? /* 準備動態(tài)SQL語句 */
????? PreparedStatement pstmt = conn.prepareStatement(sql);
????? /* 設置動態(tài)SQL參數(shù)值 */
????? pstmt.setFloat(1, salary);
????? pstmt.setString(2, code);
????? /* 執(zhí)行動態(tài)SQL語句 */
????? pstmt.executeUpdate();
????? /* 關閉動態(tài)SQL語句 */
????? pstmt.close();
??? } catch (SQLException e) { }
? }
}
2.???????? 裝載Java代碼及類到Oracle8i數(shù)據(jù)庫中
?
在編寫了Java源代碼之后,就可以將Java對象裝載到Oracle8i數(shù)據(jù)庫中了。下面是完成這項任務的方法:
?
?
3.???????? 發(fā)行Java,生成調(diào)用說明
?
在裝載了Java類后,就可以發(fā)行該Java類,并生成調(diào)用其方法的過程說明了。下面是完成該項任務的方法:
?
?
4.???????? 調(diào)用JSP
在生成了調(diào)用Java方法的過程說明之后,我們就可以調(diào)用JSP了。例如:
?
使用Java開發(fā)函數(shù)
函數(shù)用于返回特定數(shù)據(jù)。本節(jié)將通過創(chuàng)建用于返回作者的文章標題,以及某種類型的文章個數(shù)為例,說明使用Java開發(fā)函數(shù)的方法。如下圖所示:
?
?
下面講述完成上述任務的方法和過程。
?
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 {
?
??? /* 建立到數(shù)據(jù)庫的缺省連接 */
??? Connection conn = new OracleDriver().defaultConnection();
??? /* 構(gòu)造動態(tài)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 {
????? /* 準備動態(tài)SQL語句 */
????? PreparedStatement pstmt = conn.prepareStatement(sql1);
????? /* 設置動態(tài)SQL參數(shù)值 */
????? pstmt.setString(1, code);
????? /* 執(zhí)行查詢,并將結(jié)果保存到結(jié)果集中 */
????? ResultSet rset = pstmt.executeQuery();
????? /* 循環(huán)獲取并處理結(jié)果集數(shù)據(jù) */
????? while(rset.next())
??????? auths_article =auths_article + rset.getString(1);
????? /* 關閉結(jié)果集 */
????? rset.close();
????? /* 關閉動態(tài)SQL語句 */
????? pstmt.close();
??? } catch (SQLException e) {}
??? auths_article = auths_article + "所編寫文章的標題如下:\n";
?
??? try {
????? /* 準備動態(tài)SQL語句 */
????? PreparedStatement pstmt = conn.prepareStatement(sql2);
????? /* 設置動態(tài)SQL參數(shù)值 */
????? pstmt.setString(1, code);
????? /* 執(zhí)行查詢,并將結(jié)果保存到結(jié)果集中 */
????? ResultSet rset = pstmt.executeQuery();
????? /* 循環(huán)獲取并處理結(jié)果集數(shù)據(jù) */
????? while(rset.next()) {
??????? auths_article =auths_article + "??? " + rset.getString(1) + "\n";
????? }
????? /* 關閉結(jié)果集 */
????? rset.close();
????? /* 關閉動態(tài)SQL語句 */
????? pstmt.close();
??? } catch (SQLException e) {}
??? return auths_article;
? }
?
? public static String query_type_article_number(String code)
? throws SQLException {
?
??? /* 建立到數(shù)據(jù)庫的缺省連接 */
??? Connection conn = new OracleDriver().defaultConnection();
??? /* 構(gòu)造動態(tài)SQL語句 */
??? String sql = "SELECT count(*) FROM article WHERE article_code IN "
?????? + "(SELECT article_code FROM article_type WHERE type_code=?)";
??? String article_number = new String("類型為" + code + "的文章共有 ");
??? /* 使用try ... catch語句抓取并拋出例外 */
??? try {
????? /* 準備動態(tài)SQL語句 */
????? PreparedStatement pstmt = conn.prepareStatement(sql);
????? /* 設置動態(tài)SQL參數(shù)值 */
????? pstmt.setString(1, code);
? ????/* 執(zhí)行查詢,并將結(jié)果保存到結(jié)果集中 */
????? ResultSet rset = pstmt.executeQuery();
????? /* 循環(huán)獲取并處理結(jié)果集數(shù)據(jù) */
????? while(rset.next())
??????? article_number = article_number + rset.getString(1) + "篇";
????? /* 關閉結(jié)果集 */
????? rset.close();
????? /* 關閉動態(tài)SQL語句 */
????? pstmt.close();
??? } catch (SQLException e) {}
??? return article_number;
? }
}
?
2.???????? 裝載Java代碼及類到Oracle8i數(shù)據(jù)庫中
?
在編寫了Java源代碼之后,就可以將Java對象裝載到Oracle8i數(shù)據(jù)庫中了。下面是完成這項任務的方法:
?
3.???????? 發(fā)行Java,生成調(diào)用說明
?
在裝載了Java類后,就可以發(fā)行該Java類,并生成調(diào)用其方法的函數(shù)說明了。下面是完成該項任務的方法:
?
?
4.???????? 調(diào)用JSP
?
在生成了調(diào)用Java方法的函數(shù)說明之后,就可以調(diào)用這些函數(shù)了。例如:
?
使用Java開發(fā)包
Java類用于封裝Java方法,與此類似,包用于封裝過程和函數(shù)等。本節(jié)將通過創(chuàng)建用于管理表subject的包為例,說明使用Java開發(fā)包的方法。如下圖所示:
?
?
下面講述完成上述任務的方法和過程。
?
1.???????? 編寫Java源代碼
?
程序清單如下(manage_subject.java):
?
/* 導入Java類 */
import java.sql.*;
import java.io.*;
import oracle.jdbc.driver.*;
?
/* 主類 */
public class manage_subject {
?
? public static String query_subject()
? throws SQLException {
??? /* 建立到數(shù)據(jù)庫的缺省連接 */
??? Connection conn = new OracleDriver().defaultConnection();
??? /* 構(gòu)造SQL語句 */
??? String sql = "SELECT * FROM subject";
??? /* 聲明并初始化subject變量 */
??? String subject = new String();
??? /* 使用try ... catch語句抓取并拋出例外 */
??? try {
????? /* 創(chuàng)建Statement對象 */
????? Statement stmt = conn.createStatement();
????? /* 執(zhí)行SQL語句,并將查詢結(jié)果賦給結(jié)果集 */
????? ResultSet rset = stmt.executeQuery(sql);
????? /* 循環(huán)獲取并處理結(jié)果集變量 */
????? while(rset.next())
??????? subject = subject + rset.getString(1) + "\n";
????? /* 關閉結(jié)果集 */
????? rset.close();
??? } catch (SQLException e) {}
??? return subject;
? }
?
? public static void insert_subject(String subject)
? throws SQLException {
?
??? /* 建立到數(shù)據(jù)庫的缺省連接 */
??? Connection conn = new OracleDriver().defaultConnection();
??? /* 構(gòu)造動態(tài)SQL語句 */
??? String sql = "INSERT INTO subject VALUES(?)";
??? /* 使用try ... catch語句抓取并拋出例外 */
??? try {
????? /* 準備動態(tài)SQL語句 */
????? PreparedStatement pstmt = conn.prepareStatement(sql);
????? /* 設置動態(tài)SQL參數(shù)值 */
????? pstmt.setString(1, subject);
????? /* 執(zhí)行動態(tài)SQL語句 */
????? pstmt.executeUpdate();
????? /* 關閉動態(tài)SQL語句 */
????? pstmt.close();
??? } catch (SQLException e) {}
? }
?
? public static void delete_subject(String subject)
? throws SQLException {
?
??? /* 建立到數(shù)據(jù)庫的缺省連接 */
??? Connection conn = new OracleDriver().defaultConnection();
??? /* 構(gòu)造動態(tài)SQL語句 */
??? String sql = "DELETE FROM subject WHERE subject=?";
??? /* 使用try ... catch語句抓取并拋出例外 */
??? try {
????? /* 準備動態(tài)SQL語句 */
????? PreparedStatement pstmt = conn.prepareStatement(sql);
????? /* 設置動態(tài)SQL參數(shù)值 */
????? pstmt.setString(1, subject);
????? /* 執(zhí)行動態(tài)SQL語句 */
????? pstmt.executeUpdate();
????? /* 關閉動態(tài)SQL語句 */
????? pstmt.close();
??? } catch (SQLException e) {}
? }
?
? public static void update_subject(String old_subject,String new_subject)
? throws SQLException {
?
??? /* 建立到數(shù)據(jù)庫的缺省連接 */
??? Connection conn = new OracleDriver().defaultConnection();
??? /* 構(gòu)造動態(tài)SQL語句 */
??? String sql = "UPDATE subject SET subject=? WHERE subject=?";
??? /* 使用try ... catch語句抓取并拋出例外 */
??? try {
????? /* 準備動態(tài)SQL語句 */
????? PreparedStatement pstmt = conn.prepareStatement(sql);
????? /* 設置動態(tài)SQL參數(shù)值 */
????? pstmt.setString(1, new_subject);
????? pstmt.setString(2, old_subject);
????? /* 執(zhí)行動態(tài)SQL語句 */
????? pstmt.executeUpdate();
????? /* 關閉動態(tài)SQL語句 */
????? pstmt.close();
??? } catch (SQLException e) {}
? }
}
?
2.???????? 裝載Java代碼及類到Oracle8i數(shù)據(jù)庫中
?
在編寫了Java源代碼之后,就可以將Java對象裝載到Oracle8i數(shù)據(jù)庫中了。下面是完成這項任務的方法:
?
?
3.???????? 發(fā)行Java,生成調(diào)用說明
?
在裝載了Java類后,就可以發(fā)行該Java類,并生成調(diào)用其方法的包了。下面是完成該項任務的方法:
4.???????? 調(diào)用JSP
?
在生成了調(diào)用Java方法的包后,就可以調(diào)用這些方法所對應的函數(shù)和過程了。例如:
?
使用Java開發(fā)觸發(fā)器
觸發(fā)器是一段存儲程序,當執(zhí)行特定修改操作時,會觸發(fā)它,并執(zhí)行其中的存儲程序。下面以記載表AUTHS作者工資更新情況的觸發(fā)器為例,說明使用Java開發(fā)觸發(fā)器的方法。如下圖所示:
?
?
下面講述完成上述任務的方法和過程。
?
1.???????? 編寫Java源代碼
?
程序清單如下(trigger.java):
?
/* 導入Java類 */
import java.sql.*;
import java.io.*;
import oracle.jdbc.driver.*;
/* 主類 */
public class trigger {
?
? public static void log_salary(String name,float old_sal,float new_sal)
? throws SQLException {
?
??? /* 建立到數(shù)據(jù)庫的缺省連接 */
??? Connection conn = new OracleDriver().defaultConnection();
??? String sql = "INSERT INTO salary_audit VALUES(?,?,?)";
?
??? /* 使用try ... catch語句抓取并拋出例外 */
??? try {
????? PreparedStatement pstmt = conn.prepareStatement(sql);
????? pstmt.setString(1, name);
????? pstmt.setFloat(2, old_sal);
????? pstmt.setFloat(3, new_sal);
????? pstmt.executeUpdate();
????? pstmt.close();
??? } catch (SQLException e) {}
? }
}
?
2.???????? 裝載Java代碼及類到Oracle8i數(shù)據(jù)庫中
?
在編寫了Java源代碼之后,就可以將Java對象裝載到Oracle8i數(shù)據(jù)庫中了。下面是完成這項任務的方法:
?
3.???????? 發(fā)行Java,生成調(diào)用說明
?
在裝載了Java類后,就可以發(fā)行該Java類,并生成調(diào)用其方法的過程說明及觸發(fā)器了。下面是完成該項任務的方法:
?
4.???????? 調(diào)用JSP
?
在創(chuàng)建了觸發(fā)器之后,當修改作者工資時會自動調(diào)用其中的存儲程序。例如:
?
使用Java開發(fā)對象方法
對象類型是一種用戶自定義的數(shù)據(jù)結(jié)構(gòu),它可以將數(shù)據(jù)類型、函數(shù)以及過程封裝到該數(shù)據(jù)結(jié)構(gòu)中。對象方法是指對象類型中的函數(shù)和過程,本節(jié)將以獲取和增加對象工資信息為例,說明使用Java開發(fā)對象方法的方法。如下圖所示:
?
下面講述完成上述任務的方法及過程:
?
1.???????? 編寫Java源代碼
?
程序清單如下(object_type.java):
?
/* 導入Java類 */
import java.sql.*;
import java.io.*;
import oracle.sql.*;
import oracle.jdbc.driver.*;
import oracle.oracore.*;
import oracle.jdbc2.*;
import java.math.*;
?
/* 主類,實現(xiàn)了SQLData接口 */
public class object_type implements SQLData {
?
? /* 聲明private變量,它們對應于對象類型的屬性 */
? private String code;
? private String name;
? private BigDecimal sex;
? private BigDecimal salary;
?
? /* 方法get_name():對象類型的方法,用于獲取對象姓名 */
? public String get_name() {
??? return name;
? }
?
? /* 方法get_salary():對象類型的方法,用于獲取對象工資 */
? public BigDecimal get_salary() {
??? BigDecimal sal = salary;
??? return sal;
? }
? /* 方法raise_salary():對象類型的方法,用于增加對象工資 */
? public void raise_salary(BigDecimal raise) {
??? salary = salary.add(raise);
? }
?
? /* 以下程序段實現(xiàn)了接口SQLData */
? String sql_type;
? public String getSQLTypeName() throws SQLException {
??? return sql_type;
? }
?
? public void readSQL(SQLInput stream, String typeName) throws SQLException {
??? sql_type = typeName;
??? code = stream.readString();
??? name = stream.readString();
??? sex = stream.readBigDecimal();
??? salary = stream.readBigDecimal();
??}
?
? public void writeSQL(SQLOutput stream) throws SQLException {
??? stream.writeString(code);
??? stream.writeString(name);
??? stream.writeBigDecimal(sex);
??? stream.writeBigDecimal(salary);
? }
}
?
2.???????? 裝載Java代碼及類到Oracle8i數(shù)據(jù)庫中
?
在編寫了Java源代碼之后,就可以將Java對象裝載到Oracle8i數(shù)據(jù)庫中了。下面是完成這項任務的方法:
?
?
3.???????? 發(fā)行Java,生成調(diào)用說明
?
在裝載了Java類后,就可以發(fā)行該Java類,并生成調(diào)用其方法的相應對象方法了。下面是完成該項任務的方法:
?
?
4.???????? 調(diào)用JSP
?
在創(chuàng)建了對象類型及對象方法之后,就可以調(diào)用這些對象方法了。例如:
?
使用JDeveloper開發(fā)JSP
本節(jié)以創(chuàng)建用于操縱ARTICLE表的JSP為例,說明使用JDeveloper 2.0開發(fā)JSP的方法。如下圖所示:
這里只簡單介紹使用JDeveloper開發(fā)JSP的過程和步驟,而關于如何使用JDeveloper請讀者參見相關手冊。
?
1.???????? 準備工作
?
1)??????? 選擇“File—> New Workspace”,創(chuàng)建名稱為jsp.jws的工作組。如下圖所示:
?
?
2)??????? 選擇“File—>New Project”,此時會啟動新項目創(chuàng)建向?qū)?,并顯示如下對話框:
?
?
3)??????? 選中“Create an <Empty Project>”,然后單擊“Next”,此時會顯示如下對話框:
?
4)??????? 如上圖所示,在“Project Name”框中鍵入“article”,項目路徑框中鍵入“d:\jsp”,然后單擊“Next”,此時會顯示如下對話框:
?
?
5)??????? 在上圖的對話框中鍵入你所需要的信息,然后單擊“Next”,此時會顯示如下對話框:
?
?
6)??????? 單擊“Finish”,完成項目的創(chuàng)建過程,此時的圖形界面如下:
?
?
2.???????? 編寫Java源代碼
?
在完成了準備工作之后,我們就可以編寫Java源代碼了。步驟如下:
?
1)??????? 選擇“File—>New”,此時會彈出如下對話框:
?
?
2)??????? 如上圖所示,選中“Class”,然后單擊“OK”,此時會彈出如下對話框:
?
?
3)??????? 如上圖所示,在“Class Name”框中鍵入“article”,選中“Style”中的“Public”,然后單擊“OK”,此時會增加名稱為“article.java”的節(jié)點。如下圖所示:
?
?
4)??????? 雙擊“article.java”節(jié)點,會顯示編輯工作區(qū)。如下圖所示:
?
?
5)??????? 然后,在編輯工作區(qū)中編寫如下的Java源代碼(article.java):
?
/* 導入Java類 */
import java.sql.*;
import java.io.*;
import oracle.jdbc.driver.*;
?
/* 主類 */
public class article {
?
? public static String query_article(String code)
? throws SQLException {
??? /* 建立到數(shù)據(jù)庫的缺省連接 */
??? Connection conn = new OracleDriver().defaultConnection();
??? /* 構(gòu)造動態(tài)SQL語句*/
??? String sql = "SELECT author_code,title FROM article " +
????????????????? "WHERE article_code = ?";
??? /* 聲明String變量article_info,該變量將用于存儲文章信息 */
??? String article_info = new String();
?
??? /* 使用try ... catch語句抓取并拋出例外 */
??? try {
????? /* 準備動態(tài)SQL語句 */
????? PreparedStatement pstmt = conn.prepareStatement(sql);
????? /* 設置動態(tài)SQL參數(shù)值 */
????? pstmt.setString(1, code);
????? ResultSet rset = pstmt.executeQuery();
????? /* 循環(huán)獲取并處理結(jié)果 */
????? while(rset.next()) {
??????? article_info = "作者代碼:? " + rset.getString(1) + "\n";
??????? article_info = article_info + "文章標題:? " +
????????????????????????? rset.getString(2);
????? }
????? /* 關閉結(jié)果集 */
????? rset.close();
????? /* 關閉動態(tài)SQL語句 */
????? pstmt.close();
??? } catch (SQLException e) {}
??? return article_info;
? }
?
? public static void insert_article(String article_code,
????? String author_code,String secrate_level,String pub_date)
? throws SQLException {
??? /* 建立到數(shù)據(jù)庫的缺省連接 */
??? Connection conn = new OracleDriver().defaultConnection();
??? /* 構(gòu)造動態(tài)SQL語句 */
??? String sql = "INSERT INTO article (article_code,author_code," +
??????????????????? "secrate_level,pub_date) VALUES (?,?,?,?)";
??? /* 使用try ... catch語句抓取并拋出例外 */
??? try {
????? /* 準備動態(tài)SQL語句 */
????? PreparedStatement pstmt = conn.prepareStatement(sql);
????? /* 設置動態(tài)SQL參數(shù)值 */
????? pstmt.setString(1, article_code);
????? pstmt.setString(2, author_code);
????? pstmt.setString(3, secrate_level);
????? pstmt.setString(4, pub_date);
????? pstmt.executeUpdate();
????? /* 關閉動態(tài)SQL語句 */
????? pstmt.close();
??? } catch (SQLException e) {}
? }
?
? public static void delete_article (String code)
? throws SQLException {
??? /* 建立到數(shù)據(jù)庫的缺省連接 */
??? Connection conn = new OracleDriver().defaultConnection();
??? /* 構(gòu)造SQL語句 */
??? String sql = "DELETE FROM article? WHERE article_code = ?";
??? /* 使用try ... catch語句抓取并拋出例外 */
??? try {
????? /* 準備動態(tài)SQL語句 */
????? PreparedStatement pstmt = conn.prepareStatement(sql);
????? /* 設置動態(tài)SQL參數(shù)值 */
????? pstmt.setString(1, code);
????? pstmt.executeUpdate();
????? /* 關閉動態(tài)SQL語句 */
?? ???pstmt.close();
??? } catch (SQLException e) {}
? }
?
? public static void update_article (String code,String secrate_level)
? throws SQLException {
??? /* 建立到數(shù)據(jù)庫的缺省連接 */
??? Connection conn = new OracleDriver().defaultConnection();
??? /* 構(gòu)造動態(tài)SQL語句 */
? ??String sql = "UPDATE article SET secrate_level = ?" +
????????????????? " WHERE article_code = ?";
??? /* 使用try ... catch語句抓取并拋出例外 */
??? try {
????? /* 準備動態(tài)SQL語句 */
????? PreparedStatement pstmt = conn.prepareStatement(sql);
????? /* 設置動態(tài)SQL參數(shù)值 */
???? ?pstmt.setString(1, secrate_level);
????? pstmt.setString(2, code);
????? pstmt.executeUpdate();
????? /* 關閉動態(tài)SQL語句 */
????? pstmt.close();
??? } catch (SQLException e) {}
? }
}
?
3.???????? 配置并發(fā)行JSP
?
步驟如下:
?
1)??????? 選擇“Project—>Deploy—>New Profile”,此時會彈出如下對話框:
?
?
2)??????? 如上圖所示,選中“Deploy Java Classes and Stored Procedure to Oracle8i”,然后單擊“Next”,此時會彈出如下對話框:
?
?
3)??????? 單擊“Next”,此時會彈出如下對話框:
?
?
4)??????? 單擊“Next”,此時會顯示如下對話框:
?
?
5)??????? 單擊“Next”,此時會顯示如下對話框:
?
?
6)??????? 清除“Default Database Package”框,然后單擊“Next”,此時會顯示如下對話框:
?
?
7)??????? 單擊“New”創(chuàng)建數(shù)據(jù)庫連接,此時會彈出如下對話框:
?
?
該對話框用于配置數(shù)據(jù)庫連接信息,按照你的數(shù)據(jù)庫設置來配置相應參數(shù)。完成數(shù)據(jù)庫連接的配置后,單擊“Test Connection”測試配置是否正確。如果配置不正確,則修改配置參數(shù)。
?
8)??????? 單擊“OK”,此時會彈出如下對話框:
?
?
在該對話框中顯示了相應的數(shù)據(jù)庫連接信息。
?
9)??????? 單擊“Next”,此時會彈出如下對話框:
?
?
10)???? 單擊“Finish”,此時會彈出如下對話框:
?
?
11)???? 單擊“No”退出配置,然后在主窗口中選中配置文件“Profile1.prf”,單擊鼠標右鍵,此時會顯示如下彈出菜單:
?
?
12)???? 從彈出菜單中選擇“Properties”,此時會顯示如下對話框:
?
?
13)???? 選擇“Methods”頁,此時的對話框如下所示:
?
?
14)???? 如上圖所示,選中Publish下的所有單選框,然后單擊“Done”,此時會顯示如下對話框:
?
?
15)???? 單擊“Yes”,會開始配置和發(fā)行JSP,并最終顯示如下界面:
?
?
16)???? 單擊“Done”,此時會顯示如下信息框:
?
?
17)???? 單擊“OK”,這樣我們就完成了配置和發(fā)行JSP的全部過程了。然后,我們就可以調(diào)用JSP完成相應任務了。
?
4.???????? 調(diào)用JSP
?
在創(chuàng)建了基于Java的函數(shù)和過程之后,就可以調(diào)用這些函數(shù)和過程了。方法如下:
?
posted on 2006-08-16 15:18
黑咖啡 閱讀(314)
評論(0) 編輯 收藏 所屬分類:
Tec Article