激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - 詳解Java的JDBC API的存儲過程與SQL轉(zhuǎn)義語法的使用

詳解Java的JDBC API的存儲過程與SQL轉(zhuǎn)義語法的使用

2020-03-19 13:02goldensun JAVA教程

這篇文章主要介紹了詳解Java的JDBC API的存儲過程與SQL轉(zhuǎn)義語法的使用,JDBC是Java用于連接使用各種數(shù)據(jù)庫的API,需要的朋友可以參考下

正如一個Connection對象創(chuàng)建Statement和PreparedStatement對象,它也創(chuàng)造了CallableStatement對象這將被用來執(zhí)行調(diào)用數(shù)據(jù)庫存儲過程。

創(chuàng)建CallableStatement對象:
假設(shè),需要執(zhí)行以下Oracle存儲過程:

?
1
2
3
4
5
6
7
CREATE OR REPLACE PROCEDURE getEmpName
  (EMP_ID IN NUMBER, EMP_FIRST OUT VARCHAR) AS
BEGIN
  SELECT first INTO EMP_FIRST
  FROM Employees
  WHERE ID = EMP_ID;
END;

注意: 上面已經(jīng)寫過Oracle存儲過程,但我們正在使用MySQL數(shù)據(jù)庫,寫相同的存儲過程對于MySQL如下,以EMP數(shù)據(jù)庫中創(chuàng)建它:

?
1
2
3
4
5
6
7
8
9
10
11
12
DELIMITER $$
 
DROP PROCEDURE IF EXISTS `EMP`.`getEmpName` $$
CREATE PROCEDURE `EMP`.`getEmpName`
  (IN EMP_ID INT, OUT EMP_FIRST VARCHAR(255))
BEGIN
  SELECT first INTO EMP_FIRST
  FROM Employees
  WHERE ID = EMP_ID;
END $$
 
DELIMITER ;

三種類型的參數(shù)有:IN,OUT和INOUT。PreparedStatement對象只使用IN參數(shù)。 CallableStatement對象可以使用所有的三個。

這里是每個定義:

  • IN:它的值是在創(chuàng)建SQL語句時未知的參數(shù)。將值綁定到setXXX()方法的參數(shù)。
  • OUT:其值是由它返回的SQL語句提供的參數(shù)。你從OUT參數(shù)的getXXX()方法檢索值。
  • INOUT:同時提供輸入和輸出值的參數(shù)。綁定setXXX()方法的變量,并與getXXX()方法檢索值。

下面的代碼片段顯示了如何使用該Connection.prepareCall()方法實例化基于上述存儲過程CallableStatement對象:

?
1
2
3
4
5
6
7
8
9
10
11
12
CallableStatement cstmt = null;
try {
  String SQL = "{call getEmpName (?, ?)}";
  cstmt = conn.prepareCall (SQL);
  . . .
}
catch (SQLException e) {
  . . .
}
finally {
  . . .
}

String變量的SQL表示存儲過程,使用參數(shù)占位符。

使用CallableStatement對象是使用PreparedStatement對象。必須將值綁定到所有的參數(shù)執(zhí)行該語句之前,否則將收到一個SQLException。

如果有IN參數(shù),只要按照適用于PreparedStatement對象相同的規(guī)則和技巧;使用對應(yīng)于要綁定Java數(shù)據(jù)類型的setXXX()方法。

當(dāng)使用OUT和INOUT參數(shù)就必須采用額外CallableStatement方法的registerOutParameter()。registerOutParameter()方法JDBC數(shù)據(jù)類型綁定到數(shù)據(jù)類型的存儲過程返回。

一旦調(diào)用存儲過程,用getXXX()方法的輸出參數(shù)檢索值。這種方法投射SQL類型的值檢索到Java數(shù)據(jù)類型。

關(guān)閉CallableStatement 對象:
正如關(guān)閉其他Statement對象,出于同樣的原因,也應(yīng)該關(guān)閉CallableStatement對象。

close()方法簡單的調(diào)用將完成這項工作。如果關(guān)閉了Connection對象首先它會關(guān)閉CallableStatement對象為好。然而,應(yīng)該始終明確關(guān)閉的CallableStatement對象,以確保正確的清除。

?
1
2
3
4
5
6
7
8
9
10
11
12
CallableStatement cstmt = null;
try {
  String SQL = "{call getEmpName (?, ?)}";
  cstmt = conn.prepareCall (SQL);
  . . .
}
catch (SQLException e) {
  . . .
}
finally {
  cstmt.close();
}

PS:CallableStatement對象實例
下面是利用CallableStatement連同下列g(shù)etEmpName()的MySQL存儲過程的例子:

請確定已經(jīng)在EMP數(shù)據(jù)庫中創(chuàng)建該存儲過程。可以使用MySQL查詢?yōu)g覽器來完成它。

?
1
2
3
4
5
6
7
8
9
10
11
12
DELIMITER $$
 
DROP PROCEDURE IF EXISTS `EMP`.`getEmpName` $$
CREATE PROCEDURE `EMP`.`getEmpName`
  (IN EMP_ID INT, OUT EMP_FIRST VARCHAR(255))
BEGIN
  SELECT first INTO EMP_FIRST
  FROM Employees
  WHERE ID = EMP_ID;
END $$
 
DELIMITER ;

基于對環(huán)境和數(shù)據(jù)庫安裝在前面的章節(jié)中進行,這個范例程式碼已被寫入。

復(fù)制下面的例子中JDBCExample.java,編譯并運行,如下所示:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
//STEP 1. Import required packages
import java.sql.*;
 
public class JDBCExample {
  // JDBC driver name and database URL
  static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
  static final String DB_URL = "jdbc:mysql://localhost/EMP";
 
  // Database credentials
  static final String USER = "username";
  static final String PASS = "password";
  
  public static void main(String[] args) {
  Connection conn = null;
  CallableStatement stmt = null;
  try{
   //STEP 2: Register JDBC driver
   Class.forName("com.mysql.jdbc.Driver");
 
   //STEP 3: Open a connection
   System.out.println("Connecting to database...");
   conn = DriverManager.getConnection(DB_URL,USER,PASS);
 
   //STEP 4: Execute a query
   System.out.println("Creating statement...");
   String sql = "{call getEmpName (?, ?)}";
   stmt = conn.prepareCall(sql);
   
   //Bind IN parameter first, then bind OUT parameter
   int empID = 102;
   stmt.setInt(1, empID); // This would set ID as 102
   // Because second parameter is OUT so register it
   stmt.registerOutParameter(2, java.sql.Types.VARCHAR);
   
   //Use execute method to run stored procedure.
   System.out.println("Executing stored procedure..." );
   stmt.execute();
 
   //Retrieve employee name with getXXX method
   String empName = stmt.getString(2);
   System.out.println("Emp Name with ID:" +
        empID + " is " + empName);
   stmt.close();
   conn.close();
  }catch(SQLException se){
   //Handle errors for JDBC
   se.printStackTrace();
  }catch(Exception e){
   //Handle errors for Class.forName
   e.printStackTrace();
  }finally{
   //finally block used to close resources
   try{
     if(stmt!=null)
      stmt.close();
   }catch(SQLException se2){
   }// nothing we can do
   try{
     if(conn!=null)
      conn.close();
   }catch(SQLException se){
     se.printStackTrace();
   }//end finally try
  }//end try
  System.out.println("Goodbye!");
}//end main
}//end JDBCExample

現(xiàn)在編譯上面的例子如下:

?
1
C:>javac JDBCExample.java

當(dāng)運行JDBCExample,它會產(chǎn)生以下結(jié)果:

?
1
C:>java JDBCExample
?
1
2
3
4
5
Connecting to database...
Creating statement...
Executing stored procedure...
Emp Name with ID:102 is Zaid
Goodbye!

JDBC的SQL轉(zhuǎn)義語法:
轉(zhuǎn)義語法使能夠使用通過使用標(biāo)準(zhǔn)的JDBC方法和屬性,無法使用數(shù)據(jù)庫的某些特性的靈活性。

一般的SQL轉(zhuǎn)義語法格式如下:

?
1
{keyword 'parameters'}

這里有以下這些,會發(fā)現(xiàn)非常有用的,而這樣做的JDBC編程的轉(zhuǎn)義序列:

