精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

JDBC調用存儲過程詳解

開發 后端
本文向您介紹JDBC調用存儲過程的方法,包括如何使用存儲過程,結合SQL操作存儲過程等JDBC調用存儲過程的必備知識。

存儲過程是指保存在數據庫并在數據庫端執行的程序。你可以使用特殊的語法在Java類中通過JDBC調用存儲過程。在調用時,存儲過程的名稱及指定的參數通過JDBC連接發送給DBMS,執行存儲過程并通過連接(如果有)返回結果。

使用存儲過程擁有和使用基于EJB或CORBA這樣的應用服務器一樣的好處。區別是存儲過程可以從很多流行的DBMS中免費使用,而應用服務器大都非常昂貴。這并不只是許可證費用的問題。使用應用服務器所需要花費的管理、編寫代碼的費用,以及客戶程序所增加的復雜性,都可以通過DBMS中的存儲過程所整個地替代。

你可以使用Java,Python,Perl或C編寫存儲過程,但是通常使用你的DBMS所指定的特定語言。Oracle使用PL/SQL,PostgreSQL使用pl/pgsql,DB2使用Procedural SQL。這些語言都非常相似。在它們之間移植存儲過程并不比在Sun的EJB規范不同實現版本之間移植Session Bean困難。并且,存儲過程是為嵌入SQL所設計,這使得它們比Java或C等語言更加友好地方式表達數據庫的機制。

因為存儲過程運行在DBMS自身,這可以幫助減少應用程序中的等待時間。不是在Java代碼中執行4個或5個SQL語句,而只需要在服務器端執行1個存儲過程。網絡上的數據往返次數的減少可以戲劇性地優化性能。

使用存儲過程

簡單的老的JDBC通過CallableStatement類支持存儲過程的調用。該類實際上是PreparedStatement的一個子類。假設我們有一個poets數據庫。數據庫中有一個設置詩人逝世年齡的存儲過程。下面是對老酒鬼Dylan Thomas(old soak Dylan Thomas,不指定是否有關典故、文化,請批評指正。譯注)進行調用的詳細代碼:

  1. try{  
  2.  
  3.      int age = 39;   
  4.  
  5.     String poetName = "dylan thomas";   
  6.  
  7.     CallableStatement proc = connection.prepareCall("{ call set_death_age(?, ?) }");   
  8.  
  9.     proc.setString(1, poetName);   
  10.  
  11.     proc.setInt(2, age);   
  12.  
  13.     cs.execute();  
  14.  
  15. }catch (SQLException e){ // ....}  

傳給prepareCall方法的字串是存儲過程調用的書寫規范。它指定了存儲過程的名稱,代表了你需要指定的參數。

和JDBC集成是存儲過程的一個很大的便利:為了從應用中通過JDBC調用存儲過程,不需要存根(stub)類或者配置文件,除了你的DBMS的JDBC驅動程序外什么也不需要。

當這段代碼執行時,數據庫的存儲過程就被調用。我們沒有去獲取結果,因為該存儲過程并不返回結果。執行成功或失敗將通過例外得知。失敗可能意味著調用存儲過程時的失敗(比如提供的一個參數的類型不正確),或者一個應用程序的失敗(比如拋出一個例外指示在poets數據庫中并不存在“Dylan Thomas”)

結合SQL操作與存儲過程

映射Java對象到SQL表中的行相當簡單,但是通常需要執行幾個SQL語句;可能是一個SELECT查找ID,然后一個INSERT插入指定ID的數據。在高度規格化(符合更高的范式,譯注)的數據庫模式中,可能需要多個表的更新,因此需要更多的語句。Java代碼會很快地膨脹,每一個語句的網絡開銷也迅速增加。

將這些SQL語句轉移到一個存儲過程中將大大簡化代碼,僅涉及一次網絡調用。所有關聯的SQL操作都可以在數據庫內部發生。并且,存儲過程語言,例如PL/SQL,允許使用SQL語法,這比Java代碼更加自然。下面是我們早期的存儲過程,使用Oracle的PL/SQL語言編寫:

  1. create procedure set_death_age(poet VARCHAR2, poet_age NUMBER)   
  2.  
  3.     poet_id NUMBER;  
  4.  
  5.     begin SELECT id INTO poet_id FROM poets WHERE name = poet;   
  6.  
  7.     INSERT INTO deaths (mort_id, age) VALUES (poet_id, poet_age);  
  8.  
  9. end set_death_age;   
  10.  

很獨特?不。我打賭你一定期待看到一個poets表上的UPDATE。這也暗示了使用存儲過程實現是多么容易的一件事情。set_death_age幾乎可以肯定是一個很爛的實現。我們應該在poets表中添加一列來存儲逝世年齡。Java代碼中并不關心數據庫模式是怎么實現的,因為它僅調用存儲過程。我們以后可以改變數據庫模式以提高性能,但是我們不必修改我們代碼。

下面是調用上面存儲過程的Java代碼:

  1. public static void setDeathAge(Poet dyingBard, int age) throws SQLException{   
  2.  
  3.     Connection con = null;   
  4.  
  5.     CallableStatement proc = null;   
  6.  
  7.     try {  
  8.  
  9.          con = connectionPool.getConnection();   
  10.  
  11.          proc = con.prepareCall("{ call set_death_age(?, ?) }");  
  12.  
  13.          proc.setString(1, dyingBard.getName());   
  14.  
  15.           proc.setInt(2, age);   
  16.  
  17.           proc.execute();   
  18.  
  19. }   
  20.  
  21.    finally {    
  22.  
  23.          try { proc.close(); }   
  24.  
  25.          catch (SQLException e) {}    
  26.  
  27.           con.close();   
  28.  
  29.    }  
  30.  
  31. }  

為了確保可維護性,建議使用像這兒這樣的static方法。這也使得JDBC調用存儲過程的代碼集中在一個簡單的模版代碼中。如果你用到許多存儲過程,就會發現僅需要拷貝、粘貼就可以創建新的方法。因為代碼的模版化,甚至也可以通過腳本自動生產調用存儲過程的代碼。

Functions

存儲過程可以有返回值,所以CallableStatement類有類似getResultSet這樣的方法來獲取返回值。當存儲過程返回一個值時,你必須使用registerOutParameter方法告訴JDBC驅動器該值的SQL類型是什么。你也必須調整存儲過程調用來指示該過程返回一個值。

下面接著上面的例子。這次我們查詢Dylan Thomas逝世時的年齡。這次的存儲過程使用PostgreSQL的pl/pgsql:

  1. create function snuffed_it_when (VARCHARreturns integer 'declare   
  2.  
  3.                poet_id NUMBER;   
  4.  
  5.                poet_age NUMBER;  
  6.  
  7. begin   
  8.  
  9. --first get the id associated with the poet.   
  10.  
  11.              SELECT id INTO poet_id FROM poets WHERE name = $1;  
  12.  
  13.  --get and return the age.   
  14.  
  15.                SELECT age INTO poet_age FROM deaths WHERE mort_id = poet_id;   
  16.  
  17. return age;  
  18.  
  19. end;' language 'pl/pgsql';  

另外,注意pl/pgsql參數名通過Unix和DOS腳本的$n語法引用。同時,也注意嵌入的注釋,這是和Java代碼相比的另一個優越性。在Java中寫這樣的注釋當然是可以的,但是看起來很凌亂,并且和SQL語句脫節,必須嵌入到Java String中。

下面是調用這個存儲過程的Java代碼:

  1. connection.setAutoCommit(false);  
  2.  
  3. CallableStatement proc = connection.prepareCall("{ ? = call snuffed_it_when(?) }");  
  4.  
  5. proc.registerOutParameter(1, Types.INTEGER);  
  6.  
  7. proc.setString(2, poetName);  
  8.  
  9. cs.execute();  
  10.  
  11. int age = proc.getInt(2);  

如果指定了錯誤的返回值類型會怎樣?那么,當JDBC調用存儲過程時將拋出一個RuntimeException,正如你在ResultSet操作中使用了一個錯誤的類型所碰到的一樣。

并不是所有的數據庫都支持存儲過程,但是存在許多很棒的實現,包括免費/開源的和非免費的,所以移植并不是一個問題。Oracle、PostgreSQL和DB2都有類似的存儲過程語言,并且有在線的社區很好地支持。

存儲過程工具很多,有像TOAD或TORA這樣的編輯器、調試器和IDE,提供了編寫、維護PL/SQL或pl/pgsql的強大的環境。

存儲過程確實增加了你的代碼的開銷,但是它們和大多數的應用服務器相比,開銷小得多。如果你的代碼復雜到需要使用DBMS,我建議整個采用存儲過程的方式。

 

【編輯推薦】

  1. 使用JDBC連接SQL Server數據庫
  2. 八大技巧精通JDBC連接Oracle數據庫
  3. JSP環境搭建之MySQL、JDBC的安裝與測試系統
  4. JDBC與Hibernate讀取性能分析
  5. 揭密JDBC驅動程序
責任編輯:佚名 來源: CSDN
相關推薦

2009-07-22 15:58:34

JDBC調用Oracl

2009-06-22 11:04:00

Jdbc存儲過程

2011-08-23 10:14:09

JDBC更新計數行調用存儲過程SQL Server

2009-07-17 13:54:51

JDBC存儲過程

2011-08-25 11:36:50

PreparedStaJDBC存儲過程調用

2012-05-10 11:17:23

JavaSQL Server

2011-08-23 13:14:05

JDBC帶輸出參數的存儲過程

2009-07-21 14:57:41

iBatis中調用存儲iBatis

2020-11-26 10:33:44

MySQL存儲函數

2021-10-15 06:43:11

數據庫存儲過程

2011-08-25 09:31:43

JDBC調用Oracl

2009-07-23 14:10:38

Hibernate J

2009-09-15 11:08:01

LinQ調用存儲過程

2009-06-17 10:33:17

Hibernate 存

2009-06-19 16:22:55

Java存儲過程

2009-09-09 10:54:52

Linq存儲過程返回

2010-11-12 09:46:55

Sql Server存

2011-07-22 13:47:23

存儲過程

2010-10-09 16:26:59

mysql存儲過程

2011-07-19 17:33:53

存儲過程javaibatis
點贊
收藏

51CTO技術棧公眾號

久久青青视频| 男人久久精品| 日韩午夜av| 亚洲欧美日韩久久久久久| 国产超碰在线播放| 国产理论在线观看| 99精品视频在线播放观看| 国产高清视频一区三区| 青娱乐国产在线| 午夜精品影视国产一区在线麻豆| 欧美日韩免费观看一区二区三区 | 免费看av成人| 欧美一区二区三区成人| 北条麻妃在线视频| 天堂av在线电影| 日本一区二区视频在线| 国产高清精品一区二区| 少妇无套内谢久久久久| 影音先锋中文字幕一区| 中文字幕精品网| 99精品一区二区三区无码吞精 | 黑人巨大精品欧美一区二区一视频| 五月天丁香综合久久国产 | 日韩色图在线观看| 亚洲视频电影在线| 亚洲色图偷窥自拍| 麻豆精品国产传媒av| 亚洲网站免费| 在线亚洲一区二区| 日韩欧美亚洲天堂| 在线中文字幕电影| 国产精品第一页第二页第三页 | 国产精品一在线观看| 亚洲精品在线观看网站| 午夜剧场在线免费观看| 久久青青视频| 色综合夜色一区| 国产无限制自拍| 2021国产在线| 亚洲欧美一区二区三区极速播放| 美脚丝袜一区二区三区在线观看| 亚洲国产av一区二区| 国产制服丝袜一区| 国产色婷婷国产综合在线理论片a| 久久久精品福利| 国产一区二区精品| 国语自产精品视频在线看抢先版图片 | 91精品国产毛片武则天| 欧美jizz18性欧美| 国产精品九色蝌蚪自拍| 亚洲激情啪啪| 在线免费观看黄| 国产视频一区在线播放| 欧美极品色图| 久久精品蜜桃| 国产日韩欧美精品电影三级在线 | 欧美精品 - 色网| 精品自拍视频| 制服丝袜中文字幕亚洲| 91精品999| 亚洲成人高清| 欧美一二三四区在线| 黄色片子免费看| 欧美第一在线视频| 精品少妇一区二区三区| 黑森林av导航| 牲欧美videos精品| 一级做a爰片久久毛片美女图片| 久久精品老司机| 精品视频免费| 久久综合九色九九| 久久在线视频精品| 亚洲中字在线| 国产精品高潮在线| 国产一区二区在线播放视频| 国内精品国产三级国产a久久| 亚洲一区二区三区视频| 亚洲成人精品女人久久久| 99综合电影在线视频| 欧美成熟毛茸茸复古| 国产精品视频一区二区久久| 中文字幕亚洲区| 91精品国产吴梦梦| 成年男女免费视频网站不卡| 91精品办公室少妇高潮对白| 中文字幕在线综合| 9l视频自拍蝌蚪9l视频成人| 亚洲国产欧美久久| 亚洲精品国产91| 亚洲一本二本| 青青草精品毛片| 国产一区二区小视频| 99热精品国产| 免费观看黄色的网站| 欧美videosex性欧美黑吊| 日韩欧美第一页| 午夜国产福利在线观看| 国产亚洲精品美女久久| 国产一区二区美女视频| 九九视频免费观看| 日韩成人精品在线观看| 99久久综合狠狠综合久久止 | 66精品视频在线观看| 亚洲欧美日韩国产精品| 欧美特级一级片| 免费久久99精品国产自在现线| 国产日韩欧美日韩| 亚洲av电影一区| 亚洲视频在线一区| 免费黄色特级片| 国产91精品入| 久久综合久久八八| 天天干,天天干| 丁香五精品蜜臀久久久久99网站 | 91精品国产综合久久香蕉922| 三级网站免费观看| 综合久久久久久久| 国产aaaaa毛片| 日韩中出av| 欧美二区在线播放| 国产剧情精品在线| 中文字幕乱码亚洲精品一区| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 亚洲无线观看| 欧美成人黑人xx视频免费观看| 久久久久久无码午夜精品直播| 不卡影院免费观看| 日韩a级黄色片| 日本午夜精品久久久久| 国产亚洲精品91在线| 啦啦啦免费高清视频在线观看| 国产丶欧美丶日本不卡视频| 在线视频精品一区| 国外成人福利视频| 中文字幕在线日韩| 中文字幕 亚洲视频| 国产午夜精品久久久久久免费视| 成人免费观看在线| 亚洲欧美日本国产| 色综合91久久精品中文字幕 | 国产高清精品网站| 永久免费在线看片视频| 欧美97人人模人人爽人人喊视频| 亚洲香蕉成视频在线观看| 69成人免费视频| 91免费视频网| 熟女少妇精品一区二区| 九九免费精品视频在线观看| 欧洲美女免费图片一区| 午夜视频在线免费播放| 午夜精品一区二区三区电影天堂| 中文字幕制服丝袜| 亚洲午夜久久久久久尤物| 91丨九色丨国产| 免费在线看污片| 欧美精品一区二区不卡| 国产无码精品在线播放| av不卡在线播放| 精品人妻一区二区三区四区在线 | 潘金莲一级淫片aaaaa免费看| 日韩大陆av| 久久久久99精品久久久久| 国产一区二区视频免费观看| 亚洲精品写真福利| 欧美xxxx日本和非洲| 最新成人av网站| 久久精品国产一区二区三区不卡| 瑟瑟视频在线看| 亚洲丝袜在线视频| 亚洲在线视频播放| 亚洲欧美自拍偷拍| 国产精久久久久| 欧美中文日韩| 亚洲欧美日韩综合一区| 欧美高清一级片| 97视频在线免费观看| 国产高清免费av在线| 欧美日韩国产综合草草| 希岛爱理中文字幕| 99精品视频在线播放观看| 成人性做爰aaa片免费看不忠| 99成人在线视频| 99一区二区三区| 蜜臀国产一区| 日韩视频欧美视频| 秋霞av鲁丝片一区二区| 欧美中文字幕亚洲一区二区va在线| 我要看一级黄色录像| 成人午夜av电影| 午夜宅男在线视频| 伊人久久大香线蕉av超碰演员| 欧美高清视频一区| 国产精品亚洲综合在线观看 | 99久久综合国产精品| 国产精品igao| 亚洲网站在线| 亚洲欧洲精品一区二区| 老牛影视av一区二区在线观看| 国产精品啪视频| av中文资源在线资源免费观看| 亚洲图片欧美午夜| 亚洲第一天堂在线观看| 欧美午夜一区二区三区免费大片| 精国产品一区二区三区a片| 国产欧美一区二区精品性色| 亚洲 自拍 另类 欧美 丝袜| 日日噜噜夜夜狠狠视频欧美人| 喜爱夜蒲2在线| 欧美精品一区二区久久| 国产精品日韩一区二区三区| 精品三级在线| 国产91九色视频| 波多野结衣在线高清| 久久久91精品国产一区不卡| 欧美视频综合| 亚洲国产欧美在线成人app| 国产精品无码天天爽视频| 色婷婷综合视频在线观看| 久热这里只有精品在线| 亚洲婷婷国产精品电影人久久| 美女洗澡无遮挡| 99久久久久久99| 欧美激情 亚洲| 国产乱码精品一区二区三区忘忧草| 男人透女人免费视频| 一本久久知道综合久久| 青春草国产视频| 中文字幕一区二区av | 极品裸体白嫩激情啪啪国产精品| 中文字幕成人一区| 欧美亚洲精品在线| 日韩福利一区二区三区| 亚洲精品一级二级三级| 九九99玖玖| 美日韩黄色大片| 国产98在线|日韩| 69精品国产久热在线观看| 成人黄色在线免费| 四虎精品在线观看| 国产精品一香蕉国产线看观看 | 欧美精品福利| 一级性生活视频| 国产精品成人一区二区网站软件| 粉嫩av一区二区三区天美传媒 | 国产激情视频在线播放| 欧美二区三区91| 一区不卡在线观看| 欧美精品三级在线观看| 国产精品探花视频| 日韩一级片在线观看| av手机免费看| 精品三级av在线| 欧美特级特黄aaaaaa在线看| 亚洲国产欧美一区二区三区久久| 天天操天天干天天操| 日韩精品中文字幕在线| 噜噜噜在线观看播放视频| 亚洲色无码播放| 免费在线观看黄色| 免费不卡在线观看av| 青草av在线| 91av在线影院| 成人国产精选| 91在线观看免费高清完整版在线观看 | 无吗不卡中文字幕| 尤物视频免费观看| 欧美日韩中文精品| 精品人妻无码一区二区| 亚洲电影天堂av| 国产天堂素人系列在线视频| 俺去啦;欧美日韩| japanese色国产在线看视频| 日本亚洲欧洲色| 日韩成人精品一区二区三区| 97久久天天综合色天天综合色hd | 亚洲香蕉成人av网站在线观看 | 亚洲一区在线观看免费观看电影高清| 精品无码免费视频| 色婷婷综合久色| 99在线观看免费| 日韩精品免费在线| 亚洲欧美视频一区二区| 欧美激情xxxxx| 亚洲伦乱视频| 懂色一区二区三区av片| 国产精品一区二区三区av麻| 蜜臀av性久久久久蜜臀av| 影音先锋日韩资源| jizzzz日本| 99久久久无码国产精品| 男人av资源站| 色视频成人在线观看免| 国产高清在线观看视频| 亚洲欧美在线x视频| a毛片在线播放| 国产激情999| 韩国精品福利一区二区三区| 亚洲欧美99| 国产精品免费看| 久久精品国产99久久99久久久| 99亚偷拍自图区亚洲| 欧美黄色aaa| 在线观看网站黄不卡| 少妇高潮一区二区三区69| 超碰97人人做人人爱少妇| 日韩不卡免费高清视频| 国产精品国产三级欧美二区| 青青草91久久久久久久久| 阿v天堂2017| 国产福利电影一区二区三区| 少妇太紧太爽又黄又硬又爽小说| 亚洲444eee在线观看| 国产日韩欧美一区二区东京热 | 日本欧美一区二区三区不卡视频| 亚洲资源在线观看| 国产乱码一区二区| 中文字幕无线精品亚洲乱码一区 | 一本一道久久a久久精品综合蜜臀| 精品国产18久久久久久| 日韩在线国产精品| 欧美性suv| 久久国产主播精品| 狠狠爱综合网| 久久发布国产伦子伦精品| 国产精品国产三级国产有无不卡 | 久久99久久精品国产| 欧美日韩影院| 韩国三级与黑人| 亚洲日本中文字幕区| 夜夜爽8888| 日韩在线中文字| yiren22亚洲综合| 色播亚洲视频在线观看| 久久久一二三| 亚洲乱码国产乱码精品精大量| 亚洲成a人在线观看| 韩国中文字幕hd久久精品| 欧美国产中文字幕| 色妞ww精品视频7777| www.国产亚洲| 高清shemale亚洲人妖| 欧美日韩在线观看免费| 欧美一二三区在线观看| 羞羞网站在线免费观看| av噜噜色噜噜久久| 亚洲大片在线| 岛国精品资源网站| 欧美日韩国产丝袜另类| 欧美精品a∨在线观看不卡| 欧美中文字幕视频| 国产亚洲一区| 欧美成人福利在线观看| 中文字幕制服丝袜一区二区三区| 97人妻精品一区二区三区视频| 久久精品中文字幕| 日韩国产在线不卡视频| 无码 制服 丝袜 国产 另类| 91视频免费播放| 亚洲中文无码av在线| 久久夜色精品国产| 999国产精品一区| 亚洲国产精品久久久久爰色欲| 久久久久久久久岛国免费| 中文字幕日韩国产| 久久精品色欧美aⅴ一区二区| 国产视频一区二区在线播放| 日本大片免费看| 99re这里只有精品视频首页| 波多野结衣高清视频| 蜜臀久久99精品久久久久久宅男| 国产精品久久久久久久久久白浆| 日本三级免费观看| 国产精品久久精品日日| 人人妻人人澡人人爽人人欧美一区| 欧美在线观看网址综合| 久久精品国产大片免费观看| 91性高潮久久久久久久| 精品电影在线观看| 9色在线视频| 国产91免费视频| 日韩精品一二三四| 欧美精品一区二区蜜桃| 亚洲另类图片色| 国产精品久久久久久久久久久久久久久| 亚洲精品无码国产| 日本一区二区三区免费乱视频| 国产婷婷在线视频| 欧美怡春院一区二区三区| 国产精品99久久久久久动医院| 91视频在线免费| 欧美日韩精品一区二区三区蜜桃| 成人在线免费观看黄色| 深夜福利成人| heyzo一本久久综合| 中文字幕第三页| 91国在线精品国内播放| 亚洲成av人片乱码色午夜| 国产中文字幕一区二区| 7777精品久久久大香线蕉| 成人欧美大片|