Statement、PreparedStatement 、CallableStatement 區(qū)別和聯(lián)系

三者聯(lián)系

  1. Statement、PreparedStatement和CallableStatement都是接口(interface)。
  2. Statement繼承自Wrapper、PreparedStatement繼承自Statement、CallableStatement繼承自PreparedStatement。
  3. 三者功能特點(diǎn):
    • Statement接口提供了執(zhí)行語句和獲取結(jié)果的基本方法;
    • PreparedStatement接口添加了處理 IN 參數(shù)的方法;
    • CallableStatement接口添加了處理 OUT 參數(shù)的方法。

Statement

Statement用于執(zhí)行不帶參數(shù)的簡單SQL語句,并返回它所生成的結(jié)果,每次執(zhí)行時,數(shù)據(jù)庫都要編譯該SQL語句。

PreparedStatement

表示預(yù)編譯的SQL語句的對象,用于執(zhí)行帶參數(shù)的預(yù)編譯的SQL語句,也可以不帶參數(shù)。編譯一次,執(zhí)行多次,效率高; 安全性好,有效防止Sql注入等問題。

CallableStatement

提供了用來調(diào)用數(shù)據(jù)庫中存儲過程的接口,如果有輸出參數(shù)要注冊,說明是輸出參數(shù)。繼承自PreparedStatement,支持帶參數(shù)的SQL操作。提供了對輸出和輸入/輸出參數(shù)(IN/OUT)的支持。不同數(shù)據(jù)庫的存儲過程是不可移植的,因此CallableStatement面臨移植性差問題。

Statement的使用

  1. 創(chuàng)建Statement對象
    java Statement stmt = connection.creatStatement();
  2. Statement常用方法
    • boolean execute(String sql) 返回boolean類型,在執(zhí)行sql語句后,如果ResultSet檢索到,則返回true,否則返回false。
    • int executeUpdate(String sql) 返回int類型,方法用于執(zhí)行sql語句,將返回sql語句影響的行數(shù)。
    • ResultSet executeQuery(String sql) 執(zhí)行sql語句,將返回結(jié)果集。用ResultSet實(shí)例化 result去接收返回集。
  3. 關(guān)閉
    java stmt.close(); // 關(guān)閉并釋放資源。

PreparedStatement的使用

//連接數(shù)據(jù)庫
String sql="insert into userInfo(username.password,gender,age) value(?,?,?,?)";
//可以傳入?yún)?shù)
PreparedStatement ps=conn.prepareStatement(String sql);
//調(diào)用setXXX系列方法給問號賦值,下標(biāo)從1開始,代表第一個問號
ps.setString(1,"name");
ps.setInt(2,123456);
ps.setString(3,"男");
ps.setInt(4,25);
//執(zhí)行插入
ps.executeUpdate();
ps.close();
conn.close();
  1. 常用方法:
    • boolean execute() 在進(jìn)行數(shù)據(jù)庫或表的創(chuàng)建刪除操作時使用。
    • ResultSet executeQuery() 數(shù)據(jù)查詢時使用。
    • int executeUpdate() 數(shù)據(jù)的插入刪除、修改時使用。
  2. 關(guān)閉
    java ps.close(); // 關(guān)閉并釋放資源。

CallableStatement的使用

  1. 創(chuàng)建一個CallableStatement
    存儲過程存在的三種參數(shù):IN OUT INOUT
    • IN 創(chuàng)建SQL語句時其參數(shù)值是未知的。 使用setXXX()方法將值綁定到IN參數(shù)。
    • OUT 由SQL語句返回的參數(shù)值。可以使用getXXX()方法從OUT參數(shù)中檢索值。
    • INOUT 提供輸入和輸出值的參數(shù)。使用setXXX()方法綁定變量并使用getXXX()方法檢索值。
  2. 如果存儲過程只是IN
    String sql="{call getEmpName (?, ?)}";
    //conn.prepareCall() 與conn.preparedStatement()功能一樣
    CallableStatement cstmt=conn.prepareCall(sql);
    cstmt.setString(1,"aaa");
    cstmt.setInt(2,123);
    //發(fā)送參數(shù),所有調(diào)用存儲過程的sql語句都是使用executeQuery方法執(zhí)行。
    ResultSet rs=cstmt.executeQuery();
    
  3. 如果存儲過程是INOUT
    //第一個?是輸入?yún)?shù),第二個?是輸出參數(shù) 
    String sql = "CALL pro_test2(?,?)"; 
    CallableStatement cstmt=conn.prepareCall(sql); 
    //設(shè)置輸入?yún)?shù) 
    cstmt=setInt(1,5); 
    //設(shè)置輸出參數(shù),用registerOutParameter綁定 
    cstmt.registerOutParameter(2,java.sql.Types.VARCHAR); 
    //執(zhí)行 
    cstmt.executeQuery(); 
    //根據(jù)?位置取得數(shù)據(jù)getXXX()方法只用于存儲過程 
    String rs=cstmt.getString(2); 
    
  4. 關(guān)閉CallableStatement
    java cstmt.close();

批量查詢

    // Statement的Batch使用:  
    Statement stmt  = conn.createStatement();  
    String sql = null;  
    for (int i = 0; i < 20; i++) {  
        sql = "insert into test(id, name)values(" + i + ", " + i + "_name)";  
        stmt.addBatch(sql);  
    }  
    stmt.executeBatch();  
       
    // PreparedStatement的Batch使用:  
    PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES  SET SALARY = ? WHERE ID =?");  
    for (int i = 0; i < length; i++) {  
        pstmt.setBigDecimal(1, param1[i]);  
        pstmt.setInt(2, param2[i]);  
        pstmt.addBatch();  
    }  
    pstmt.executeBatch();  
    ```
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本節(jié)介紹Statement接口及其子類PreparedStatement和CallableStatement。 它...
    zlb閱讀 1,245評論 0 0
  • JDBC基礎(chǔ)知識 一、采用JDBC訪問數(shù)據(jù)庫的基本步驟: A.載入JDBC驅(qū)動程序 B.定義連接URL ...
    91數(shù)據(jù)閱讀 4,093評論 0 20
  • JDBC簡介 SUN公司為了簡化、統(tǒng)一對數(shù)據(jù)庫的操作,定義了一套Java操作數(shù)據(jù)庫的規(guī)范,稱之為JDBC。JDBC...
    奮斗的老王閱讀 1,639評論 0 51
  • 我是一片湖水 等待一場風(fēng)的來臨 魚兒游過 葉兒飄過 云兒和藍(lán)天也來過 我久久沉默 你不來 春日不晴 夏日不雨 秋日...
    楚生閱讀 287評論 0 1
  • 每當(dāng)有火車經(jīng)過 你都會用力揮手吧 奇妙的思念作祟 夢是一朵花 木蓮 向日葵 凌霄 被打濕了的柳梢 你會夢見哪一種 ...
    莊周大叔閱讀 176評論 0 1

友情鏈接更多精彩內(nèi)容