d, t, ts 關(guān)鍵字:
他們幫助確定日期,時間和時間戳記文字。如所知,沒有兩個數(shù)據(jù)庫管理系統(tǒng)是基于時間和日期的方式相同。此轉(zhuǎn)義語法告訴驅(qū)動程序呈現(xiàn)在目標(biāo)數(shù)據(jù)庫的格式,日期或時間。實現(xiàn)例子:

?
1
{d 'yyyy-mm-dd'}

其中yyyy=年,mm =月,DD =日。使用這種語法 {d '2009-09-03'}是2009年3月9日。

下面是一個簡單的例子說明如何插入日期表:

?
1
2
3
4
5
6
7
//Create a Statement object
stmt = conn.createStatement();
//Insert data ==> ID, First Name, Last Name, DOB
String sql="INSERT INTO STUDENTS VALUES" +
       "(100,'Zara','Ali', {d '2001-12-16'})";
 
stmt.executeUpdate(sql);

同樣,可以使用以下兩種語法之一,無論是 t 或 ts:

?
1
{t 'hh:mm:ss'}

其中hh=小時,mm=分,ss=秒。使用此語法 {t '13:30:29'}是下午1點三十分29秒.

?
1
{ts 'yyyy-mm-dd hh:mm:ss'}

這是上述兩種語法 'd' 和  't' 來表示時間戳結(jié)合語法。

escape 關(guān)鍵字:
該關(guān)鍵字標(biāo)識LIKE子句中使用的轉(zhuǎn)義字符。有用使用SQL通配符%,其中匹配零個或多個字符時。例如:

?
1
2
3
String sql = "SELECT symbol FROM MathSymbols
       WHERE symbol LIKE '\%' {escape ''}";
stmt.execute(sql);

如果使用反斜杠字符()作為轉(zhuǎn)義字符,還必須使用兩個反斜杠字符在Java字符串字面,因為反斜杠也是一個Java轉(zhuǎn)義字符。

fn 關(guān)鍵字:
此關(guān)鍵字代表在DBMS中使用標(biāo)量函數(shù)。例如,可以使用SQL length函數(shù)計算GE字符串的長度:

?
1
{fn length('Hello World')}

這將返回11,字符串 'Hello World'的長度。.

call 關(guān)鍵字:
此關(guān)鍵字是用來調(diào)用存儲過程。例如,對于一個存儲過程,需要一個IN參數(shù),請使用以下語法:

?
1
{call my_procedure(?)};

對于一個存儲過程,需要一個IN參數(shù)并返回一個OUT參數(shù),使用下面的語法:

?
1
{? = call my_procedure(?)};

oj 關(guān)鍵字:
此關(guān)鍵字用來表示外部聯(lián)接。其語法如下:

?
1
{oj outer-join}

外連接表={LEFT| RIGHT| FULL}外連接{表|外連接}的搜索條件。例如:

?
1
2
3
4
String sql = "SELECT Employees
       FROM {oj ThisTable RIGHT
       OUTER JOIN ThatTable on id = '100'}";
stmt.execute(sql);

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91在线视频播放 | 成人羞羞在线观看网站 | 手机国产乱子伦精品视频 | 男女一边摸一边做羞羞视频免费 | 久久99国产精品免费网站 | chinese hd xxxx tube | 欧美专区视频 | 国产精品久久久久久久成人午夜 | 狠狠干91| 国产精品久久久久久久久久尿 | 久久艹综合 | 欧美巨乳在线观看 | 黄色免费大片 | 91精品国产网站 | 成人永久免费 | 欧美一级特黄aaaaaaa什 | 中文字幕视频在线播放 | 国产精品久久77777 | 夜添久久精品亚洲国产精品 | 久久亚洲精品国产 | 精品久久久久久综合日本 | 欧美日本亚洲视频 | 黄色高清免费 | 国产在线观看91一区二区三区 | 国产欧美日韩久久久 | 精品一区二区久久久久久按摩 | 法国性xxx精品hd | 12av电影 | 欧美黑人伦理 | 欧美成人免费 | 精品国产一区二区三区久久久蜜月 | 国产一级在线观看视频 | 天天草天天干天天 | 今井夏帆av一区二区 | 国产精品自拍99 | h色网站免费观看 | 爱逼爱操综合网 | 网站激情 | 久久久久国产精品久久久久 | 亚洲国产成人久久成人52 | 一本大道av |