1. 程式人生 > >java基礎總結(二十七)--Statement 和 PreparedStatement之間的關係和區別

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();
            }
        }
    }
}

插入之後的結果: