在JDBC API中提供了調用存儲過程的方法,經過CallableStatement對象進行操做。CallableStatement對象位於java.sql包中,它繼承於Statement對象,主要用於執行數據庫中定義的存儲過程,其調用方法以下:html
{call <procedure-name>[(<arg1>,<arg2>,...)]}
其中,arg一、arg2爲存儲過程當中的參數,若是存儲過程當中須要傳遞參數,能夠對其進行賦值操做。java
技巧:存儲過程是一個SQL語句和可選控制流語句的預編譯集合。編譯完成後存放在數據庫中,這樣就省去了執行SQL語句時對SQL語句進行編譯所花費的時間。在執行存儲過程時只須要將參數傳遞到數據庫中,而不須要將整條SQL語句都提交給數據庫,從而減小了網絡傳輸的流量,從另外一方面提升了程序的運行速度。mysql
(1)在數據庫test中建立名稱爲findAllBook的存儲過程,用於查詢全部圖書信息。關鍵代碼以下:sql
BEGIN SELECT* FROM books ORDER BY id DESC; END
各類數據庫建立存儲過程的方法並不是一致,本實例使用的是MySQL數據庫,若是使用其餘數據庫建立存儲過程請參閱數據庫提供的幫助文檔。數據庫
(2) 建立名稱爲Book的類,該類用於封裝圖書信息的JavaBean對象。關鍵代碼以下:網絡
package com.cn.gao; public class Book { private int id; private String name; private double price; private int bookCount; private String author; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public int getBookCount() { return bookCount; } public void setBookCount(int bookCount) { this.bookCount = bookCount; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } }
(3)建立名稱爲FindBook的類,用於執行查詢圖書信息的存儲過程。首先在該類中編寫getConnection()方法,獲取數據庫鏈接對象Connection,其關鍵代碼以下:jsp
/** * 獲取數據庫鏈接 * @return Connection 對象 */ public Connection getConnection(){ Connection conn=null; try { Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/test"; String user = "root"; String password = "1234"; conn=DriverManager.getConnection(url, user, password); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return conn; }
而後編寫findAll()方法,調用數據庫中定義的存儲過程findAllBook,查詢全部圖書信息,並將查詢到的圖書的信息放置到List集合中。關鍵代碼以下:ui
/** * 經過存儲過程查詢數據 * @return List<Book> */ public List<Book> findAll(){ List<Book> list = new ArrayList<Book>(); Connection conn = getConnection(); try { //調用存儲過程 CallableStatement cs = conn.prepareCall("{call findAllBook()}"); ResultSet rs = cs.executeQuery(); //執行查詢操做,並獲取結果集 while(rs.next()){ Book book = new Book(); book.setId(rs.getInt("id")); book.setName(rs.getString("name")); book.setPrice(rs.getDouble("price")); book.setBookCount(rs.getInt("bookCount")); book.setAuthor(rs.getString("author")); list.add(book); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return list; }
因爲存儲過程findAllBook中沒有定義參數,因此實例中經過調用「{call findAllBook()}"來調用存儲過程。this
(4)建立程序中的主頁index1.jsp,在該頁面中實例化FindBook對象,並調用它的findAll()方法獲取全部圖書信息,將圖書信息數據顯示在頁面中。關鍵代碼以下:url
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <%@ page import="java.util.*" %> <%@ page import="com.cn.gao.*" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>Insert title here</title> </head> <body> <jsp:useBean id="findBook" class="com.cn.gao.FindBook"></jsp:useBean> <table align="center" width="450" border="1"> <tr> <td align="center" colspan="5"> <h2>全部圖書信息</h2> </td> </tr> <tr align="center"> <td><b>ID</b></td> <td><b>圖書名稱</b></td> <td><b>價格</b></td> <td><b>數量</b></td> <td><b>做者</b></td> </tr> <% List<Book> list = findBook.findAll(); if(list==null||list.size()<1){ out.print("沒有數據!"); }else{ for(Book book:list){ %> <tr align="center"> <td><%=book.getId() %></td> <td><%=book.getName() %></td> <td><%=book.getPrice() %></td> <td><%=book.getBookCount() %></td> <td><%=book.getAuthor() %></td> </tr> <% } } %> </table> </body> </html>
實例運行後,進入到index1.jsp頁面,程序將執行數據庫中定義的存儲過程findAllBook查詢圖書信息,其運行結果以下圖所示: