java中Statement 與 PreparedStatement接口之間的關(guān)系和區(qū)別
Statement 和 PreparedStatement之間的關(guān)系和區(qū)別.
關(guān)系:PreparedStatement繼承自Statement,都是接口
區(qū)別:PreparedStatement可以使用占位符,是預(yù)編譯的,批處理比Statement效率高
詳解:
1、PreparedStatement:表示預(yù)編譯的 SQL 語(yǔ)句的對(duì)象。
接口:public interface PreparedStatement extends Statement之間的繼承關(guān)系
SQL 語(yǔ)句被預(yù)編譯并存儲(chǔ)在 PreparedStatement 對(duì)象中。然后可以使用此對(duì)象多次高效地執(zhí)行該語(yǔ)句。
注:用于設(shè)置 IN 參數(shù)值的設(shè)置方法(setShort、setString 等等)必須指定與輸入?yún)?shù)的已定義 SQL 類(lèi)型兼容的類(lèi)型。例如,如果 IN 參數(shù)具有 SQL 類(lèi)型 INTEGER,那么應(yīng)該使用 setInt 方法,問(wèn)號(hào)的位置也是應(yīng)該注意的,因?yàn)榈谝粋€(gè)問(wèn)好的位置為1,第二個(gè)問(wèn)號(hào)的位置為2.以此類(lèi)推。
如果需要任意參數(shù)類(lèi)型轉(zhuǎn)換,使用 setObject 方法時(shí)應(yīng)該將目標(biāo) SQL 類(lèi)型作為其參數(shù)。
在以下設(shè)置參數(shù)的示例中,con 表示一個(gè)活動(dòng)連接:
PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SALARY = ? WHERE ID = ?");
pstmt.setBigDecimal(1, 1533.00)
pstmt.setInt(2, 1102)
pstmt.execute()//注意提交時(shí)這里不能再有sql語(yǔ)句,不同于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、注冊(cè)驅(qū)動(dòng) Class.forName(driver); //2、獲取連接 conn= DriverManager.getConnection(url, user, password); //System.out.println(conn); //3、創(chuàng)建prepareStatement對(duì)象 String sql="insert into lover values(?,?,?)"; ps=conn.prepareStatement(sql); //4、執(zhí)行sql語(yǔ)句 ps.setInt(1,21);//代表設(shè)置給第一個(gè)?號(hào)位置的值為Int類(lèi)型的21 ps.setString(2,"suwu150");//代表設(shè)置給第二個(gè)?號(hào)位置的值為String類(lèi)型的suwu150 java.util.Date utilDate=new java.util.Date();//進(jìn)行類(lèi)型轉(zhuǎn)換,由util類(lèi)型的date轉(zhuǎn)化為sql類(lèi)型的 ps.setDate(3, new java.sql.Date(utilDate.getTime())); //ps.execute();//執(zhí)行 System.out.println(ps.execute());//執(zhí)行表輸出返回的結(jié)果,結(jié)果為false,因?yàn)闆](méi)有返回的結(jié)果集 //5、處理結(jié)果集 } catch (Exception e) { e.printStackTrace(); } finally{ //6、關(guān)閉資源 try { if(ps!=null)ps.close(); } catch (SQLException e) { e.printStackTrace(); } try { if(conn!=null)conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
插入之后的結(jié)果
2、Statement:用于執(zhí)行靜態(tài) SQL 語(yǔ)句并返回它所生成結(jié)果的對(duì)象。
接口:public interface Statement extends Wrapper
在默認(rèn)情況下,同一時(shí)間每個(gè) Statement 對(duì)象只能打開(kāi)一個(gè) ResultSet 對(duì)象。因此,如果讀取一個(gè) ResultSet 對(duì)象與另一個(gè)交叉,則這兩個(gè)對(duì)象必須是由不同的 Statement 對(duì)象生成的。如果存在某個(gè)語(yǔ)句的打開(kāi)的當(dāng)前 ResultSet 對(duì)象,則 Statement 接口中的所有執(zhí)行方法都會(huì)隱式關(guān)閉它。
如以下操作:創(chuàng)建statement對(duì)象
Statement stat=conn.createStatement();
String sql="insert into lover values(6,'suxingxing',to_date('21-9-2016','dd-mm-yyyy'))";
stat.execute(sql);//這里提交時(shí)應(yīng)該有sql語(yǔ)句,不同于PreparedStatment
來(lái)看一下實(shí)際使用吧:
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、注冊(cè)驅(qū)動(dòng) Class.forName(driver); //2、獲取連接 conn= DriverManager.getConnection(url, user, password); conn.setAutoCommit(false); //System.out.println(conn); //3、創(chuàng)建statement對(duì)象 stat=conn.createStatement(); //4、執(zhí)行sql語(yǔ)句 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,因?yàn)橥瑯記](méi)有ResultSet返回集 conn.commit(); //5、處理結(jié)果集 } catch (Exception e) { e.printStackTrace(); try { conn.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } } finally{ //6、關(guān)閉資源 try { if(stat!=null)stat.close(); } catch (SQLException e) { e.printStackTrace(); } try { if(conn!=null)conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
插入之后的結(jié)果:
到此這篇關(guān)于java中Statement 與 PreparedStatement接口之間的關(guān)系和區(qū)別的文章就介紹到這了,更多相關(guān)Statement 與 PreparedStatement接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JAVA基于靜態(tài)數(shù)組實(shí)現(xiàn)棧的基本原理與用法詳解
這篇文章主要介紹了JAVA基于靜態(tài)數(shù)組實(shí)現(xiàn)棧的基本原理與用法,結(jié)合實(shí)例形式詳細(xì)分析了JAVA基于靜態(tài)數(shù)組實(shí)現(xiàn)棧相關(guān)原理、用法與操作注意事項(xiàng),需要的朋友可以參考下2020-03-03SpringBoot2.0 整合 SpringSecurity 框架實(shí)現(xiàn)用戶(hù)權(quán)限安全管理方法
Spring Security是一個(gè)能夠?yàn)榛赟pring的企業(yè)應(yīng)用系統(tǒng)提供聲明式的安全訪問(wèn)控制解決方案的安全框架。這篇文章主要介紹了SpringBoot2.0 整合 SpringSecurity 框架,實(shí)現(xiàn)用戶(hù)權(quán)限安全管理 ,需要的朋友可以參考下2019-07-07Java設(shè)計(jì)模式之橋模式(Bridge模式)介紹
這篇文章主要介紹了Java設(shè)計(jì)模式之橋模式(Bridge模式)介紹,本文講解了為什么使用橋模式、如何實(shí)現(xiàn)橋模式、Bridge模式在EJB中的應(yīng)用等內(nèi)容,需要的朋友可以參考下2015-03-03springboot項(xiàng)目關(guān)閉swagger如何防止漏洞掃描
這篇文章主要介紹了springboot項(xiàng)目關(guān)閉swagger如何防止漏洞掃描,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-05-05Java數(shù)據(jù)結(jié)構(gòu)最清晰圖解二叉樹(shù)前 中 后序遍歷
樹(shù)是一種重要的非線性數(shù)據(jù)結(jié)構(gòu),直觀地看,它是數(shù)據(jù)元素(在樹(shù)中稱(chēng)為結(jié)點(diǎn))按分支關(guān)系組織起來(lái)的結(jié)構(gòu),很象自然界中的樹(shù)那樣。樹(shù)結(jié)構(gòu)在客觀世界中廣泛存在,如人類(lèi)社會(huì)的族譜和各種社會(huì)組織機(jī)構(gòu)都可用樹(shù)形象表示2022-01-01親手教你SpringBoot中的多數(shù)據(jù)源集成問(wèn)題
本文主要是介紹基于springboot的多數(shù)據(jù)源切換,輕量級(jí)的一種集成方案,對(duì)于小型的應(yīng)用可以采用這種方案,我之前在項(xiàng)目中用到是因?yàn)楹?jiǎn)單,便于擴(kuò)展以及優(yōu)化,對(duì)SpringBoot多數(shù)據(jù)源集成問(wèn)題感興趣的朋友一起看看吧2022-03-03