java基礎總結(二十七)--Statement 和 PreparedStatement之間的關係和區別
Statement 和 PreparedStatement之間的關係和區別. 關係:PreparedStatement繼承自Statement,都是介面 區別:PreparedStatement可以使用佔位符,是預編譯的,批處理比Statement效率高 詳解: 1、PreparedStatement:表示預編譯的 SQL 語句的物件。 介面:public interface PreparedStatement extends Statement之間的繼承關係 SQL 語句被預編譯並存儲在 PreparedStatement 物件中。然後可以使用此物件多次高效地執行該語句。 注:用於設定 IN 引數值的設定方法(setShort、setString 等等)必須指定與輸入引數的已定義 SQL 型別相容的型別。例如,如果 IN 引數具有 SQL 型別 INTEGER,那麼應該使用 setInt 方法,問號的位置也是應該注意的,因為第一個問好的位置為1,第二個問號的位置為2.以此類推。 如果需要任意引數型別轉換,使用 setObject 方法時應該將目標 SQL 型別作為其引數。 在以下設定引數的示例中,con 表示一個活動連線: PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SALARY = ? WHERE ID = ?"); pstmt.setBigDecimal(1, 1533.00) pstmt.setInt(2, 1102) pstmt.execute()//注意提交時這裡不能再有sql語句,不同於Statment
演示程式碼:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; public class PreparedStatementTest { public static void main(String[] args) { test_autoCommit(); } public static void test_autoCommit() { String driver="oracle.jdbc.driver.OracleDriver"; String url="jdbc:oracle:thin:@127.0.0.1:1521:orcl"; String user="briup"; String password="briup"; Connection conn=null; PreparedStatement ps=null; try { //1、註冊驅動 Class.forName(driver); //2、獲取連線 conn= DriverManager.getConnection(url, user, password); //System.out.println(conn); //3、建立prepareStatement物件 String sql="insert into lover values(?,?,?)"; ps=conn.prepareStatement(sql); //4、執行sql語句 ps.setInt(1,21);//代表設定給第一個?號位置的值為Int型別的21 ps.setString(2,"suwu150");//代表設定給第二個?號位置的值為String型別的suwu150 java.util.Date utilDate=new java.util.Date();//進行型別轉換,由util型別的date轉化為sql型別的 ps.setDate(3, new java.sql.Date(utilDate.getTime())); //ps.execute();//執行 System.out.println(ps.execute());//執行表輸出返回的結果,結果為false,因為沒有返回的結果集 //5、處理結果集 } catch (Exception e) { e.printStackTrace(); } finally{ //6、關閉資源 try { if(ps!=null)ps.close(); } catch (SQLException e) { e.printStackTrace(); } try { if(conn!=null)conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
插入之後的結果
2、Statement:用於執行靜態 SQL 語句並返回它所生成結果的物件。 介面:public interface Statement extends Wrapper 在預設情況下,同一時間每個 Statement 物件只能開啟一個 ResultSet 物件。因此,如果讀取一個 ResultSet 物件與另一個交叉,則這兩個物件必須是由不同的 Statement 物件生成的。如果存在某個語句的開啟的當前 ResultSet 物件,則 Statement 介面中的所有執行方法都會隱式關閉它。 如以下操作:建立statement物件 Statement stat=conn.createStatement(); String sql="insert into lover values(6,'suxingxing',to_date('21-9-2016','dd-mm-yyyy'))"; stat.execute(sql);//這裡提交時應該有sql語句,不同於PreparedStatment 來看一下實際使用吧:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class StatementTest {
public static void main(String[] args) {
test_autoCommit();
}
public static void test_autoCommit()
{
String driver="oracle.jdbc.driver.OracleDriver";
String url="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
String user="briup";
String password="briup";
Connection conn=null;
Statement stat=null;
try {
//1、註冊驅動
Class.forName(driver);
//2、獲取連線
conn= DriverManager.getConnection(url, user, password);
conn.setAutoCommit(false);
//System.out.println(conn);
//3、建立statement物件
stat=conn.createStatement();
//4、執行sql語句
String sql="insert into lover values(22,'suxingxing',to_date('21-9-2016','dd-mm-yyyy'))"; //注意格式
// stat.execute(sql);
System.out.println(stat.execute(sql)); //返回值為false,因為同樣沒有ResultSet返回集
conn.commit();
//5、處理結果集
} catch (Exception e) {
e.printStackTrace();
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
finally{
//6、關閉資源
try {
if(stat!=null)stat.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn!=null)conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
插入之後的結果: