日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JDBC的开发流程是什么?

發(fā)布時間:2024/4/13 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDBC的开发流程是什么? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1、注冊驅動 (Class.forName) 2、獲得連接(DriverManager.getConnection()) 3、獲得執(zhí)行者對象 (通過連接對象獲取Statement或者PrepareStatement) 4、獲得結果集 (excuseUpdate或者excuseQuery方法后獲取ResultSet結果集) 5、結果集處理 6、釋放資源(依次關閉連接對象ResultSet/Statement/Connection)總結JDBC的問題:1. 頻繁創(chuàng)建數(shù)據(jù)庫連接對象,釋放。容易造成系統(tǒng)資源的浪費,從而影響系統(tǒng)性能。企業(yè)項目中可以使用 連接池解決這個問題,但是使用jdbc需要自己實現(xiàn)連接池。mybatis內部已經(jīng)提供了連接池。2. sql語句定義,參數(shù)設置,結果集處理存在硬編碼。3. 結果集處理存在重復代碼,處理麻煩。如果可以映射為java對象會比較方便。

JAVA JDBC常見問題

什么是JDBC,在什么時候會用到它?JDBC的全稱是Java DataBase Connection,也就是Java數(shù)據(jù)庫連接,我們可以用它來操作關系型數(shù)據(jù)庫。 JDBC接口及相關類在java.sql包和javax.sql包 里。我們可以用它來連接數(shù)據(jù)庫,執(zhí)行SQL查詢,存儲過程, 并處理返回的結果。JDBC接口讓Java程序和JDBC驅動實現(xiàn)了松耦合,使得切換不同的數(shù)據(jù)庫變得更加簡單。有哪些不同類型的JDBC驅動?和數(shù)據(jù)庫進行交互的Java程序分成兩個部分,一部分是JDBC的API,實際工作的驅動則是另一部分。JDBC是如何實現(xiàn)Java程序和JDBC驅動的松耦合的?JDBC API使用Java的反射機制來實現(xiàn)Java程序和JDBC驅動的松耦合。什么是JDBC連接,在Java中如何創(chuàng)建一個JDBC連接?JDBC連接是和數(shù)據(jù)庫服務器建立的一個會話。你可以想像成是一個和數(shù)據(jù)庫的Socket連接。創(chuàng)建JDBC連接很簡單,只需要兩步:A. 注冊并加載驅動:使用Class.forName(),驅動類就會注冊到DriverManager里面并加載到內存里。 B. 用DriverManager獲取連接對象:調用DriverManager.getConnnection()方法并傳入數(shù)據(jù)庫連接的URL, 用戶名及密碼,就能獲取到連接對象。Connection con = null; try{// load the Driver ClassClass.forName("com.mysql.jdbc.Driver");// create the connection nowcon = DriverManager.getConnection("jdbc:mysql://localhost:3306/DBName","username","password");}catch (SQLException e) {System.out.println("Check database is UP and configs are correct");e.printStackTrace();}catch (ClassNotFoundException e) {System.out.println("Please include JDBC MySQL jar in classpath");e.printStackTrace();} }JDBC的DriverManager是用來做什么的?JDBC的DriverManager是一個工廠類,我們通過它來創(chuàng)建數(shù)據(jù)庫連接。然后我們會把數(shù)據(jù)庫配置信息 傳成DriverManager.getConnection()方法,DriverManager會使用注冊到它里面的驅動來獲取數(shù)據(jù)庫 連接,并返回給調用的程序。在Java程序中,如何獲取數(shù)據(jù)庫服務器的相關信息?使用DatabaseMetaData可以獲取到服務器的信息。當和數(shù)據(jù)庫的連接成功建立了之后,可以通過 調用getMetaData()方法來獲取數(shù)據(jù)庫的元信息。DatabaseMetaData里面有很多方法,通過它們 可以獲取到數(shù)據(jù)庫的產(chǎn)品名稱,版本號,配置信息等。DatabaseMetaData metaData = con.getMetaData(); String dbProduct = metaData.getDatabaseProductName();JDBC的Statement是什么?Statement是JDBC中用來執(zhí)行數(shù)據(jù)庫SQL查詢語句的接口。通過調用連接對象的getStatement()方法我們 可以生成一個Statement對象。我們可以通過調用它的execute(),executeQuery(),executeUpdate() 方法來執(zhí)行靜態(tài)SQL查詢。默認情況下,一個Statement同時只能打開一個ResultSet。如果想操作多個ResultSet對象的話,需要創(chuàng)建 多個Statement。Statement接口的所有execute方法開始執(zhí)行時都默認會關閉當前打開的ResultSet。execute,executeQuery,executeUpdate的區(qū)別是什么?1.Statement的execute(String query)方法用來執(zhí)行任意的SQL查詢,如果查詢的結果是一個ResultSet, 這個方法就返回true。如果結果不是ResultSet,比如insert或者update查詢,它就會返回false。我們 可以通過它的getResultSet方法來獲取ResultSet,或者通過getUpdateCount()方法來獲取更新的記錄 條數(shù)。2.Statement的executeQuery(String query)接口用來執(zhí)行select查詢,并且返回ResultSet。即使查詢 不到記錄返回的ResultSet也不會為null。我們通常使用executeQuery來執(zhí)行查詢語句,這樣的話如果傳 進來的是insert或者update語句的話,它會拋出錯誤信息為 “executeQuery method can not be used for update”的java.util.SQLException。3.Statement的executeUpdate(String query)方法用來執(zhí)行insert或者update/delete(DML)語句, 或者 什么也不返回DDL語句。返回值是int類型,如果是DML語句的話,它就是更新的條數(shù),如果是DDL的 話,就返回0。4.只有當你不確定是什么語句的時候才應該使用execute()方法,否則應該使用executeQuery 或者executeUpdate方法。JDBC的PreparedStatement是什么?PreparedStatement對象代表的是一個預編譯的SQL語句。由于PreparedStatement是預編譯的,通過它 可以將對應的SQL語句高效的執(zhí)行多次。由于PreparedStatement自動對特殊字符轉義,避免了SQL注入 攻擊,因此應當盡量的使用它。相對于Statement,PreparedStatement的優(yōu)點是什么?它和Statement相比優(yōu)點在于: 1.PreparedStatement有助于防止SQL注入,因為它會自動對特殊字符轉義。 2.PreparedStatement可以用來進行動態(tài)查詢。 3.PreparedStatement執(zhí)行更快。尤其當你重用它或者使用它的拼量查詢接口執(zhí)行多條語句時。 4.使用PreparedStatement的setter方法更容易寫出面向對象的代碼,而Statement的話,我們得 拼接字符串來生成查詢語句。如果參數(shù)太多了,字符串拼接看起來會非常丑陋并且容易出錯。PreparedStatement的缺點是什么,怎么解決這個問題?PreparedStatement的一個缺點是,我們不能直接用它來執(zhí)行in條件語句;需要執(zhí)行IN條件語句的話, 下面有一些解決方案: 1.分別進行單條查詢——這樣做性能很差,不推薦。 2.使用存儲過程——這取決于數(shù)據(jù)庫的實現(xiàn),不是所有數(shù)據(jù)庫都支持。 3.使用存儲過程——這取決于數(shù)據(jù)庫的實現(xiàn),不是所有數(shù)據(jù)庫都支持。 4.在PreparedStatement查詢中使用NULL值——如果你知道輸入變量的最大個數(shù)的話,這是個不錯的辦法, 擴展一下還可以支持無限參數(shù)。JDBC的ResultSet是什么? 在查詢數(shù)據(jù)庫后會返回一個ResultSet,它就像是查詢結果集的一張數(shù)據(jù)表。Statement中的setFetchSize和setMaxRows方法有什么用處? 1.setMaxRows可以用來限制返回的數(shù)據(jù)集的行數(shù)。當然通過SQL語句也可以實現(xiàn)這個功能。比如在MySQL中 我們可以用LIMIT條件來設置返回結果的最大行數(shù)。 2.假設我們有一條查詢返回了100行數(shù)據(jù),我們把fetchSize設置成了10,那么數(shù)據(jù)庫驅動每次只會取10條 數(shù)據(jù),也就是說得取10次。當每條數(shù)據(jù)需要處理的時間比較長的時候并且返回數(shù)據(jù)又非常多的時候,這個 可選的參數(shù)就變得非常有用了。JDBC的批處理是什么,有什么好處? JDBC通過Statement和PreparedStatement中的addBatch和executeBatch方法來支持批處理。批處理比 一條條語句執(zhí)行的速度要快得多,因為它需要很少的數(shù)據(jù)庫調用.JDBC的事務管理是什么,為什么需要它? 默認情況下,我們創(chuàng)建的數(shù)據(jù)庫連接,是工作在自動提交的模式下的。這意味著只要我們執(zhí)行完一條查詢 語句,就會自動進行提交。有的時候我們希望由一組SQL查詢組成一個事務,如果它們都執(zhí)行OK我們再進行 提交,如果中途出現(xiàn)異常了,我們可以進行回滾。JDBC的DataSource是什么,有什么好處?DataSource即數(shù)據(jù)源,它是定義在javax.sql中的一個接口,跟DriverManager相比,它的功能要更強大。 1.緩存PreparedStatement以便更快的執(zhí)行 2.可以設置連接超時時間 3.提供日志記錄的功能 4.ResultSet大小的最大閾值設置 5.通過JNDI的支持,可以為servlet容器提供連接池的功能什么是數(shù)據(jù)庫的隔離級別?數(shù)據(jù)庫通過鎖來防止臟讀,不可重復讀(Non-Repeatable Reads)及幻讀(Phantom-Read)的問題。JDBC的RowSet是什么,有哪些不同的RowSet?RowSet用于存儲查詢的數(shù)據(jù)結果,和ResultSet相比,它更具靈活性。RowSet繼承自ResultSet, 因此ResultSet能干的,它們也能,而ResultSet做不到的,它們還是可以。RowSet接口定義在javax.sql 包里。RowSet提供的額外的特性有: 提供了Java Bean的功能,可以通過settter和getter方法來設置和獲取屬性JDBC里的CLOB和BLOB數(shù)據(jù)類型分別代表什么?CLOB意思是Character Large OBjects,字符大對象,它是由單字節(jié)字符組成的字符串數(shù)據(jù),有自己專門的 代碼頁。這種數(shù)據(jù)類型適用于存儲超長的文本信息,那些可能會超出標準的VARCHAR數(shù)據(jù)類型長度限制 (上限是32KB)的文本。BLOB是Binary Larget OBject,它是二進制大對象,由二進制數(shù)據(jù)組成,沒有專門的代碼頁。它能用于 存儲超過VARBINARY限制(32KB)的二進制數(shù)據(jù)。這種數(shù)據(jù)類型適合存儲圖片,聲音,圖形,或者其它業(yè)務 程序特定的數(shù)據(jù)。JDBC的臟讀是什么?哪種數(shù)據(jù)庫隔離級別能防止臟讀? 當我們使用事務時,有可能會出現(xiàn)這樣的情況,有一行數(shù)據(jù)剛更新,與此同時另一個查詢讀到了這個剛更新 的值。這樣就導致了臟讀,因為更新的數(shù)據(jù)還沒有進行持久化,更新這行數(shù)據(jù)的業(yè)務可能會進行回滾,這樣 這個數(shù)據(jù)就是無效的。數(shù)據(jù)庫的TRANSACTION_READCOMMITTED,TRANSACTION_REPEATABLEREAD, 和TRANSACTION_SERIALIZABLE隔離級別可以防止臟讀。JDBC中存在哪些不同類型的鎖?樂觀鎖——只有當更新數(shù)據(jù)的時候才會鎖定記錄。 悲觀鎖——從查詢到更新和提交整個過程都會對數(shù)據(jù)記錄進行加鎖。不僅如此,一些數(shù)據(jù)庫系統(tǒng)還提供了行鎖,表鎖等鎖機制。DDL和DML語句分別代表什么?DDL(數(shù)據(jù)定義語言,Data Definition Language)語句用來定義數(shù)據(jù)庫模式。Create,Alter, Drop, Truncate, Rename都屬于DDL語句,一般來說,它們是不返回結果的。DML(數(shù)據(jù)操作語言,Data Manipulation Language)語句用來操作數(shù)據(jù)庫中的數(shù)據(jù)。select,insert, update, delete, call等,都屬于DML語句。java.util.Date和java.sql.Date有什么區(qū)別? java.util.Date包含日期和時間,而java.sql.Date只包含日期信息,而沒有具體的時間信息。如何把圖片或者原始數(shù)據(jù)插入到數(shù)據(jù)庫中?可以使用BLOB類型將圖片或者原始的二進制數(shù)據(jù)存儲到數(shù)據(jù)庫里。什么是幻讀,哪種隔離級別可以防止幻讀?假設一個事務正根據(jù)某個條件進行數(shù)據(jù)查詢,然后另一個事務插入了一行滿足這個查詢條件的數(shù)據(jù)。 之后這個事務再次執(zhí)行了這條查詢,返回的結果集中會包含剛插入的那條新數(shù)據(jù)。這行新數(shù)據(jù)被稱為幻行, 而這種現(xiàn)象就叫做幻讀。什么是JDBC的最佳實踐?1.數(shù)據(jù)庫資源是非常昂貴的,用完了應該盡快關閉它。Connection, Statement, ResultSet等JDBC對象 都有close方法,調用它就好了。2.養(yǎng)成在代碼中顯式關閉掉ResultSet,Statement,Connection的習慣,如果你用的是連接池的話, 連接用完后會放回池里,但是沒有關閉的ResultSet和Statement就會造成資源泄漏了。3.在finally塊中關閉資源,保證即便出了異常也能正常關閉。4.大量類似的查詢應當使用批處理完成。5.盡量使用PreparedStatement而不是Statement,以避免SQL注入,同時還能通過預編譯和緩存機制提升執(zhí)行 的效率。6.如果你要將大量數(shù)據(jù)讀入到ResultSet中,應該合理的設置fetchSize以便提升性能。7.數(shù)據(jù)庫隔離級別越高性能越差,確保你的數(shù)據(jù)庫連接設置的隔離級別是最優(yōu)的。8.如果在WEB程序中創(chuàng)建數(shù)據(jù)庫連接,最好通過JNDI使用JDBC的數(shù)據(jù)源,這樣可以對連接進行重用。9.如果你需要長時間對ResultSet進行操作的話,盡量使用離線的RowSet。JDBC 編程的步驟? (1) 注冊驅動; (2) 獲取連接對象 Connection; (3) 創(chuàng)建 Statement 對象; (4) 運行 SQL 語句; (5) 處理結果; (6) 關閉連接釋放資源。

?

總結

以上是生活随笔為你收集整理的JDBC的开发流程是什么?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。