一、
java.sql.* 和 javax.sql.*的包的類結構
|- Driver接口: 表示java驅動程序接口。所有的具體的數據庫廠商要來實現此接口。
|- connect(url, properties): 連接數據庫的方法。
url: 連接數據庫的URL
URL語法: jdbc協議:數據庫子協議://主機:端口/數據庫
user: 數據庫的用戶名
password: 數據庫用戶密碼
|- DriverManager類: 驅動管理器類,用於管理所有注冊的驅動程序
|-registerDriver(driver) : 注冊驅動類對象
|-Connection getConnection(url,user,password); 獲取連接對象
|- Connection接口: 表示java程序和數據庫的連接對象。
|- Statement createStatement() : 創建Statement對象
|- PreparedStatement prepareStatement(String sql) 創建PreparedStatement對象
|- CallableStatement prepareCall(String sql) 創建CallableStatement對象
|- Statement接口: 用於執行靜態的sql語句
|- int executeUpdate(String sql) : 執行靜態的更新sql語句(DDL,DML)
|- ResultSet executeQuery(String sql) :執行的靜態的查詢sql語句(DQL)
|-PreparedStatement接口:用於執行預編譯sql語句
|- int executeUpdate() : 執行預編譯的更新sql語句(DDL,DML)
|-ResultSet executeQuery() : 執行預編譯的查詢sql語句(DQL)
|-CallableStatement接口:用於執行存儲過程的sql語句(call xxx)
|-ResultSet executeQuery() : 調用存儲過程的方法
|- ResultSet接口:用於封裝查詢出來的數據
|- boolean next() : 將光標移動到下一行
|-getXX() : 獲取列的值
Statemetent對象執行的是靜態SQL語句,而PreparedStatement對象執行的是預編譯SQL語句,如上圖,Statement對象執行executeUpdate(String sql)和executeQuery(String sql),而PreparedStatement 對象執行的是無參的executeUpdate()和executeQuery(),從這兩個方法可以看出這兩個對象的特點,正因為如此,PreparedStatement可以預防SQL語句注入,更安全,當然它的效率也更高一些。
二、通過jdbc代碼調用存儲過程
代碼如下
package com.a_callrablestatement; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; import org.junit.Test; import com.util.DBUtil; public class Demo1 { public Connection conn = null; public CallableStatement cs = null; ResultSet rs = null; String driverClass = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; String url = "jdbc:sqlserver://localhost:1433;DatabaseName=User"; String username = "sa"; String password = "******"; String sql = "exec pro_findById ? "; public Demo1() { // TODO Auto-generated constructor stub } @Test public void test1() { try{ //注冊驅動 Class.forName(driverClass); //連接 conn = DriverManager.getConnection(url,username,password); //得到prepareCall預編譯對象 cs = conn.prepareCall(sql); //設置問號的占位符 cs.setInt(1,3); rs = cs.executeQuery(); //打印結果 while(rs.next()) { int id = rs.getInt("id"); String name = rs.getString("username"); String password = rs.getString("password"); String gender = rs.getString("gender"); String interest = rs.getString("interest"); System.out.println(id+","+name+","+password+","+gender+","+interest); } }catch(ClassNotFoundException e) { e.printStackTrace(); }catch(SQLException e) { e.printStackTrace(); }finally { DBUtil.close(conn,rs,cs); } } @Test public void test2() { sql ="exec pro_findNameById ?,?"; try{ //注冊驅動 Class.forName(driverClass); //連接 conn = DriverManager.getConnection(url,username,password); //得到prepareCall預編譯對象 cs = conn.prepareCall(sql); //設置問號的占位符的參數值 cs.setInt(1,3); /** * 1.參數一,表示要設置的參數位置 * 2.參數二,表示要返回的參數值類型 varchar(20) */ cs.registerOutParameter(2, Types.VARCHAR); //執行操作,但不返回結果集,返回值在參數中,這里只能用execute(),不能用executeQuery(),這是在SQL Server2008中 cs.execute(); /** * 預編譯sql中參數的位置 */ String name = cs.getString(2); //打印結果 System.out.println(name); }catch(ClassNotFoundException e) { e.printStackTrace(); }catch(SQLException e) { e.printStackTrace(); }finally { DBUtil.close(conn,rs,cs); } } } 工具類 package com.util; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class DBUtil { public DBUtil() { // TODO Auto-generated constructor stub } public static void close(Connection conn,ResultSet rs,PreparedStatement ps ) { try{ if(conn!=null) { conn.close(); } if(rs!=null) { rs.close(); } if(ps!=null) { ps.close(); } }catch(SQLException e) { e.printStackTrace(); throw new RuntimeException(e); } } }
1.test1()方法是調用沒有返回值的存儲過程
2,test2()方法是調用有返回值的存儲過程
在調用有返回值的存儲過程時,不能使用executeQuery(),否則會報沒有返回結果集的錯誤
而改為execute()方法后就可以得到正常的結果
test1()中的存儲過程代碼
use [User] go create procedure pro_findById(@id int) as select * from [tb_user] where id=@id go
test2()中的存儲過程
use [User] go create procedure findNameById @id int,@name varchar(20) as select @name=username from tb_user where id=@id go
注:SQL server 2008和jdk 1.7 加eclipse ee 4.5