jdbc中的Statement對象和Preparedstatement對象的區別,以及通過jdbc操作調用預存程序,preparedstatement

來源:互聯網
上載者:User

jdbc中的Statement對象和Preparedstatement對象的區別,以及通過jdbc操作調用預存程序,preparedstatement

一、

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.