中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

山東省品牌建設(shè)工作委員會網(wǎng)站社會新聞最新消息

山東省品牌建設(shè)工作委員會網(wǎng)站,社會新聞最新消息,湛江做網(wǎng)站軟件,學(xué)網(wǎng)站開發(fā)需要會什么JDBC詳細(xì)介紹一、JDBC詳細(xì)介紹二、jdbc面試總結(jié)2.1 JDBC操作數(shù)據(jù)庫的步驟 ?2.2 JDBC中的Statement 和PreparedStatement,CallableStatement的區(qū)別?2.3 JDBC中大數(shù)據(jù)量的分頁解決方法?2.4 說說數(shù)據(jù)庫連接池工作原理和實(shí)現(xiàn)方案?2.4…

JDBC詳細(xì)介紹

  • 一、JDBC詳細(xì)介紹
  • 二、jdbc面試總結(jié)
    • 2.1 JDBC操作數(shù)據(jù)庫的步驟 ?
    • 2.2 JDBC中的Statement 和PreparedStatement,CallableStatement的區(qū)別?
    • 2.3 JDBC中大數(shù)據(jù)量的分頁解決方法?
    • 2.4 說說數(shù)據(jù)庫連接池工作原理和實(shí)現(xiàn)方案?
      • 2.4.1 工作原理
      • 2.4.2 實(shí)現(xiàn)方案
    • 2.5 Java中如何進(jìn)行事務(wù)的處理?
    • 2.6 修改JDBC代碼質(zhì)量
    • 2.7 寫出一段JDBC連接本機(jī)MySQL數(shù)據(jù)庫的代碼
    • 2.8 JDBC是如何實(shí)現(xiàn)Java程序和JDBC驅(qū)動的松耦合的?
    • 2.9 execute,executeQuery,executeUpdate的區(qū)別是什么?
    • 2.10 PreparedStatement的缺點(diǎn)是什么,怎么解決這個問題?
    • 2.11 JDBC的臟讀是什么?哪種數(shù)據(jù)庫隔離級別能防止臟讀?
    • 2.12. 什么是幻讀,哪種隔離級別可以防止幻讀?
    • 2.13 JDBC的DriverManager是用來做什么的?
    • 2.14 ResultSet
      • 2.14.1 JDBC的ResultSet是什么?
      • 2.14.2 有哪些不同的ResultSet?
    • 2.15 JDBC的DataSource是什么,有什么好處?
    • 2.16 常見的JDBC異常有哪些?
    • 2.17 JDBC的RowSet是什么,有哪些不同的RowSet?
    • 2.18 JDBC中存在哪些不同類型的鎖?
    • 2.19 什么是JDBC的最佳實(shí)踐?

一、JDBC詳細(xì)介紹

參考鏈接: JDBC詳細(xì)全解(示例超多)

在這里插入圖片描述

二、jdbc面試總結(jié)

2.1 JDBC操作數(shù)據(jù)庫的步驟 ?

  1. 注冊數(shù)據(jù)庫驅(qū)動。
  2. 建立數(shù)據(jù)庫連接。
  3. 創(chuàng)建一個Statement。
  4. 執(zhí)行SQL語句。
  5. 處理結(jié)果集。
  6. 關(guān)閉數(shù)據(jù)庫連接
    代碼如下:
Connection connection = null;Statement statement = null;ResultSet resultSet = null;try {/*加載驅(qū)動有兩種方式:* 1:會導(dǎo)致驅(qū)動會注冊兩次,過度依賴于mysql的api,脫離的mysql的開發(fā)包,程序則無法編譯* 2:驅(qū)動只會加載一次,不需要依賴具體的驅(qū)動,靈活性高*我們一般都是使用第二種方式* *///1.//DriverManager.registerDriver(new com.mysql.jdbc.Driver());//2.Class.forName("com.mysql.jdbc.Driver");//獲取與數(shù)據(jù)庫連接的對象-Connetcionconnection = DriverManager.getConnection("jdbc:mysql://localhost:3306/zhongfucheng", "root", "root");//獲取執(zhí)行sql語句的statement對象statement = connection.createStatement();//執(zhí)行sql語句,拿到結(jié)果集resultSet = statement.executeQuery("SELECT * FROM users");//遍歷結(jié)果集,得到數(shù)據(jù)while (resultSet.next()) {System.out.println(resultSet.getString(1));System.out.println(resultSet.getString(2));}} catch (SQLException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();} finally {/*關(guān)閉資源,后調(diào)用的先關(guān)閉* 關(guān)閉之前,要判斷對象是否存在* */if (resultSet != null) {try {resultSet.close();} catch (SQLException e) {e.printStackTrace();}}if (statement != null) {try {statement.close();} catch (SQLException e) {e.printStackTrace();}}if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}

2.2 JDBC中的Statement 和PreparedStatement,CallableStatement的區(qū)別?

區(qū)別:

  • PreparedStatement:是預(yù)編譯的SQL語句,效率高于Statement。
  • PreparedStatement:支持操作符,相對于Statement更加靈活。
  • PreparedStatement:可以防止SQL注入,安全性高于Statement。
  • CallableStatement:適用于執(zhí)行存儲過程。

2.3 JDBC中大數(shù)據(jù)量的分頁解決方法?

?最好的辦法是利用sql語句進(jìn)行分頁,這樣每次查詢出的結(jié)果集中就只包含某頁的數(shù)據(jù)內(nèi)容。

mysql語法:
1
oracle語法:
2

2.4 說說數(shù)據(jù)庫連接池工作原理和實(shí)現(xiàn)方案?

2.4.1 工作原理

??JAVA EE服務(wù)器啟動時會建立一定數(shù)量的池連接,并一直維持不少于此數(shù)目的池連接??蛻舳顺绦蛐枰B接時,池驅(qū)動程序會返回一個未使用的池連接并將其標(biāo)記為忙。如果當(dāng)前沒有空閑連接,池驅(qū)動程序就新建一定數(shù)量的連接,新建連接的數(shù)量由配置參數(shù)決定。當(dāng)使用的池連接調(diào)用完成后,池驅(qū)動程序?qū)⒋诉B接標(biāo)記為空閑,其他調(diào)用就可以使用這個連接。

2.4.2 實(shí)現(xiàn)方案

??連接池使用集合來進(jìn)行裝載,返回的Connection是原始Connection的代理,代理Connection的close方法,當(dāng)調(diào)用close方法時,不是真正關(guān)連接,而是把它代理的Connection對象放回到連接池中,等待下一次重復(fù)利用。

代碼如下:
3

2.5 Java中如何進(jìn)行事務(wù)的處理?

??事務(wù)是作為單個邏輯工作單元執(zhí)行的一系列操作。一個邏輯工作單元必須有四個屬性 (ACID) ,稱為原子性、一致性、隔離性和持久性,只有這樣才能成為一個事務(wù)。
Connection類中提供了4個事務(wù)處理方法:

  • setAutoCommit(Boolean autoCommit):設(shè)置是否自動提交事務(wù),默認(rèn)為自動提交,即為true,通過設(shè)置false禁止自動提交事務(wù);
  • commit():提交事務(wù);
  • rollback():回滾事務(wù).
  • savepoint:保存點(diǎn)
    注意:savepoint不會結(jié)束當(dāng)前事務(wù),普通提交和回滾都會結(jié)束當(dāng)前事務(wù)的

2.6 修改JDBC代碼質(zhì)量

?下述程序是一段簡單的基于JDBC的數(shù)據(jù)庫訪問代碼,實(shí)現(xiàn)了以下功能:從數(shù)據(jù)庫中查詢product表中的所有記錄,然后打印輸出到控制臺.該代碼質(zhì)量較低,如沒有正確處理異常,連接字符串以”魔數(shù)”的形式直接存在于代碼中等,請用你的思路重新編寫程序,完成相同的功能,提高代碼質(zhì)量。

修改前代碼:
4

修改的點(diǎn):
1、url、password等信息不應(yīng)該直接使用字符串“寫死”,可以使用常量代替
2、catch中應(yīng)該回滾事務(wù),拋出RuntimeException也是回滾事務(wù)的一種方法
3、關(guān)閉資源

修改后代碼:5
6

2.7 寫出一段JDBC連接本機(jī)MySQL數(shù)據(jù)庫的代碼

7

2.8 JDBC是如何實(shí)現(xiàn)Java程序和JDBC驅(qū)動的松耦合的?

?通過制定接口,數(shù)據(jù)庫廠商來實(shí)現(xiàn)。我們只要通過接口調(diào)用即可。隨便看一個簡單的JDBC示例,你會發(fā)現(xiàn)所有操作都是通過JDBC接口完成的,而驅(qū)動只有在通過Class.forName反射機(jī)制來加載的時候才會出現(xiàn)。

2.9 execute,executeQuery,executeUpdate的區(qū)別是什么?

  1. execute:
    ?Statement的execute(String query)方法用來執(zhí)行任意的SQL查詢,如果查詢的結(jié)果是一個ResultSet,這個方法就返回true。如果結(jié)果不是ResultSet,比如insert或者update查詢,它就會返回false。我們可以通過它的getResultSet方法來獲取ResultSet,或者通過getUpdateCount()方法來獲取更新的記錄條數(shù)。
  2. executeQuery:
    ?Statement的executeQuery(String query)接口用來執(zhí)行select查詢,并且返回ResultSet。即使查詢不到記錄返回的ResultSet也不會為null。我們通常使用executeQuery來執(zhí)行查詢語句,這樣的話如果傳進(jìn)來的是insert或者update語句的話,它會拋出錯誤信息為 “executeQuery method can not be used for update”的java.util.SQLException。
  3. executeUpdate:
    ?Statement的executeUpdate(String query)方法用來執(zhí)行insert或者update/delete(DML)語句,或者 什么也不返回DDL語句。返回值是int類型,如果是DML語句的話,它就是更新的條數(shù),如果是DDL的話,就返回0。

注意:只有當(dāng)你不確定是什么語句的時候才應(yīng)該使用execute()方法,否則應(yīng)該使用executeQuery或者executeUpdate方法。

2.10 PreparedStatement的缺點(diǎn)是什么,怎么解決這個問題?

PreparedStatement的一個缺點(diǎn)是,我們不能直接用它來執(zhí)行in條件語句;需要執(zhí)行IN條件語句的話,下面有一些解決方案:

  • 分別進(jìn)行單條查詢——這樣做性能很差,不推薦。
  • 使用存儲過程——這取決于數(shù)據(jù)庫的實(shí)現(xiàn),不是所有數(shù)據(jù)庫都支持。
  • 動態(tài)生成PreparedStatement——這是個好辦法,但是不能享受PreparedStatement的緩存帶來的好處了。在PreparedStatement查詢中使用NULL值——如果你知道輸入變量的最大個數(shù)的話,這是個不錯的辦法,擴(kuò)展一下還可以支持無限參數(shù)。

2.11 JDBC的臟讀是什么?哪種數(shù)據(jù)庫隔離級別能防止臟讀?

臟讀:一個事務(wù)讀取到另外一個事務(wù)未提交的數(shù)據(jù)

例子:A向B轉(zhuǎn)賬,A執(zhí)行了轉(zhuǎn)賬語句,但A還沒有提交事務(wù),B讀取數(shù)據(jù),發(fā)現(xiàn)自己賬戶錢變多了!B跟A說,我已經(jīng)收到錢了。A回滾事務(wù)【rollback】,等B再查看賬戶的錢時,發(fā)現(xiàn)錢并沒有多。

下面的三種個隔離級別都可以防止:

  • 已讀提交: Read committed【TRANSACTION_READ_COMMITTED】
  • 可重復(fù)讀: Repeatable read【TRANSACTION_REPEATABLE_READ】
  • 串行化:Serializable【TRANSACTION_SERIALIZABLE】

2.12. 什么是幻讀,哪種隔離級別可以防止幻讀?

幻讀是指在一個事務(wù)內(nèi)讀取到了別的事務(wù)插入的數(shù)據(jù),導(dǎo)致前后讀取不一致。
只有串行化(TRANSACTION_SERIALIZABLE)隔離級別才能防止產(chǎn)生幻讀。

2.13 JDBC的DriverManager是用來做什么的?

?JDBC的DriverManager是一個工廠類,我們通過它來創(chuàng)建數(shù)據(jù)庫連接。當(dāng)JDBC的Driver類被加載進(jìn)來時,它會自己注冊到DriverManager類里面。然后我們會把數(shù)據(jù)庫配置信息傳成DriverManager.getConnection()方法,DriverManager會使用注冊到它里面的驅(qū)動來獲取數(shù)據(jù)庫連接,并返回給調(diào)用的程序。

2.14 ResultSet

2.14.1 JDBC的ResultSet是什么?

在查詢數(shù)據(jù)庫后會返回一個ResultSet,它就像是查詢結(jié)果集的一張數(shù)據(jù)表。
?ResultSet對象維護(hù)了一個游標(biāo),指向當(dāng)前的數(shù)據(jù)行。開始的時候這個游標(biāo)指向的是第一行。如果調(diào)用了ResultSet的next()方法游標(biāo)會下移一行,如果沒有更多的數(shù)據(jù)了,next()方法會返回false??梢栽趂or循環(huán)中用它來遍歷數(shù)據(jù)集。
?默認(rèn)的ResultSet是不能更新的,游標(biāo)也只能往下移。也就是說你只能從第一行到最后一行遍歷一遍。不過也可以創(chuàng)建可以回滾或者可更新的ResultSet
當(dāng)生成ResultSet的Statement對象要關(guān)閉或者重新執(zhí)行或是獲取下一個ResultSet的時候,ResultSet對象也會自動關(guān)閉。
?可以通過ResultSet的getter方法,傳入列名或者從1開始的序號來獲取列數(shù)據(jù)。

2.14.2 有哪些不同的ResultSet?

?根據(jù)創(chuàng)建Statement時輸入?yún)?shù)的不同,會對應(yīng)不同類型的ResultSet。如果你看下Connection的方法,你會發(fā)現(xiàn)createStatement和prepareStatement方法重載了,以支持不同的ResultSet和并發(fā)類型。
?一共有三種ResultSet對象。

  1. ResultSet.TYPE_FORWARD_ONLY:這是默認(rèn)的類型,它的游標(biāo)只能往下移。
  2. ResultSet.TYPE_SCROLL_INSENSITIVE:游標(biāo)可以上下移動,一旦它創(chuàng)建后,數(shù)據(jù)庫里的數(shù)據(jù)再發(fā)生修改,對它來說是透明的。
  3. ResultSet.TYPE_SCROLL_SENSITIVE:游標(biāo)可以上下移動,如果生成后數(shù)據(jù)庫還發(fā)生了修改操作,它是能夠感知到的。

?ResultSet有兩種并發(fā)類型。

  • ResultSet.CONCUR_READ_ONLY:ResultSet是只讀的,這是默認(rèn)類型。
  • ResultSet.CONCUR_UPDATABLE:我們可以使用ResultSet的更新方法來更新里面的數(shù)據(jù)。

2.15 JDBC的DataSource是什么,有什么好處?

?DataSource即數(shù)據(jù)源,它是定義在javax.sql中的一個接口,跟DriverManager相比,它的功能要更強(qiáng)大。我們可以用它來創(chuàng)建數(shù)據(jù)庫連接,當(dāng)然驅(qū)動的實(shí)現(xiàn)類會實(shí)際去完成這個工作。除了能創(chuàng)建連接外,它還提供了如下的特性:

  1. 緩存PreparedStatement以便更快的執(zhí)行
  2. 可以設(shè)置連接超時時間
  3. 提供日志記錄的功能
  4. ResultSet大小的最大閾值設(shè)置
  5. 通過JNDI的支持,可以為servlet容器提供連接池的功能

2.16 常見的JDBC異常有哪些?

有以下這些:

  • java.sql.SQLException:這是JDBC異常的基類。
  • java.sql.BatchUpdateException:當(dāng)批處理操作執(zhí)行失敗的時候可能會拋出這個異常。這取決于具體的JDBC驅(qū)動的實(shí)現(xiàn),它也可能直接拋出基類異常java.sql.SQLException。
  • java.sql.SQLWarning:SQL操作出現(xiàn)的警告信息。
  • java.sql.DataTruncation:字段值由于某些非正常原因被截?cái)嗔?#xff08;不是因?yàn)槌^對應(yīng)字段類型的長度限制)。

問題1: SQLWarning是什么,在程序中如何獲取SQLWarning?
??SQLWarning是SQLException的子類,通過Connection, Statement, Result的getWarnings方法都可以獲取到它。 SQLWarning不會中斷查詢語句的執(zhí)行,只是用來提示用戶存在相關(guān)的警告信息。

如果java.sql.SQLException: No suitable driver found該怎么辦?
??如果你的SQL URL串格式不正確的話,就會拋出這樣的異常。不管是使用DriverManager還是JNDI數(shù)據(jù)源來創(chuàng)建連接都有可能拋出這種異常。它的異常??雌饋頃裣旅孢@樣。
2
解決這類問題的方法就是,檢查下日志文件,像上面的這個日志中,URL串是’jdbc:mysql://localhost:3306/UserDB,只要把它改成jdbc:mysql://localhost:3306/UserDB就好了。

2.17 JDBC的RowSet是什么,有哪些不同的RowSet?

?RowSet用于存儲查詢的數(shù)據(jù)結(jié)果,和ResultSet相比,它更具靈活性。RowSet繼承自ResultSet,因此ResultSet能干的,它們也能,而ResultSet做不到的,它們還是可以。RowSet接口定義在javax.sql包里。
?RowSet提供的額外的特性有:

  1. 提供了Java Bean的功能,可以通過settter和getter方法來設(shè)置和獲取屬性。RowSet使用了JavaBean的事件驅(qū)動模型,它可以給注冊的組件發(fā)送事件通知,比如游標(biāo)的移動,行的增刪改,以及RowSet內(nèi)容的修改等。
  2. RowSet對象默認(rèn)是可滾動,可更新的,因此如果數(shù)據(jù)庫系統(tǒng)不支持ResultSet實(shí)現(xiàn)類似的功能,可以使用RowSet來實(shí)現(xiàn)。
    ?RowSet分為兩大類:
  • 連接型RowSet:這類對象與數(shù)據(jù)庫進(jìn)行連接,和ResultSet很類似。JDBC接口只提供了一種連接型RowSet,javax.sql.rowset.JdbcRowSet,它的標(biāo)準(zhǔn)實(shí)現(xiàn)是com.sun.rowset.JdbcRowSetImpl。
  • 離線型RowSet:這類對象不需要和數(shù)據(jù)庫進(jìn)行連接,因此它們更輕量級,更容易序列化。它們適用于在網(wǎng)絡(luò)間傳遞數(shù)據(jù)。
    ?有四種不同的離線型RowSet的實(shí)現(xiàn)。
  • CachedRowSet:可以通過他們獲取連接,執(zhí)行查詢并讀取ResultSet的數(shù)據(jù)到RowSet里。我們可以在離線時對數(shù)據(jù)進(jìn)行維護(hù)和更新,然后重新連接到數(shù)據(jù)庫里,并回寫改動的數(shù)據(jù)。
  • WebRowSet:繼承自CachedRowSet,他可以讀寫XML文檔。
  • JoinRowSet:繼承自WebRowSet,它不用連接數(shù)據(jù)庫就可以執(zhí)行SQL的join操作。
  • FilteredRowSet:繼承自WebRowSe,我們可以用它來設(shè)置過濾規(guī)則,這樣只有選中的數(shù)據(jù)才可見。

2.18 JDBC中存在哪些不同類型的鎖?

從廣義上講,有兩種鎖機(jī)制來防止多個用戶同時操作引起的數(shù)據(jù)損壞。

  1. 樂觀鎖:只有當(dāng)更新數(shù)據(jù)的時候才會鎖定記錄。
  2. 悲觀鎖:從查詢到更新和提交整個過程都會對數(shù)據(jù)記錄進(jìn)行加鎖。

