存儲過程:
存儲過程是SQL 語句和可選控制流語句的預編譯集合,以一個名稱存儲並作為一個單元處理。存儲過程存儲在數據庫內,可由應用程序通過一個調用執行,而且允許用戶聲明變量、有條件執行以及其它強大的編程功能。存儲過程在創建時即在服務器上進行編譯,所以執行起來比單個SQL語句快。
存儲過程的優缺點:
優點:
1.存儲過程只在創造時進行編譯,以后每次執行存儲過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用存儲過程可提高數據庫執行速度。
2.當對數據庫進行復雜操作時(如對多個表進行Update,Insert,Query,Delete時),可將此復雜操作用存儲過程封裝起來與數據庫提供的事務處理結合一起使用。
3.存儲過程可以重復使用,可減少數據庫開發人員的工作量
4.安全性高,可設定只有某此用戶才具有對指定存儲過程的使用權
缺點:
1. 運行速度: 大多數高級的數據庫系統都有statement cache的,所以編譯sql的花費沒什么影響。但是執行存儲過程要比直接執行sql花費更多(檢查權限等),所以對於很簡單的sql,存儲過程沒有什么優勢。
2. 網絡負荷:如果在存儲過程中沒有多次數據交互,那么實際上網絡傳輸量和直接sql是一樣的。
3. 團隊開發:很遺憾,比起成熟的IDE,沒有什么很好存儲過程的IDE工具來支持,也就是說,這些必須手工完成。
4. 安全機制:對於傳統的C/S結構,連接數據庫的用戶可以不同,所以安全機制有用;但是在web的三層架構中,數據庫用戶不是給用戶用的,所以基本上,只有一個用戶,擁有所有權限(最多還有一個開發用戶)。這個時候,安全機制有點多余。
5. 用戶滿意:實際上這個只是要將訪問數據庫的接口統一,是用存儲過程,還是EJB,沒太大關系,也就是說,在三層結構中,單獨設計出一個數據訪問層,同樣能實現這個目標。
6. 開發調試:一樣由於IDE的問題,存儲過程的開發調試要比一般程序困難(老版本DB2還只能用C寫存儲過程,更是一個災難)。
7. 移植性:算了,這個不用提,反正一般的應用總是綁定某個數據庫的,不然就無法靠優化數據庫訪問來提高性能了。
8. 維護性:的確,存儲過程有些時候比程序容易維護,這是因為可以實時更新DB端的存儲過程,但是在3層結構下,更新server端的數據訪問層一樣能實現這個目標,可惜現在很多平台不支持實時更新而已。
mysql數據庫存儲過程的創建語句:
create procedure Cun() begin select * from fruit end
調用存儲過程
import java.sql.*; import java.util.*; public class 存儲過程 { public static void main(String[] args) throws Exception { Class.forName("com.mysql.jdbc.Driver"); String jdbc="jdbc:mysql://127.0.0.1:3306/mydb"; Connection conn=DriverManager.getConnection(jdbc,"root",""); CallableStatement stat=conn.prepareCall("{call cun()}"); //調用存儲過程語句,{} 這個大括號可以省略 ResultSet re=stat.executeQuery(); while(re.next()){ System.out.println(re.getString(1)+" "+re.getString(2)+" "+re.getString(3)); } } }