1. 程式人生 > >通過PreparedStatement執行更新查詢操作

通過PreparedStatement執行更新查詢操作

     PreparedStatement是Statement的一個子介面,從它的名字就可以看出,它是"準備好了"的Statement,所以它表示的是將一條sql語句進行預編譯;要獲取它的物件可以通過Connection中的prepareStatement(String  sql)方法來獲取,其中的引數為帶有佔位符( ? )的sql語句,所以它其中提供了補充佔位符變數值的一些setXxx()方法;      看到這裡很多人就在想,既然我已經可以用Statement介面來實現更新等操作,那為何要用PreparedStatement介面呢。。。想必我們每個人在使用Statement介面時,都要編SQL語句吧。。那麼在編寫的時候的一個最大的問題就是。。拼SQL語句太鬱悶了,一不小心就容易出錯,而且維護起來又很麻煩,比如下面這個SQL語句(例子來源於我自己寫的一個程式) 現在,本地資料庫中有這樣一個表 現在我想向表中插入Student的資料,如果利用Stetement介面,那麼寫入的sql語句應該為:
       public  void addStudent(Student student) {
             String sql = "INSERT INTO examstudent VALUES ("
                                 +student.getFlowID()
                                 +",'"+student.getType()
                                 +"','"+student.getIDcard()
                                 +"','"+student.getExamcard()
                                 +"','"+student.getStudentName()
                                 +"','"+student.getLocation()
                                 +"',"+student.getGrade()+")";
       }
     所以,在使用Statement介面時,這一點是最噁心的,我們都想解決這個問題,恰巧PreparedStatement就完美的解決了這個問題,就拿更新操作來舉例子吧,在我們生成PreparedStatement物件時,將帶有佔位符( ? )的sql語句作為引數傳入,例如上面例子中的sql語句轉換為可以預編譯的sql語句的結果為:
String sql = "INSERT INTO examstudent VALUES (?,?,?,?,?,?,?)";

然後再呼叫setXxx()方法設定每一個佔位符所對應的屬性的值,這個方法有兩個引數,一個是某一個佔位符的索引值(索引值從1開始),另一個是佔位符變數的具體值,最後再執行PreparedStatement中的executeUpdate()執行更新操作即可,具體的例子如下: 現在本地資料庫中有一個名為animal的表,如下圖:
現在向該資料庫中使用PreparedStatement插入資訊的具體程式碼如下:
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
import org.junit.Test;
public class TestPreparedStatement {
@Test
       public void PreparedStatementTest() throws Exception{
       Connection con = null;
       PreparedStatement ps = null;
       ResultSet rs = null;
       
       try {
             //1、連線資料庫
             con = getConnection();
             //2、準備sql語句
             String sql = "INSERT INTO Animal (id,name,age) VALUES (?,?,?)";
             //3、獲取preparedStatement物件
             ps = con.prepareStatement(sql);
             //4、呼叫SetXxx()方法插入資料
             ps.setInt(1, 6);//第一個佔位符
             ps.setString(2, "egg");//第二個佔位符
             ps.setInt(3, 8);//第三個佔位符
             //5、執行更新操作
             ps.executeUpdate();
       } catch (Exception e) {
             e.printStackTrace();
       } finally{
             release(rs, ps, con);//關閉資料庫
       }
}
       public Connection getConnection() throws Exception{//獲取資料庫連線
             String driverClass = null;
             String url = null;
             String user = null;
             String password = null;
             
             Properties properties = new Properties();
             InputStream in = this.getClass().getClassLoader().getResourceAsStream("jdbc.properties");
             properties.load(in);
             
             driverClass = properties.getProperty("driver");
             url = properties.getProperty("jdbcurl");
             user = properties.getProperty("user");
             password = properties.getProperty("password");
             
             Class.forName(driverClass);
             return DriverManager.getConnection(url, user, password);
       }
       public void release(ResultSet rs , PreparedStatement ps , Connection con){//釋放資料庫連線
             if(rs != null){
                    try {
                           rs.close();
                    } catch (Exception e) {
                           e.printStackTrace();
                    }
             if(ps != null){
                    try {
                           ps.close();
                    } catch (Exception e) {
                           e.printStackTrace();
                    }
             if(con != null){
                    try {
                           con.close();
                    } catch (Exception e) {
                           e.printStackTrace();
                    }
             }
             }
             }
       }
}
     以上就是PreparedStatement執行更新操作的用法了,類似的,查詢操作也使用與之相類似,我就不寫了- - 另外,使用該介面還有幾個好處      ①它能夠防止sql注入      ②它的執行效率要比Statement高