20155207 2016-2017-2 《Java程序設計》第九周學習總結

20155207 2016-2017-2 《Java程序設計》第九周學習總結

教材學習內容總結

第16章 整合數據庫

16.1 JDBC入門

16.1.1 JDBC簡介
  • 數據庫自己是個獨立運行的應用程序
  • 撰寫應用程序是利用通訊協議對數據庫進行指令交換,以進行數據的增刪查找
  • JDBC能夠解決更換數據庫、應用跨平臺的需求
  • JDBC(Java DataBase Connectivity)是Java聯機數據庫的標準規範,定義一組標準類與接口,應用程序須要聯機數據庫時調用這組標準API,標準API中接口會由數據庫廠商操做,稱爲JDBC驅動程序
  • JDBC標準分爲兩部分:JDBC應用程序開發者接口、JDBC驅動程序開發者接口(數據庫廠商操做驅動程序時的規範)
  • 調用JDBC應用程序開發者接口,相關API主要在java.sql與javax.sql兩個包中
  • 聯機數據庫,須要在classpath中設定JDBC驅動程序
  • JDBC目的:讓Java程序設計人員在撰寫數據庫操做程序時能夠有個統一的接口,無須依賴特定的數據庫API,「寫一個Java程序,操做全部數據庫」
  • 依操做方式將驅動程序分爲四種類型:(1)Type1:JDBC-ODBC Bridge Driver:由Microsoft主導的數據庫鏈接標準,參考ODBC制定而來(2)Type2:Native API Driver:會以原生方式,調用數據庫提供的原生數據庫,JDBC的方法調用會轉換爲原生連接庫,4種類型中最快的驅動程序,使用前必須先在各平臺進行驅動程序的安裝設定(3)Type3:JDBC-Net Driver:將JDBC方法轉換爲特定的網絡協議調用,目的是遠程與數據庫特定的中介服務器或組件,中介服務器或組件再與數據庫進行操做,能夠跨程序,更換數據庫系統只需更換中介組件,彈性好,速度慢(4)Type4:Native Protocol Driver:驅動程序會將JDBC調用轉換爲與數據庫特定的網絡協議,跨程序,彈性沒有Type3好,最多見的驅動器類型html

    16.1.2 鏈接數據庫
  • 鏈接數據庫,必需要有廠商操做的JDBC驅動程序,必須在CLASSPATH中設定驅動程序JAR文檔
  • 要取得數據庫聯機,必須的幾個動做
    • 註冊Driver操做對象
    • 取得Connection操做對象
    • 關閉Connection操做對象
  • 1.註冊Driver操做對象
    • 管理Driver操做對象的類是java.sql.DriverManager,必須調用其靜態方法registerDriver()進行註冊
    • 加載Driver接口的操做類.calss文檔,就會完成註冊,能夠經過java.lang.class類的forName()動態加載驅動程序類
    • 使用JDBC加載.class文件方法有四種:(1)使用Class.forName()(2)自行創建Driver操做接口類的實例(直接撰寫代碼java.sql.Driver driver = new com.mysql.jdbc.Driver())(3)啓動JVM時指定jdbc.drivers屬性(執行java命令時java -Djdbc.drivers=com.mysql.jdbc.Driver;XXXDriver YourProgram)指定多個驅動程序類,用分號間隔(4)設定JAR中/service/java.sql.Driver文檔
  • 2.取得Connection操做對象
    • Connection接口的操做對象是數據庫聯機表明對象,取得Connection對象,經過DriverManager的getConnection(),例Connectin conn = DriverManager.getConnection(jdbcUrl,username,password);(JDBC URL定義了鏈接數據庫時的協議:子協議:數據源識別)
    • 「協議」在JDBC URL中老是jdbc開始,「子協議」是橋接的驅動程序、數據庫產品名稱或聯機機制,「數據源識別」標出數據庫的地址、端口號、名稱、用戶、密碼等信息
  • 3.關閉Connection操做對象
    • 取得Connection對象後,使用isClosed()方法測試與數據庫的鏈接是否關閉,再也不須要鏈接必須使用close()來關閉與數據庫的鏈接,以釋放鏈接時相關的必要資源,可使用嘗試自動關閉資源語法java

      16.1.3 使用Statement、ResultSet
  • 執行SQL,必須取得java.sql.Statement,使用Connection的createStatement()創建Statement對象
  • 使用Connnection的createStatement()創建Statement對象
  • 取得Statement對象後,使用executeUpdate()(在表中插入一筆數據,返回int結果,表示數據變更的筆數)、executeQuery()(用於SELECT等查詢數據庫的SQL,返回java.sql.ResultSet對象,表明查詢結果,會是一筆一筆的數據)
  • 使用resultSet的next()移動至下一筆數據,返回true或false表示是否有下一筆數據,接着可使用getXXX()取得數據
  • Statement的execute()能夠用來執行SQL,並可測試SQL是執行查詢或更新,返回true表示SQL執行將返回ReaultSet做爲查詢結果,可使用getResultSet()取得ResultSet結果,返回false,表示SQL執行會返回更新筆數或沒有結果,能夠用getUpdateCount()取得更新筆數
  • Statement或ResultSet不使用時,使用close()關掉,Statement關閉時,所關聯的ResultSet也會自動關閉mysql

    16.1.4 使用PreparedStatement、Callabletatement
  • Statement在執行executeQuery()executeUpdate()時,若是有些部分是動態的數據,必須用+連字符串接字符串以組成完整的SQL語句
  • 若是有些操做只是SQL語句當中某些參數不一樣,其他SQL子句皆相同,使用java.sql.PrepareStatement,使用Connection的preparedStatement()方法創建好預先編譯好的SQL語句,用「?」代替參數中會變更的部分,須要真正指定參數執行時,再使用setInt()setString()等方法指定「?」處應有的參數
  • 執行executeQuery()executeUpdate()方法後,能夠調用clearParameters()清除設置的參數,以後就能再次使用這個PreparedStatement實例
  • 撰寫數據庫的預存程序,並想使用JDBC來調用,可使用java.sql.CallableStatement
  • java.sql.CallableStatement的API使用與PreparedStatement差異不大,除了必須調用prepareCall()創建CallableStatement異常以外,同樣是使用setXXX()設定參數,查詢操做使用executeQuery(),更新操做使用executeUpdate(),使用registerOutParameter()註冊輸出參數
  • 使用PreparedStatementCallableStatement時,注意SQL類型與Java數據類型的對應
  • 日期在JDBC中,並非使用java.util.Date,這個對象可表明的日期格式是「年、月、日、時、分、秒、毫秒」,JDBC表示日期,用java.sql.Date,日期格式是「年、月、日」,表示時間使用java.sql.Time,時間格式爲「時、分、秒」,java.sql.Timestamp格式「時、分、秒、微秒」
  • 對於TimeStamp實例,可使用toInstant()方法將之轉爲Instant實例,Instant實例能夠經過TimeStampe的from()靜態方法將之轉爲TimeStampe實例git

    16.2 JDBC進階

    16.2.1 使用DataSource取得聯機
  • MessageDAO依賴於javax.sql.DataSource接口,能夠經過其自定義的getConnection()方法取得Connection正則表達式

    16.2.2 使用ResultSet捲動、更新
  • ResultSet時可默認使用next()移動數據光標至下一筆數據,然後使用getXXX()方法來取得數據
  • 使用Connection的createStatement()prepareStatement()方法創建Statement或PreparedStatement實例時,能夠指定結果集類型與並行方式
    • 結果集類型能夠指定3種設定
    • ResultSet.TYPE_FORWARD_ONLY(默認)
    • ResultSet.TYPE_SCROLL_INSENSITIVE
    • ResultSet.TYPE_SCROLL_SENSITIVE
    • 更新設定有兩種指定
    • ResultSet.CONCUR_READ_ONLY(默認)
    • ResultSet.CONCUR_UPDATABLE
  • 使用absolute()afterlast()beforeFirst()first()last()進行絕對位置移動,使用relative()previous()next()進行相對位置移動,成功返回true,使用isAfterLast()isBeforeFirst()isFirst()isLast()判斷目前位置
  • 使用ResultSet進行數據修改有條件限制
    • 必須選取單一表格
    • 必須選取主鍵
    • 必須選取NOT NULL的值sql

      16.2.3 批次更新
  • 使用addBatch()方法來收集SQL,並使用executeBatch()方法將所收集的SQL傳送出去
  • SQL的執行順序就是addBath()時的順序數據庫

    16.2.4 Blob與Clob
  • 文檔寫入數據庫,能夠在數據庫表格字段上使用BLOB(Binary Large Object),用於存儲大量的二進制數據或CLOB數據類型(Character Large Object),用於儲存大量的文字數據
  • JDBC中提供了java.sql.Blob與java.sql.Clob兩個類分別表明BLOB與CLOB數據
  • 經過PreparedStatement的setBlob()來設定Blob對象,讀取數據時,能夠經過ResultSet的getBlob()取得Blob對象服務器

    16.2.5 交易簡介
  • 交易的4個基本要求是原子性、一致性、隔離行爲與持續性(ACID)
  • JDBC能夠操做能夠操做Connection的setAutoCommit()方法,給它false自變量,提示數據庫開始交易
  • 下達一連串的SQL語句後,自行調用Connection的commit(),提示數據庫確認操做,中間發生錯誤,調用rollback(),提示數據庫撤銷全部的執行
  • 隔離行爲的支持上,JDBC能夠經過Connection的getTransactionIsolation()取得數據庫目前的隔離行爲設定,經過setTransactionIsolation()可提示數據庫設定指定的隔離行爲,可設定常數是定義在Connection上
    • 對交易不設定隔離行爲TRANSACTION_NONE
    • 更新遺失,設定隔離層爲「可讀取未確認」TRANSACTION_UNCOMMITTED
    • 髒讀,設定隔離層爲「可讀取確認」TRANSACTION_COMMITTED
    • 沒法重複的讀取,設定隔離層爲「可重複讀取」TRANSACTION_REPEATABLE_READ
    • 幻讀,設定隔離層爲「可循序」TRANSACTION_SERIALIZABLE網絡

      16.2.6 metadata簡介
  • 詮釋數據的數據
  • JDBC,經過Connection的getMetaData()方法取得DatabasemetaData對象,經過該對象提供的方法取得數據庫總體信息,Result表示查詢到的數據學習

    16.2.7 RowSet簡介
  • JDBC定義了javax.sql.RowSet接口,用以表明數據的列集合
  • RowSet定義了列列集合基本行爲,其下有JdbcRowSet(聯機式的)、CachedRowSet(脫機式的)、FilteredRowSet、JoinRowSet與WebRowSet五個標準列操做子接口,定義在javax.sql.rowset

教材學習中的問題和解決過程

  • 問題:區分不了幻讀與沒法重複的讀取,隔離層級「可重複讀取」、「可循序」
  • 解決過程:結合教材的圖解,「可重複讀取」針對兩次交易讀取數據不一致,同一交易讀取數據必須相同的狀況,「可循序」針對同一交易期間讀取到的數據不一致,在數據不一致時,交易能夠照順序逐一進行

代碼調試中的問題和解決過程

本週代碼調試沒有錯誤

代碼託管

上週考試錯題總結

  • 『問題一』NIO2中,可使用(D)中的方法取出文件系統根目錄信息。
    A .Path

B .DirectoryStream

C .FileStore

D .FileSystem

『考點』:FileSystem的getRootDirectorie方法能夠取出文件系統根目錄信息。對NIO各個方法還不夠熟悉。

  • 正則表達式」(‘|」)(.*?)\1」匹配 「'Hello',"World」」的結果是()
    A .不匹配
    B .'Hello'
    C ."World"
    D .'Hello',"World"
    解析:反向引用 \1 表明第一個()中的匹配內容。錯題緣由:漏選

  • 正則表達式 r.t 可以匹配字符串()
    A .rat
    B .rt
    C .rut
    D .root
    正確答案: A C
    r.t 表示 r開着,中間爲任意字符接着爲t的三字母字符串

  • abc? 匹配( )
    A .
    ab
    B .
    abc
    C .
    abcc
    D .
    abccc

答案:AB

解析: ? 重複0或1次……

結對及互評

評分標準

  1. 正確使用Markdown語法(加1分):
    • 不使用Markdown不加分
    • 有語法錯誤的不加分(連接打不開,表格不對,列表不正確...)
    • 排版混亂的不加分
  2. 模板中的要素齊全(加1分)
    • 缺乏「教材學習中的問題和解決過程」的不加分
    • 缺乏「代碼調試中的問題和解決過程」的不加分
    • 代碼託管不能打開的不加分
    • 缺乏「結對及互評」的不能打開的不加分
    • 缺乏「上週考試錯題總結」的不能加分
    • 缺乏「進度條」的不能加分
    • 缺乏「參考資料」的不能加分
  3. 教材學習中的問題和解決過程, 一個問題加1分

  4. 代碼調試中的問題和解決過程, 一個問題加1分

  5. 本週有效代碼超過300分行的(加2分)
    • 一週提交次數少於20次的不加分
  6. 其餘加分:
    • 週五前發博客的加1分
    • 感想,體會不假大空的加1分
    • 排版精美的加一分
    • 進度條中記錄學習時間與改進狀況的加1分
    • 有動手寫新代碼的加1分
    • 課後選擇題有驗證的加1分
    • 代碼Commit Message規範的加1分
    • 錯題學習深刻的加1分
    • 點評認真,能指出博客和代碼中的問題的加1分
    • 結對學習狀況真實可信的加1分
  7. 扣分:
    • 有抄襲的扣至0分
    • 代碼做弊的扣至0分
    • 遲交做業的扣至0分

點評模板:

  • 博客中值得學習的或問題:
    • xxx
    • xxx
    • ...
  • 代碼中值得學習的或問題:
    • xxx
    • xxx
    • ...
  • 基於評分標準,我給本博客打分:XX分。得分狀況以下:xxx

  • 參考示例

點評過的同窗博客和代碼

其餘(感悟、思考等,可選)

本週學習了數據庫及其在Java中對應的操做,開始不是很明白,百度關於SQL的一些知識,就懂了許多

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 0/0 2/2 20/20
第二週 186/186 2/4 18/38
第三週 689/875 3/7 22/60
第四周 242/1117 2/9 30/90
第五週 698/1815 2/9 30/120
第六週 1269/3084 2/9 30/120
第七週 342/3426 2/9 30/120
第八週 398/3824 2/9 30/120
第九周 1198/5022 2/9 30/120

嘗試一下記錄「計劃學習時間」和「實際學習時間」,到期末看看能不能改進本身的計劃能力。這個工做學習中很重要,也頗有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。

參考:軟件工程軟件的估計爲何這麼難軟件工程 估計方法

  • 計劃學習時間:24小時

  • 實際學習時間:24

(有空多看看現代軟件工程 課件
軟件工程師能力自我評價表
)

參考資料

相關文章
相關標籤/搜索