通過PreparedStatement執行更新查詢操作
阿新 • • 發佈:2019-01-26
PreparedStatement是Statement的一個子介面,從它的名字就可以看出,它是"準備好了"的Statement,所以它表示的是將一條sql語句進行預編譯;要獲取它的物件可以通過Connection中的prepareStatement(String sql)方法來獲取,其中的引數為帶有佔位符( ? )的sql語句,所以它其中提供了補充佔位符變數值的一些setXxx()方法;
看到這裡很多人就在想,既然我已經可以用Statement介面來實現更新等操作,那為何要用PreparedStatement介面呢。。。想必我們每個人在使用Statement介面時,都要編SQL語句吧。。那麼在編寫的時候的一個最大的問題就是。。拼SQL語句太鬱悶了,一不小心就容易出錯,而且維護起來又很麻煩,比如下面這個SQL語句(例子來源於我自己寫的一個程式)
現在,本地資料庫中有這樣一個表
現在我想向表中插入Student的資料,如果利用Stetement介面,那麼寫入的sql語句應該為:
然後再呼叫setXxx()方法設定每一個佔位符所對應的屬性的值,這個方法有兩個引數,一個是某一個佔位符的索引值(索引值從1開始),另一個是佔位符變數的具體值,最後再執行PreparedStatement中的executeUpdate()執行更新操作即可,具體的例子如下: 現在本地資料庫中有一個名為animal的表,如下圖:
現在向該資料庫中使用PreparedStatement插入資訊的具體程式碼如下:
所以,在使用Statement介面時,這一點是最噁心的,我們都想解決這個問題,恰巧PreparedStatement就完美的解決了這個問題,就拿更新操作來舉例子吧,在我們生成PreparedStatement物件時,將帶有佔位符( ? )的sql語句作為引數傳入,例如上面例子中的sql語句轉換為可以預編譯的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()+")"; }
String sql = "INSERT INTO examstudent VALUES (?,?,?,?,?,?,?)";
然後再呼叫setXxx()方法設定每一個佔位符所對應的屬性的值,這個方法有兩個引數,一個是某一個佔位符的索引值(索引值從1開始),另一個是佔位符變數的具體值,最後再執行PreparedStatement中的executeUpdate()執行更新操作即可,具體的例子如下: 現在本地資料庫中有一個名為animal的表,如下圖:
以上就是PreparedStatement執行更新操作的用法了,類似的,查詢操作也使用與之相類似,我就不寫了- - 另外,使用該介面還有幾個好處 ①它能夠防止sql注入 ②它的執行效率要比Statement高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(); } } } } } }