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

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

教材學習內容總結

JDBC入門

JDBC簡介

image
1.JDBC是java聯機數據庫的標準規範,它定義了一組標準類與接口,應用程序須要聯機數據庫時調用這組標準API。html

2.JDBC標準:JDBC應用程序開發者接口和JDBC驅動程序開發者接口。java

3.應用程序使用JDBC聯機數據庫:git

·Connection conn = DriverManager.getConnection(...);
·Statement st = conn.createStatement();
·ResultSet rs = st.executeQuesry(...);
image正則表達式

鏈接數據庫

1.要鏈接數據庫系統,必需要有廠商操做的JDBC驅動程序,必須在CLASSPATH中設定驅動程序JAR文檔。sql

2.操做Driver接口的對象是JDBC進行數據庫存取的起點。Connection接口的操做對象是數據庫聯機表明對象,要取得Connection操做對象,能夠經過DriverManager的getConnection():Connection conn = DriverManager.getConnection(jdbcUrl, username, passwd);
3.在操做完數據庫以後,若肯定再也不須要鏈接,必須使用close()關閉與數據庫的鏈接,以釋放鏈接時相關的必要資源,如聯機相關對象、受權資源等。數據庫

使用Statement、ResultSet

1.使用Connection的createStatement()創建Statement對象。數組

2.Statement的execute()用來執行SQL,並能夠測試SQL是執行查詢或更新,返回true表示SQL執行將返回ResultSet做爲查詢結果。架構

使用PreparedStatement、CallableStatement

1.使用Connection的prepareStatement()方法創建好預先編譯的SQL語句,當中參數會變更的部分先指定「?」這個佔位字符。PrepareStatement stmt = conn.prepareStatement("INSERT INTO t_message VALUES(?, ?, ?, ?)");ide

2.須要真正指定參數執行時,再使用相對應的setInt()、setString()等方法指定「?」處真正應該有的參數。oop

·stmt.setInt(1,2);
·stmt.setString(2,"momor");
·stmt.executeUpdate();

JDBC進階

使用DataSource取得聯機

1.當MessageDAO的用戶沒法告知DriverManager有關JDBC URL、用戶名稱、密碼等信息時,可讓MessageDAO依賴於javax.sql.DataSource接口,經過其定義的getConnection()方法取得Connection。
使用ResultSet捲動、更新數據

1.在ResultSet時,默承認以使用next()移動數據光標至下一筆數據,而後使用getxxx()方法來取得數據。

2.ResultSet可使用previous()、first()、last()等方法先後移動數據光標,還能夠調用updatexxx()、updateRow()等方法進行數據修改。

3.結果集類型3種設定:

·ResultSet.TYPE_FORWARD_ONLY(默認)(只能前進數據光標)
·ResultSet.TYPE_SCROLL_INSENSITIVE(先後移動數據光標)
·ResultSet.TYPE_SCROLL_SENSITIVE(先後移動數據光標,反映數據庫中的數據修改)
4.更新設定的2種設定:
·ResultSet.CONCUR_READ_ONLY(默認)(進行數據讀取)
·ResultSet.CONCUR_UPDATABLE(進行數據讀取、更新)

5.數據光標移動的API:

絕對位置移動:absolute()、afterLast()、beforeFirst()、first()、last()。

相對位置移動:relative()、previous()、next()。

判斷目前位置:isAfterLast()、isBeforeFirst()、isFirst()、isLast()。

6.數據修改的條件限制:

必須選取單一表格。

必須選取主鍵。

必須選取全部的NOT FULL的值。

7.數據更新:調用updatexxx()方法,而後調用updateRow()方法。取消更新:調用cancelRowUpdates()。

8.新增數據:先調用moveToInsertRow(),以後調用updatexxx()設定要新增的數據各個字段,而後調用insertRow()新增數據。

9.刪除數據列:調用deleteRow()。

批次更新

1.每次執行excuteUpdate(),都會向數據庫發送一次SQL。批次更新時可使用addBatch()方法來收集SQL,並使用executeBatch()方法將所收集的SQL傳送出去。

Blob與Clob

1.要將文檔寫入數據庫,能夠在數據庫表格字段上使用BLOB或CLOB數據類型。

2.BLOB用於存儲大量的二進制數據,像是圖檔、影音檔等。CLOB用於存儲大量的文字數據。

3.java.sql.Blob與java.sql.Clob兩個類分別表明BLOB與CLOB數據。

交易簡介

1.交易的四個基本要求ACID:原子性、一致性、隔離行爲、持續性。

2.更新遺失:某個交易對字段進行更新的消息,因另外一個交易的介入而遺失更新效力。若是要避免此類問題,能夠設定隔離層級爲「可讀取未確認」,能夠經過Connection的setTransactionIsolation()設定爲TRANSACTION_UNCOMMITTED來提示數據庫肯定此隔離行爲。

3.髒讀:讀取到不乾淨、不正確的數據。若是要避免此類問題,能夠設定隔離層級爲「可讀取確認」,能夠經過Connection的setTransactionIsolation()設定爲TRANSACTION_COMMITTED來提示數據庫肯定此隔離行爲。

4.沒法重複的讀取:某個交易兩次讀取同一字段的數據並不一致。若是要避免此類問題,能夠設定隔離層級爲「可重複讀取」,能夠經過Connection的setTransactionIsolation()設定爲TRANSACTION_REPEATABLE_READ來提示數據庫肯定此隔離行爲。

5.幻讀:同一交易期間讀取到的數據筆數不一致。若是要避免此類問題,能夠設定隔離層級爲「可循序」,能夠經過Connection的setTransactionIsolation()設定爲TRANSACTION_SERIALIZABLE來提示數據庫肯定此隔離行爲。

metadata簡介

1.Metadata即詮讀數據的數據。

2.能夠經過Connection的getMetaD()方法取得DatabaseMetadata對象,經過這個對象提供的各類方法能夠取得數據庫總體信息,而ResultSet表示查詢到的數據,而數據自己的字段、類型等信息,能夠經過ResulSet的getMetaData對象,經過這個對象提供的相關方法就能夠取得域名、字段類型等信息。
RowSet簡介

1.javax.sql.RowSet接口用以表明數據的類集合,數據能夠是電子表格數據、XML數據或任何具備列集合概念的數據源。可使用RowSet對列集合進行增刪查改。

2.JdcRowSet是聯機式的RowSet,在操做期間會保持與數據庫的聯機,可視爲取得、操做的行爲封裝。

3.CachedRowSet爲脫機式的RowSet,在查詢並填充完數據後就會斷開與數據源的聯機。

第十七章

取得Class對象的方式:

1.經過Object的getClass方法

2.經過.class常量取得每一個對象對應的Class對象

3.若是是基本類型,可使用對應的打包類加上.TYPE取得Class對象

第十八章

枚舉類型能夠定義在類的內部也能夠定義在類的外部。若是定義在類的內部,那麼其訪問控制符能夠是public,protected,private或者默認的控制符。若是定義在類的外部,其訪·問控制符只能是public和默認控制符;

枚舉類型中定義的value值都默認爲public static final的。其值一經定義就不能在被修改了。多個value值之間須要用逗號隔開;

枚舉類型中除了能夠聲明常量以外還能夠聲明方法。可是方法須要在常量以後,而且常量和方法之間要用分號區分;

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

  • xx1問題:在鏈接數據可的時候發生了一系列的問題,最終通過看學長博客和百度,解決了問題。
    image
  • xx1解決方案
  • xx2問題:關於JDBC教材上有不少都不懂得地方,但願老師進行講解。
  • xx2解決方案:

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

  • xx1問題:關於教材509頁ConnectionDemo.java代碼進行數據庫聯機:
    運行代碼時,發現拋出異常:image
  • xx1解決方案:根據上網百度,下載了正確的xammp,並根據教程進行環境配置,系統配置,以下圖image
    數據庫聯機image
  • xx2問題
  • xx2解決方案
  • ...

代碼託管

  • 代碼提交過程截圖:
    • 運行 git log --pretty=format:"%h - %an, %cd : %s" 並截圖
  • 代碼量截圖:
    • 運行 find src -name "*.java" | xargs cat | grep -v ^$ | wc -l 並截圖image

上週考試錯題總結

  • 錯題一:
    Suppose we have an array of String objects identified by the variable names. Which of the following for loops will not correctly process each element in the array.(假如咱們有一個名爲names的String對象數組,下面哪一個for循環不能遍歷數組中的每個元素?)

A .for(int i = 0; i < names.length; i++)

B .for(String name : names)

C .for(int i = 0; i < names.length(); i++)

D .none of these will correctly process each element(以上都不能遍歷)

E .all of these will correctly process each element(以上都能遍歷)

正確答案:c

  • 解析:因爲語法錯誤,選擇c將不會正確處理每一個元素。長度變量不是一種方法,所以在它以後沒有括號。選擇b是使用foreach循環來處理數組的一個例子,選擇a是一個正確的循環。

  • 錯題二:
    Which of the following array declarations are invalid? (下面哪一個數組聲明是不合法的)

A .int[] grades = new int[5];

B .int grades[] = new int[5];

C .int[] grades = { 91, 83, 42, 100, 77 };

D .all of the above are valid(以上三個都合法)

E .none of the above are valid(以上三個都不合法)

正確答案: D

  • 解析:
    這三個都是有效的數組聲明。選擇b使用備用語法。選擇c使用初始化器列表來初始化數組。

  • 錯題三:
    Which of the statements is true about the following code snippet?(對於下面的代碼段,說法正確的是?)

int[] array = new int[25];
array[25] = 2;
A .The integer value 2 will be assigned to the last index in the array.(整數2會賦給數組中最後一個元素)

B .The integer value 25 will be assigned to the second index in the array.(整數25會賦給數組中的第2個索引)

C .The integer value 25 will be assigned to the third value in the array. (整數25會賦給數組中的第3個元素)

D .This code will result in a compile-time error.(代碼會產生編譯時錯誤)

E .This code will result in a run-time error. (代碼會產生運行時錯誤)

正確答案: E

  • 解析:
    此代碼將拋出一個ArrayIndexOutOfBoundsException,由於此數組中的最後一個索引將爲24。這會致使運行時錯誤
  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

  • 參考示例

點評過的同窗博客和代碼

  • 本週結對學習狀況
    • 20155224
    • 結對照片image
    • 結對學習內容
      • 上週錯題的理解與掌握。
      • 第十五章教材學習中遇到的問題進行討論。
      • 第十五章代碼調試中遇到的問題進行討論。
  • 上週博客互評狀況
代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 120/120 1/4 16/16 開始了JAVA學習的第一步!
第二週 346/466 1/5 23/36 瞭解並學習了Java基礎語法
第三週 364/830 1/6 21/57 進一步瞭解java設計語句
第四周 570/1300 2/8 20/77 初步學習了繼承與多態,接口與多態知識。
第五週 1056/2356 1/9 23/100 瞭解Java的異常處理,學習Collection和Map架構
第六週 960/3100 1/10 22/122 瞭解串流設計和線程
第七週 427/3527 2/12 20/144 瞭解Java中的時間,完成第二次實驗
第八週 900/4400 1/13 20/164 初步瞭解了正則表達式
第九周 498/4950 2/15 20/184 初步學會使用MySQL

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

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

參考資料

相關文章
相關標籤/搜索