# JAVA介紹 & JDBC & Eclipse快捷鍵 ## JAVA基礎 ### 環境建置 下載OPENJDK(版本SE8) & Eclipse(IDE整合開發環境) IDE要設定JDK版本與編譯器版本 設定版面字體大小、JDK、tomcat、jdbc、maven...等等 ### IDE快捷鍵 Alt+/:自動完成 Alt+↑,↓方向鍵:將該行程式碼移動上下 Alt+Shift+L:快速令變數名稱 Alt+Left:退回到前一個編輯畫面滑鼠游標點 Alt+Right:進入到下一個編輯畫面 Ctrl+L:搜尋該程式指定行數 Ctrl+M:當前視窗最大化,再按一下返回 Ctrl+H:全範圍搜尋 Ctrl+O:找方法 Ctrl+E:搜尋已開啟的編輯頁面檔名 Ctrl+T:搜尋已開啟的頁面的所有實作類別 Ctrl + pageUp/pageDown(70%鍵盤:Carl+fn+方向鍵上下): 切換左邊一個或右邊一個選項編輯視窗 Ctrl+Shift+R:打開資源列表找檔案 Ctrl+Shift+C:快速註解 Ctrl+Shift+F:快速縮排 Ctrl+Shift+O:自動import Ctrl+Shift+↑,↓方向鍵:複製到上一行或下一行 ### 簡介 JAVA屬於物件導向>以物件為根基。 物件為何? 一個"類別",透過建構"方法",進行實例化即為物件。 JAVA有八種基本資料型別+第九種參考資料型別(參考記憶體位置)。 參考資料型態是:『1.內建物件之陳列 2.字串 3.自行設計之建構物件(含類別&介面)』: 1.自定義的類別 (class) 2.陣列 (Array) 3.介面 (interface) 4.列舉 (enum) ### 程式風格 1.宣告時一行一行宣告,不要在同一行裡做多次宣告。 2.有計算式時分開計算,提升可讀性。 3.變數命名規則:只能以_、$、英文字作為開頭,並以小寫作為變數起頭,第二個單字開始大寫起頭。命名須有意義,常數需全大寫,兩單字中間以_為連結。 4.類別名稱:字首大寫 ### 三元運算子 A? B:C A為一個判斷式or布林值,若A為True則給B;若A為False則給C。 使用時機:須回傳"值"時,使用三元運算子。須回傳"命令句"時,使用If Else。 ### 基本型態陣列 陣列是一種物件 陣列要放置的資料型別需宣告 使用方式: 1.資料型別[] 陣列名稱 = new 資料型別[陣列尺寸] 2.資料型別[] 陣列名稱 = {資料,資料,資料,資料} 將資料存入陣列的方式: 1.直接賦值-資料型別 [] 陣列名稱 = {資料0,資料1,資料2...} 2.選擇位置後用指定運算子賦值-陣列名稱[0] = 資料0,陣列名稱[1] = 資料1... 取資料方式: 資料型別 ## JAVA進階班 ### 類別與物件的定義 類別是設計藍圖,物件是根據設計藍圖去完成建造出來的實際成品 類別也像音樂家腦海裡的旋律,物件則是依據腦內旋律去演奏出的聲音。 ### 一維陣列的遍歷>for迴圈 for(int 變數=0;變數<陣列名稱.length;變數++){ 要對陣列物件,屬性做的事or將陣列名稱[變數]取出 ### 二維陣列的遍歷>for each迴圈 ### foreach為語法蜜糖 for(陣列元素的資料型別 變數:陣列名稱){ 對陣列元素要做的事 } ### 方法 方法為:將一種可執行的程式碼集合起來放到一個地方。 publice String 午餐類型(String 午餐選項) [修飾子] 回傳型態 方法名稱(參數型態 參數名稱){ 執行語句; return 符合回傳型態的物件或資料; } ### 靜態方法static 使用靜態方法修飾變數與方法時,表示這個變數與方法會在程式執行前就先配置記憶體(全域)。 可以直接呼叫不需建立物件(類別名稱.方法名稱()) ### 物件導向三大特性 1.封裝 使用修飾子封裝,減少程式耦合與保護變數,避免變數被直接修改。 缺點為需要另外建立方法去呼叫使用。 可以使用「建構方法」來做物件初始值(預設) 2.繼承(子類別繼承父類別) 數個類別的物件中有近乎相近的屬性與方法時,且兩者有階層關係,可以使用繼承。 EX:水果>香蕉 `super()` 呼叫距離自己最近的超(父)類建構方法 3.多型 使用父類別的方法實現子類別的功能差異(覆寫與多載) 舉例:約會,約喜歡的對象到家裡看Netflix,到家後實際上: 1.真的要看Netflix 2.做運動 3.仙人跳 依據不同情況會有不同實現方法,即為多型。 ### 物件的Null null是只有「參考資料型別」可以使用的資料,表示沒有、不存在。 ### List、Map、Set List清單:有序列且有索引值 Map映射:儲存方式為關鍵值key對應值Value Set集合:沒有重複的元素 ### 泛型Generic 將型態參數化 ex:ArrayList <String>,限制ArrayList儲存String類型物件 使用泛行建立Collection、Map後,只要對其進行儲存時,編譯器會協助判斷資料型別是否能符合, 輸出時會直接輸出該資料型別的物件。 ### 反射(Reflection) **反射(Reflection)是JAVA在運行時,可以動態操作類別的方法** Java 的反射(Reflection)是一種強大的機制,它允許程序在執行時查詢和操作類、方法、屬性等,以及動態創建對象、調用方法、設置/獲取屬性等。 ### 枚舉(Enum) 枚舉(Enum)是一種特殊的類型,它用於定義一個有限數量的命名常量集合。枚舉提供了更具可讀性和安全性的方式來表示這些常量,並使代碼更加清晰和易於維護。 簡單來說:「把所有可能會出現的事情,都列舉出來的方式。」 程式碼: ``` public enum DayOfWeek { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY } ``` 大概就這樣,忘記的話下面有參考資料可以去看。 ## 課程作業 ### 1.何謂物件、何謂類別 類別是設計藍圖,物件是根據設計藍圖去完成建造出來的實際成品 類別也像音樂家腦海裡的旋律,物件則是依據腦內旋律去演奏出的聲音。 ### 2.封裝的優缺點 優點:減少程式耦合與保護變數,避免變數被直接修改。 缺點:需要另外建立方法去呼叫使用,麻煩。 ### 3.說明繼承對於封裝的影響 沒有封裝就沒有繼承,但沒有繼承還是可以封裝(?) 如果繼承的來源(父類別)有被private封裝,子類別需要用setter方法 或super()呼叫父類別的建構子。 ### 4.試說明多型的意義及優點 使用父類別的方法實現子類別的功能差異(覆寫與多載) 舉例:約會,約喜歡的對象到家裡看Netflix,到家後實際上: 1.真的要看Netflix 2.做運動 3.仙人跳 依據不同情況會有不同實現方法,即為多型。 ## JDBC Feat. 資料庫 使用程式透過JDBC去跟資料庫的Driver溝通操作資料庫 ### 步驟 ### 1.引入/導入JDBC的Driver 依據所需資料庫(如:MSSQL,MYSQL)不同去該廠商下載所對應的Driver ### ### 2.註冊JDBC的Driver JAVA SE1.6版本以後有自動載入註冊 ### 3.建立連線 JDBC URL連線字串,範例可以從各家廠商網站找到。 ![](https://i.imgur.com/2MdGOza.jpg) ### 4.執行SQL指令 靜態SQL指令Statment 動態SQL指令PreStatment(推薦使用) 其他詳細指令及操作參考:期中專題的圖片集 ### 5.從結果集(Result Set)得到資料 ### 6.清理環境(關閉物件) ### Blob&Clob 將檔案寫入資料庫中 Blob(Binary Large Object):儲存二進元大型物件如圖片、影像、音樂等檔案類型 Clob(Character Large Object):儲存大篇幅文章或文件於留言板、專欄文章等。 ### Batch Updates批次更新 ### bean a.k.a. POJO(Plain Old Java Object) 對應資料庫的資料創造一個類別,裡面使用private並有GET/SET方法 ![](https://i.imgur.com/CzjjdpJ.png) ### DAO(Data Access Object) 即一個用於資料庫操作的物件 實現步驟: 新建一個 dao 介面,宣告資料庫訪問規則(一系列與資料庫操作直接相關的,對資料庫進行更新、查詢、刪除、修改等操作的方法) 新建一個 dao 實現類,具體實現 dao 介面中定義的方法 新建一個 dao 實現類物件,直接使用其中的方法與資料庫互動 ## 結訓後的進修 ### Hash雜湊 以統一發票為例子 Bucket(桶):集中存放多筆資料的地方。例如 7 月的發票都放在一堆,8 月的放另一堆。每一堆發票視為一個 bucket。 Slot(槽):存放一筆資料的地方,就像寫著發票資料的紙。一個 bucket 可具有一至多個 slot。 Hash Table(雜湊表):是 bucket 的集合,就像用來放各個發票堆的容器。 或 學校的一條走廊上有許多間教室;每間教室內有許多座位;每個座位上有一名學生。基於這個例子:走廊是 Hash Table;教室是 Bucket;Slot 是座位;資料是學生。 #### 雜湊函數 雜湊函數(hashing function)可以對一筆資料進行運算,最後得到一個整數,我們稱之為「雜湊值」(hash code)。 在雜湊結構中,雜湊值會直接或間接決定要把資料放在哪個 bucket。 如果相異的資料卻算出相同的雜湊值,我們稱發生了「碰撞」(collision)。 #### HashMap 好複雜好難解釋...背後又會自己幫忙做一些事情 總之就是會算出一個東西雜湊值做成map的key/value的關係 ### native關鍵字 在Java中,native 是一個關鍵字,它用於聲明一個方法是由底層平台的本機代碼實現的,而不是由Java代碼實現。 這種方法通常是使用其他語言(如C或C++)編寫的,並且可以通過Java的本機接口(Java Native Interface,JNI)與Java代碼進行交互。 當你在Java中聲明一個方法為native時,你告訴編譯器這個方法的實現不在Java中,而是在底層的本機代碼中。這使得Java能夠與底層系統進行交互,調用原生的函數或庫。 程式範例: ``` public class NativeExample { // 使用 native 關鍵字聲明一個方法 public native void nativeMethod(); // 加載底層庫 static { System.loadLibrary("NativeLibrary"); } public static void main(String[] args) { // 創建 NativeExample 對象 NativeExample example = new NativeExample(); // 調用本機方法 example.nativeMethod(); } } ``` 在這個例子中,nativeMethod 方法被聲明為 native,並且在 static 塊中使用 System.loadLibrary 載入一個名為 "NativeLibrary" 的本機庫。 實際的本機實現應該包含在 "NativeLibrary" 中,而Java代碼可以通過調用 nativeMethod 來使用它。 ### record 在 Java 中,record 是 Java 14 引入的一種特殊類型,正式推出於 Java 16。 record 是一種簡單的資料載體 (data carrier),它用來代表不可變的資料,並自動生成一些樣板代碼,例如 getter、equals()、hashCode()、以及 toString() 方法。 這使得開發者可以更簡單地創建僅用於保存數據的類,無需手動編寫這些常見的方法。 record 的一個關鍵點是它默認是不可變的,也就是說,record 類型的屬性一旦被初始化,不能被修改。 ```java= public record Person(String name, int age) {} ``` 這個 record 類定義了一個 Person 類型,包含 name 和 age 兩個屬性。 使用 record 可以避免手動編寫構造器、getter 方法以及 toString() 等方法。 也就等於普通的java類: ```java= public class Person { private final String name; private final int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return age == person.age && Objects.equals(name, person.name); } @Override public int hashCode() { return Objects.hash(name, age); } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } } ``` ## 參考資料 反射:https://b0444135.medium.com/java-%E4%BB%80%E9%BA%BC%E6%98%AF%E5%8F%8D%E5%B0%84-java%E9%81%8B%E8%A1%8C%E8%88%87%E5%8F%8D%E5%B0%84%E8%A7%80%E5%BF%B5-e53b6e2ee4f8 枚舉:https://thumbb13555.pixnet.net/blog/post/337979729-enum Hash:https://ithelp.ithome.com.tw/articles/10323506