2.19 什么是JDBC的最佳實(shí)踐?

  1. 數(shù)據(jù)庫資源是非常昂貴的,用完了應(yīng)該盡快關(guān)閉它。Connection, Statement, ResultSet等JDBC對象都有close方法,調(diào)用它就好了。
  2. 養(yǎng)成在代碼中顯式關(guān)閉掉ResultSet,Statement,Connection的習(xí)慣,如果你用的是連接池的話,連接用完后會放回池里,但是沒有關(guān)閉的ResultSet和Statement就會造成資源泄漏了。
  3. 在finally塊中關(guān)閉資源,保證即便出了異常也能正常關(guān)閉。
  4. 大量類似的查詢應(yīng)當(dāng)使用批處理完成。
  5. 盡量使用PreparedStatement而不是Statement,以避免SQL注入,同時還能通過預(yù)編譯和緩存機(jī)制提升執(zhí)行的效率。
  6. 如果你要將大量數(shù)據(jù)讀入到ResultSet中,應(yīng)該合理的設(shè)置fetchSize以便提升性能。
  7. 你用的數(shù)據(jù)庫可能沒有支持所有的隔離級別,用之前先仔細(xì)確認(rèn)下。
  8. 數(shù)據(jù)庫隔離級別越高性能越差,確保你的數(shù)據(jù)庫連接設(shè)置的隔離級別是最優(yōu)的。
  9. 如果在WEB程序中創(chuàng)建數(shù)據(jù)庫連接,最好通過JNDI使用JDBC的數(shù)據(jù)源,這樣可以對連接進(jìn)行重用。
  10. 如果你需要長時間對ResultSet進(jìn)行操作的話,盡量使用離線的RowSet。
http://www.risenshineclean.com/news/2414.html

相關(guān)文章:

  • 今天31個省新增最新消息視頻鄭州抖音seo
  • 北京品牌型網(wǎng)站建設(shè)靠譜南京谷歌seo
  • b2c購物網(wǎng)站系統(tǒng)百度客服24小時人工服務(wù)在線咨詢
  • 云南本地企業(yè)做網(wǎng)站公司網(wǎng)站如何推廣
  • 個人電子商務(wù)網(wǎng)站建設(shè)杭州優(yōu)化外包
  • 淄博企業(yè)網(wǎng)站建設(shè)公司鄭州seo網(wǎng)絡(luò)營銷
  • 如何做英文網(wǎng)站的外鏈廈門百度競價推廣
  • 哪些網(wǎng)站比較容易做鎮(zhèn)江推廣公司
  • 網(wǎng)站圖怎么做會高清超能搜索引擎系統(tǒng)網(wǎng)站
  • c 做網(wǎng)站怎么顯示歌詞百度推廣有哪些推廣方式
  • 西安企業(yè)網(wǎng)站建站全球搜效果怎么樣
  • 上海 網(wǎng)站建設(shè) 外包百度教育app
  • 中山網(wǎng)站建設(shè)文化機(jī)構(gòu)域名批量查詢注冊
  • yeti2.0 wordpress主題怎么優(yōu)化自己網(wǎng)站
  • 企業(yè)畫冊設(shè)計(jì)排版360優(yōu)化大師最新版的功能
  • 大良營銷網(wǎng)站建設(shè)平臺北京百度seo點(diǎn)擊器
  • 網(wǎng)站建設(shè)招標(biāo)2017seo短期培訓(xùn)班
  • 企業(yè)網(wǎng)站建設(shè)合同范本平板電視seo優(yōu)化關(guān)鍵詞
  • 建站費(fèi)用報價單崇左網(wǎng)站建設(shè)
  • 如何把網(wǎng)站做成軟件哈爾濱百度推廣公司
  • 英語培訓(xùn)網(wǎng)站模板亞馬遜seo是什么意思
  • 原創(chuàng)小說網(wǎng)站建設(shè)源碼百度seo公司哪家最好
  • 深圳哪個做網(wǎng)站好優(yōu)化唐山公司做網(wǎng)站
  • 公司網(wǎng)站域名管理中國50強(qiáng)企業(yè)管理培訓(xùn)機(jī)構(gòu)
  • 高端做網(wǎng)站廣東vs北京首鋼
  • 免費(fèi)設(shè)計(jì)自己的名字合肥網(wǎng)站推廣優(yōu)化公司
  • vps 部署wordpressseo攻略
  • 建設(shè)網(wǎng)站過程seo網(wǎng)絡(luò)推廣有哪些
  • 做網(wǎng)站建設(shè)推廣好做嗎營銷軟件培訓(xùn)
  • 換模板搭建網(wǎng)站怎么做營銷100個引流方案