20145215《Java程序設計》第9周學習總結

20145215《Java程序設計》第九周學習總結

教材學習內容總結

整合數據庫

JDBC入門

  • JDBC是用於執行SQL的解決方案,開發人員使用JDBC的標準接口,數據庫廠商則對接口進行操做,開發人員無須接觸底層數據庫驅動程序的差別性。
  • 數據庫自己是個獨立運行的應用程序,你撰寫的應用程序是利用通訊協議對數據庫進行指令交換,以進行數據的增刪查找。一般你的應用程序會利用一組專門與數據庫進行通訊協議的連接庫,以簡化與數據庫溝通時的程序撰寫。
  • 咱們有時須要更換數據庫,應用程序跨平臺也是常常的需求,JDBC基本上就是用來解決這些問題的。JDBC是Java聯機數據庫的標準規範。具體而言,它定義了一組標準類與接口,應用程序須要聯機數據庫時調用這組標準API,而標準API中的接口由數據庫廠商操做,一般稱爲JDBC驅動程序。
    html

  • JDBC標準主要分爲兩個部分:JDBC應用程序開發者接口以及JDBC驅動程序開發者接口。若是應用程序須要聯機數據庫,就是調用JDBC應用程序開發者接口,相關API主要在java.sqljavax.sql兩個包中,JDBC驅動程序開發者接口是數據庫廠商操做驅動程序時的規範。
    java

  • 廠商依操做方式可將JDBC驅動程序分爲四種類型:
  1. JDBC-ODBC Bridge Driver
  2. Native API Driver
  3. JDBC-Net Driver
  4. Native Protocal Driver
  • 爲了要鏈接數據庫系統,必需要有廠商操做的JDBC驅動程序,必須在CLASSPATH中設定驅動程序JAR文檔,關於教材中鏈接數據庫的操做,詳情請見教材學習中的問題和解決過程。
  • 取得聯機等與數據庫來源相關的行爲規範在java.sql.DataSource接口中,實際如何取得Connection則由操做接口的對象來負責。Connection是數據庫鏈接的表明對象,接下來要執行SQL的話,必須取得java.sql.Statement操做對象,它是SQL描述的表明對象。
  • Statement的execute()能夠用來執行SQL,並能夠測試SQL是執行查詢或更新,返回true表示SQL執行將返回ResultSet做爲查詢結果,此時可使用getResultSet()取得ResultSet對象。視需求而定,Statement或者ResultSet在不使用時,可使用close()將之關閉,以釋放相關資源。Statement關閉時,所關聯的ResultSet也會自動關閉。
  • 若是有些操做只是SQL語句當中某些參數會有所不一樣,其他的SQL子句皆相同,則可使用java.sql.PreparedStatement。可使用Connection的PreparedStatement()方法創建好預先編譯的SQL語句,當中參數會變更的部分,先指定「?」這個佔位字符。
  • 在JDBC裏要表示日期,是使用java.sql.Date,其日期格式是「年、月、日」,要表示時間的話則是使用java.sql.Time,其時間格式爲「時、分、秒」,若是要表示「時、分、秒、微秒」的格式,你可使用java.sql.Timestampmysql

    JDBC進階

  • SimpleConnectionPoolDataSource操做了DataSource接口,其中使用List 實例維護可重用的Connection,聯機相關信息可使用.properties設定。
  • 在ResultSet時,默承認以使用next()移動數據光標至下一筆數據,然後使用getXXX()方法來取得數據。結果集類型能夠指定3種設定:ResultSet.TYPEFORWARDONLY(默認)、ResultSet.TYPESCROLLINSENSITIVE、ResultSet.TYPESCROLLSENSITIVE。更新設定能夠有兩種指定:ResultSet.CONCURREADONLY(默認)、ResultSet.CONCUR_UPDATABLE。
  • 每一次執行executeUpdate(),其實都會向數據庫發送一次SQL,若是大量更新的SQL有一萬筆,就等於經過網絡進行了一萬次的信息傳送,網絡傳送信息實際上必須打開I/O、進行路由等動做。因此最好就是全部收集的SQL,最後會串爲一句SQL,而後傳送給數據庫,既然是批次更新,顧名思義,就是僅用在更新上,因此批次更新的限制是,SQL不能是SELECT,不然會拋出異常。
  • 若是要將文檔寫入數據庫,能夠在數據庫表格字段上使用BLOB或CLOB數據類型,BLOB用於存儲大量二進制數據,像是圖檔、影音檔等,CLOB用於存儲大量的文字數據。
  • 交易的四個基本要求是原子性、一致性、隔離行爲與持續性。當多個交易並行時,可能引起的數據不一致問題:
  1. 更新遺失:基本上就是指某個交易對字段進行更新的信息,因另外一個交易的介入而遺失更新效力。
  2. 髒讀:兩個交易同時進行時,其中一個交易更新數據但未確認,另外一個交易就讀取數據,就有可能發生髒讀問題。
  3. 沒法重複的讀取:某個交易兩次讀取同一字段的數據並不一致。
  4. 幻讀:同一交易期間,讀取到的數據筆數不一致。
  • JDBC定義了java.sql.RowSet接口,用以表明數據的列集合,這裏的數據並不必定是數據庫中的數據,能夠是電子表格數據、XML數據或任何具備列集合概念的數據源。RowSet定義了列集合基本行爲,其下有JdbcRowSet、CachedRowSet、FilteredRowSet、JoinRowSet、WebRowSet五個標準列集合子接口,定義在javax.sql.rowset包中。

反射與類加載器

運用反射

  • Java真正須要某個類時纔會載入對應的.class文檔,java.lang.Class的實例表明Java應用程序運行時載入的.class文檔,Class類沒有公開(public)構造函數,實例是由JVM自動產生,能夠經過Object的getClass()方法,或者是透過.class常量取得每一個對象對應的Class對象。
  • 可使用Class.forName()方法實現動態加載類,Class.forName()方法在找不到指定類時會拋出ClassNotFoundException異常。
  • Class對象加載的.class文檔,取得Class對象後,就能夠取得.class文檔中記載的信息,每一個類型都會有對應的類型,若是事先不知道類名稱,能夠利用Class.forName()動態加載.class文檔,取得Class對象以後,利用其newInstance()方法創建類實例。git

    瞭解類加載器

  • 類加載指的是將類的class文件讀入JVM,併爲之建立一個Class對象。
  • JVM預約義的三種類型類加載器,當一個JVM啓動的時候,開始使用以下三種類型類裝入器:
  1. 啓動(Bootstrap)類加載器:引導類裝入器是用本地代碼實現的類裝入器,它負責將 /lib下面的核心類庫或-Xbootclasspath選項指定的jar包加載到內存中。因爲引導類加載器涉及到虛擬機本地實現細節,開發者沒法直接獲取到啓動類加載器的引用,因此不容許直接經過引用進行操做。
  2. 擴展(Extension)類加載器:擴展類加載器是由Sun的ExtClassLoader(sun.misc.Launcher$ExtClassLoader)實現的。它負責將< Java_Runtime_Home >/lib/ext或者由系統變量-Djava.ext.dir指定位置中的類庫加載到內存中。開發者能夠直接使用標準擴展類加載器。
  3. 系統(System)類加載器:系統類加載器是由 Sun的 AppClassLoader(sun.misc.Launcher$AppClassLoader)實現的。它負責將系統類路徑java -classpath或-Djava.class.path變量所指的目錄下的類庫加載到內存中。開發者能夠直接使用系統類加載器。
  • Bootstrap Loader、Extended Loader與System Loader在程序啓動後,就沒法再改變它們的搜索路徑。若是在程序運行過程當中,打算動態決定從其餘路徑加載類,就要產生新的類加載器,新的類加載器創建後,父加載器會設爲System Loader。sql

    自定義泛型、枚舉與註釋

    自定義泛型

  • 泛型,即「參數化類型」。一提到參數,最熟悉的就是定義方法時有形參,而後調用此方法時傳遞實參。那麼參數化類型怎麼理解呢?顧名思義,就是將類型由原來的具體的類型參數化,相似於方法中的變量參數,此時類型也定義成參數形式(能夠稱之爲類型形參),而後在調用時傳入具體的類型(類型實參)。
  • 泛型也能夠僅定義在方法上,可在方法返回類型前使用 定義泛型,以後就可使用T來定義返回類型、參數類型,或在方法內聲明變量、轉換類型等,在定義泛型時,使用extends限制指定T實際類型時,必須是某類的子類。
  • 若是B是A的子類,而Node(B)可視爲一種Node(A),則稱Node具備逆變性。Java泛型並不支持逆變性,可使用類型通配字符?與super來聲明,以達到相似逆變性的效果。數據庫

    自定義枚舉

  • 建立枚舉類型要使用 enum 關鍵字,隱含了所建立的類型都是 java.lang.Enum 類的子類(java.lang.Enum 是一個抽象類)。枚舉類型符合通用模式 Class Enum<E extends Enum >,而 E 表示枚舉類型的名稱。枚舉類型的每個值都將映射到 protected Enum(String name, int ordinal) 構造函數中,在這裏,每一個值的名稱都被轉換成一個字符串,而且序數設置表示了此設置被建立的順序。
  • 定義enum時能夠自定義構造函數,條件是不得爲公開(public)構造函數,也不能夠在構造函數中調用super(),定義enum時有個特定值類本體語法,可用於操做接口或從新定義父類方法。網絡

    註釋

  • Java提供了一些標準註釋,咱們常常看到的@Override就是標準註釋。舉個例子來講,如今有Son和Parent兩個類,且類型Son將會重寫類型Parent的getName函數,可是因爲咱們的馬虎,一不當心寫成了下面的代碼:less

public class Parent{
  public String getName(){
     return "Parent";
  }
}

public class Son extends Parent{
   public String getNames(){
     return "Son";
   }
}

當咱們用上@Override註釋時,就不會再發生這樣的問題,子類函數添加 @Override 後,該函數重寫父類中籤名相同的函數,不然將會編譯失敗。ide

  • 默認會將註釋信息存儲於.class文檔,可被編譯程序或位碼分析工具讀取,但執行時期沒法讀取註釋信息,在執行時期讀取註釋信息,可使用java.lang.annotation.Retention搭配java.lang.annotation.RetentionPolicy枚舉指定。 RetentionPolicy爲RUNTIME的時機,在於讓註釋在執行時期提供應用程序信息,可以使用java.lang.reflect.AnnotatedElement接口操做對象取得註釋信息。 JDK 8中新增了getDeclaredAnnotation()、getDeclaredAnnotationsByType()、getAnnotationsByType()三個方法。 getDeclaredAnnotation()可讓你取回指定的標註,在指定@Repeatable的標註時,會尋找收集重複標註的容器。 getDeclaredAnnotationsByType()、getAnnotationsByType()就不會處理@Repeatable的標記。

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

  1. 一開始運行代碼,發現拋出異常:
    函數

  2. 這是由於沒有導入MySQL的驅動包,所以咱們先須要下載MySQL JDBC,這裏給你們提供一個下載地址
  3. 進入下載頁面以後找到JDBC Driver for MySQL,點擊Download

  4. 接着選擇下面那個,即下載ZIP壓縮包

  5. 直接下載便可

  6. 下載完成以後解壓,將mysql-connector-java-5.1.38-bin.jar放到你的JDK中lib目錄下
  7. 接着,在IDEA中導入這個jar包,選中External Libraries< 1.8 >,而後右鍵打開Open Library Settings

  8. 點擊右邊的綠色"+",找到mysql-connector-java-5.1.38-bin.jar添加進來

  9. 這時,再次運行程序會發現拋出了新的異常,這是由於咱們尚未安裝MySQL,數據庫天然也就沒法聯機了

  10. 先下載婁老師上傳到QQ羣裏的XAMPP,這是一個集Apache、MySQL、PHP、PERL爲一體的功能強大的建站集成軟件包,下載完成以後解壓,而後雙擊setup_xampp.bat進行配置,這樣能使配置文件中的路徑信息獲得更新。
  11. 接着打開xampp-control.exe,點擊start打開MySQL

  12. 一開始我原本想點擊admin,直接建立數據庫,可是點開以後發現沒法訪問網頁

  13. 因而,只好點開Shell命令窗口,先輸入指令mysql -uroot(ps:因爲個人代碼中沒有設密碼,所以,在這裏輸入指令時也不須要輸入密碼,若是有密碼的話能夠用指令mysql -uroot -p

  14. 爲了防止出現亂碼問題,咱們還要設置數據庫使用UTF-8進行編碼,因而輸入指令SET NAMES utf8;

  15. 而後輸入指令CREATE DATABASE lesson,建立數據庫

  16. 這時再運行程序,便能成功開啓數據庫聯機

在此你們能夠參考一下常見的MySQL數據庫命令

心得體會

本週學習的重點在於MySQL的學習,剛剛接觸的時候感受有點無從下手,中間花了比較長的時間去摸索XAMPP軟件,後來經過在網上搜集資料慢慢對XAMPP有所瞭解,而且創建起了一個簡單的數據庫。一開始我想不太明白Java和數據庫之間到底有什麼聯繫,可是我慢慢意識到Java應用的主流應該是在網絡方向,尤爲是大規模的企業級應用,這必然致使要與大批量的數據發生關係,所以用數據庫來對這些數據進行管理對於一些用Java開發的大規模應用來講是很是有必要的,這也就更加說明了數據庫對Java的重要性,若是咱們可以學好數據庫,那麼對於從此一些項目的開發也會很是有幫助。

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時 編寫了Hello Java代碼
第一週 100/100 2/2 12/12 編寫了Hello Java代碼
第二週 200/300 2/4 15/27 理解了printf和println的區別
第三週 450/750 1/5 22/49 對對象有了更深層次的理解
第四周 869/1619 1/6 28/77 對對象的三大特徵有了更全面的認識
第五週 1123/2742 1/7 25/102 學會了異常處理
第六週 863/3605 2/9 30/132 理解了線程
第七週 505/4110 2/11 28/160 掌握了日期和時間的運用
第八週 490/4600 2/13 26/186 掌握了git託管的節奏
第九周 591/5191 2/15 30/216 初步學會使用MySQL

【附1】本週學習的代碼已經成功託管,截圖以下:

【附2】利用wc統計代碼行數,截圖以下:

參考資料

相關文章
相關標籤/搜索