# 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連線字串,範例可以從各家廠商網站找到。

### 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方法

### 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