📘 Vol.10.3：DB接続クラスの共通化とドライバ設計

DTO / DAO 設計に続き、今回はアプリケーションの土台となる「DB接続の共通化」について解説します。  
これにより、**重複をなくし、安全・効率的にDB接続を扱える仕組み**が手に入ります。

---

## 🔰 1. なぜ「DB接続共通クラス」が必要なのか？

JDBC を用いた DB 操作では、以下のような接続コードが頻繁に登場します：

```java
Connection conn = DriverManager.getConnection(DB_URL, USER, PASSWORD);
```

これを毎回書いていると：

- **冗長で重複が多くなる**

- **接続先が変わった時の修正が大変**

- **リソース解放を忘れがち**

→ 解決するために、共通の接続ユーティリティクラスを導入します。

---

### 🧩 2. DB接続クラスの基本実装（DBUtil.java）

```java
public class DBUtil {
    private static final String URL = "jdbc:mysql://localhost:3306/mydb";
    private static final String USER = "root";
    private static final String PASSWORD = "password";

    static {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver"); // JDBCドライバのロード
        } catch (ClassNotFoundException e) {
            throw new RuntimeException("JDBCドライバのロードに失敗", e);
        }
    }

    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL, USER, PASSWORD);
    }
}
```

### ✅ 解説ポイント

| 項目                | 説明                        |
| ----------------- | ------------------------- |
| `static`ブロック      | アプリ起動時に JDBC ドライバを一度だけロード |
| `getConnection()` | 呼び出し元から簡潔に接続取得できるように共通化   |

---

### ✅ 3. DAOから使ってみる

```java
try (Connection conn = DBUtil.getConnection();
     PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users");
     ResultSet rs = stmt.executeQuery()) {

    while (rs.next()) {
        User user = UserMapper.map(rs);
        ...
    }

} catch (SQLException e) {
    e.printStackTrace();
}
```

→ `DBUtil.getConnection()` により、接続取得が一行で完了！

---

### 🚀 4. try-with-resources と AutoCloseable のおさらい
**💡 Java 7以降で導入された便利機能**

```java
try (Connection conn = ...) {
    // 通常の処理
}
// → 自動で close() される

```

---

### ✅ 対象条件：
- AutoCloseable インタフェースを実装したクラス

  - Connection

  - PreparedStatement

  - ResultSet

  - BufferedReader など

### ✅ 解放の順番：
- 開いた順の逆（LIFO）

- → `ResultSet` → `PreparedStatement` → `Connection` の順に close

---


### 🛠 5. 応用：プロパティファイルでDB設定を切り替え可能にする
将来的には以下のような構成で接続情報を外部化することもできます：

**db.properties**
```java
db.url=jdbc:mysql://localhost:3306/mydb
db.user=root
db.password=password
```

→ Java側で `Properties` クラスを使って読み込み、柔軟な切り替えが可能に。

---


### 📝 まとめ
| 項目     | ポイント                            |
| ------ | ------------------------------- |
| ✅ 再利用性 | すべてのDAOで共通の接続取得処理が使える           |
| ✅ 保守性  | 接続情報の変更が1箇所で済む                  |
| ✅ 安全性  | try-with-resourcesによりリソースリークを防止 |

---

### 🔜 次回予告（Vol.10.4）
📘 Vol.10.4では、**DAO / DTO / DB接続クラスと Struts2 の Action クラスをどう連携させるか？** に焦点を当てて解説します！

---

### ✨ シリーズまとめ（Vol.10.x バリデーション編）

- [✅ Vol.10.0：DAO / DTO / JavaBeansとは？ ― データ層設計の全体像と役割分担 ―](https://qiita.com/drafts/19c1d526df28240e0cb1/edit)

- [✅ Vol.10.1：DTO設計のベストプラクティス（命名規則・フィールド設計](https://qiita.com/juehara-crypto/items/1b0ad616095f8ae134ec)

- [✅ Vol.10.2：DAOのインタフェース設計と実装パターン ](https://qiita.com/juehara-crypto/items/bcb15618440bef5931ef)

- [✅ Vol.10.4：Actionとの連携実装（Struts2との融合）](https://qiita.com/juehara-crypto/items/b8873de1aa9e46cd9309)

- [✅ Vol.10.5：DAO・DTOのテスト設計（JUnitやH2活用）](https://qiita.com/juehara-crypto/items/9f0914697726068b9e93)

- [✅ Vol.10.6：Service層の設計方針と例外処理戦略 ](https://qiita.com/juehara-crypto/items/6685c303c40e48b3c1f3)

- [✅ Vol.10.7：Service層×JUnitテストの基本とパターン](https://qiita.com/juehara-crypto/items/128fda40df3ffa0fedce)

- [✅ Vol.10.8：Service層の共通基盤化とDI対応 ](https://qiita.com/juehara-crypto/items/8e94acf2a31be15aaf94)

---