程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> 04.JDBC編程之指定變量&批處理

04.JDBC編程之指定變量&批處理

編輯:DB2教程

04.JDBC編程之指定變量&批處理


  1. boolean
  1. execute() Executes the SQL statement in this PreparedStatement object, which may be any kind of SQL statement.
  1. ResultSet
  1. executeQuery() Executes the SQL query in this PreparedStatement object and returns the ResultSet object generated by the query.
  1. int
  1. executeUpdate() Executes the SQL statement in this PreparedStatement object, which must be an SQL Data Manipulation Language (DML) statement, such as INSERT, UPDATE or DELETE; or an SQL statement that returns nothing, such as a DDL statement.
  1. void
  1. setDouble(int parameterIndex, double x) Sets the designated parameter to the given Java double value.
  1. void
  1. setFloat(int parameterIndex, float x) Sets the designated parameter to the given Java float value.
  1. void
  1. setInt(int parameterIndex, int x) Sets the designated parameter to the given Java int value.
  1. void
  1. setLong(int parameterIndex, long x) Sets the designated parameter to the given Java long value.
  1. void
  1. setNull(int parameterIndex, int sqlType) Sets the designated parameter to SQL NULL.
  1. void
  1. setShort(int parameterIndex, short x) Sets the designated parameter to the given Java short value.
  1. void
  1. setSQLXML(int parameterIndex, SQLXML xmlObject) Sets the designated parameter to the given java.sql.SQLXML object.
  1. void
  1. setString(int parameterIndex, String x) Sets the designated parameter to the given Java String value.
  1. void
  1. setURL(int parameterIndex, URL x) Sets the designated parameter to the given java.net.URL value
一、指定SQL語句中的變量

1.PreparedStatement接口 PreparedStatement接口繼承Statement, PreparedStatement 實例包含已編譯的 SQL 語句,所以其執行速度要快於 Statement 對象。 包含於 PreparedStatement 對象中的 SQL 語句可具有一個或多個 IN 參數。IN參數的值在 SQL 語句創建時未被指定。相反的,該語句為每個 IN 參數保留一個問號(“?”)作為占位符。每個問號的值必須在該語句執行之前,通過適當的setXXX 方法來提供。另外,作為 Statement 的子類,PreparedStatement 繼承了 Statement 的所有功能。三種方法 execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要參數。 由於 PreparedStatement 對象已預編譯過,所以其執行速度要快於 Statement 對象。因此,多次執行的 SQL 語句經常創建為 PreparedStatement 對象,以提高效率。為此,在JDBC應用中應該始終以PreparedStatement代替Statement,即盡量不要使用Statement。 Interface PreparedStatement(java.sql)

2.優點

(1)代碼的可讀性和可維護性 雖然用PreparedStatement來代替Statement會使代碼多出幾行,但這樣的代碼無論從可讀性還是可維護性上來說.都比直接用Statement的代碼高很多檔次。下面分別使用Statement、PrepareStatement執行一條SQL語句
stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");
//stmt是Statement對象實例 perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");
perstmt.setString(1,var1);
perstmt.setString(2,var2);
perstmt.setString(3,var3);
perstmt.setString(4,var4);
perstmt.executeUpdate(); //prestmt是 PreparedStatement 對象實例

(2)PreparedStatement盡最大可能提高性能 語句在被DB的編譯器編譯後的執行代碼被緩存下來,那麼下次調用時只要是相同的預編譯語句就不需要編譯,只要將參數直接傳入編譯過的語句執行代碼中(相當於一個函數)就會得到執行.這並不是說只有一個Connection中多次執行的預編譯語句被緩存,而是對於整個DB中,只要預編譯的語句語法和緩存中匹配.那麼在任何時候就可以不需要再次編譯而可以直接執行.而statement的語句中,即使是相同一操作,而由於每次操作的數據不同所以使整個語句相匹配的機會極小,幾乎不太可能匹配.比如:
insert into tb_name (col1,col2) values ('11','22');
insert into tb_name (col1,col2) values ('11','23');
即使是相同操作但因為數據內容不一樣,所以整個個語句本身不能匹配,沒有緩存語句的意義.事實是沒有數據庫會對普通語句編譯後的執行代碼緩存。當然並不是所以預編譯語句都一定會被緩存,數據庫本身會用一種策略,比如使用頻度等因素來決定什麼時候不再緩存已有的預編譯結果,以保存有更多的空間存儲新的預編譯語句。

(3)最重要的一點是極大地提高了安全性 即使到目前為止,仍有一些人連基本的惡義SQL語法都不知道. String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'"; 如果我們把[' or '1' = '1]作為varpasswd傳入進來.用戶名隨意,看看會成為什麼? select * from tb_name = '隨意' and passwd = '' or '1' = '1'; 因為'1'='1'肯定成立,所以可以任何通過驗證.更有甚者: 把[';drop table tb_name;]作為varpasswd傳入進來,則: select * from tb_name = '隨意' and passwd = '';drop table tb_name;有些數據庫是不會讓你成功的,但也有很多數據庫就可以使這些語句得到執行. 而如果你使用預編譯語句.你傳入的任何內容就不會和原來的語句發生任何匹配的關系.只要全使用預編譯語句,你就用不著對傳入的數據做任何過慮.而如果使用普通的statement,有可能要對drop,;等做費盡心機的判斷和過慮.

