一、
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 = "qwer1234";
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