---
# System prepended metadata

title: JAVA & JDBC & Eclipse快捷鍵
tags: [技術筆記]

---

# 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