3.源碼實戰:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/*MySQL數據庫編程
* 實例(4):使用PreparedStatement靈活指定SQL語句中的變量*/
public class JDBC_PreparedStatement {
public static void main(String[] args) {
if(args.length!=3) //輸入不正確,非正常退出
{
System.out.println( "Parament Error,Please Input Again!");
System.exit(-1);
}
String nameParam=args[0]; //獲取命令行第一個參數
int ageParam=Integer.parseInt(args[1]); //獲取命令行第二個參數,並轉換為整型
int scoreParam=Integer.parseInt(args[2]);//獲取命令行第三個參數,並轉換為整型


//0.連接數據庫相關參數
String url="jdbc:mysql://localhost:3306/jdbc_test_db"; //數據庫URL(資源定位唯一標識符)
String DBusername="root"; //數據庫用戶名
String DBpasswd="111111"; //數據庫密碼


//1.加載數據庫驅動,將Driver注冊到DriverManager中
try{
Class.forName("com.mysql.jdbc.Driver");
}catch(ClassNotFoundException e){
e.printStackTrace();
}
//2.通過數據庫URL連接到數據庫
Connection conn=null;
PreparedStatement prestmt=null;
try{
conn=DriverManager.getConnection(url, DBusername, DBpasswd);
//3.獲取PreparedStatement對象


String sql="insert into test(name,age,score) values(?,?,?)";
prestmt=conn.prepareStatement(sql);
prestmt.setString(1, nameParam); //分別給變量設值
prestmt.setInt(2, ageParam);
prestmt.setInt(3, scoreParam);
prestmt.execute();


}catch(SQLException e){
e.printStackTrace();
}
//5.釋放JDBC資源
if(prestmt!=null) //關閉聲明
{
try{
prestmt.close();
}catch(SQLException e){
e.printStackTrace();
}
}


if(conn!=null) //關閉連接
{
try{
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}


} 
(1)設置命令行參數 右擊工程->Run as->Open Run Dialog->Main Class選擇"JDBC_PreparedStatement" \
(2)運行結果
\
二、批處理SQL語句 (1)源代碼
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
/*MySQL數據庫編程
* 實例(5):JDBC批量處理DML語句.分別嘗試Statement、PreparedStatement*/


public class JDBC_Batch {
public static void main(String[] args) {


//0.連接數據庫相關參數
String url="jdbc:mysql://localhost:3306/jdbc_test_db"; //數據庫URL(資源定位唯一標識符)
String DBusername="root"; //數據庫用戶名
String DBpasswd="111111"; //數據庫密碼


//1.加載數據庫驅動,將Driver注冊到DriverManager中
try{
Class.forName("com.mysql.jdbc.Driver");
}catch(ClassNotFoundException e){
e.printStackTrace();
}
//2.通過數據庫URL連接到數據庫
Connection conn=null;
PreparedStatement prestmt=null;
try{
conn=DriverManager.getConnection(url, DBusername, DBpasswd);
//3.獲取PreparedStatement對象
String sql="insert into test(name,age,score) values(?,?,?)";
prestmt=conn.prepareStatement(sql);
prestmt.setString(1,"aaa");
prestmt.setInt(2, 19);
prestmt.setInt(3, 55);
prestmt.execute(); //a.添加第一條插入記錄


prestmt.setString(1,"bbb");
prestmt.setInt(2, 20);
prestmt.setInt(3, 66);
prestmt.execute(); //a.添加第二條插入記錄


prestmt.setString(1,"ccc");
prestmt.setInt(2, 21);
prestmt.setInt(3, 77);
prestmt.execute(); //a.添加第三條插入記錄
}catch(SQLException e){
e.printStackTrace();
}
//5.釋放JDBC資源
if(prestmt!=null) //關閉聲明
{
try{
prestmt.close();
}catch(SQLException e){
e.printStackTrace();
}
}


if(conn!=null) //關閉連接
{
try{
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
}

(2)運行結果
\
說明分析: 這裡使用的是SQL語句靜態插入數據,我們也可以使用Statement的addBatch方法實現JDBC批量處理SQL語句
Statement stmt=conn.createStatement();
stmt.addBatch("insert into test(name,age,score) values('ppp',30,88)");
stmt.addBatch("insert into test(name,age,score) values('ooo',31,89)");
stmt.addBatch("insert into test(name,age,score) values('qqq',32,90)");
stmt.executeBatch(); //批量執行SQL語句
\

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved