Javaプログラミング入門：ステップ4 データベースとの連携

# Javaプログラミング入門：ステップ4 データベースとの連携

Webアプリケーションにおいて、データベースとの連携は欠かせません。Javaでは、JDBC（Java Database Connectivity）を使用してデータベースにアクセスできます。本記事では、データベースとの連携を学ぶためのステップ4として、以下の内容を順を追って解説します。

1. JDBCの基本操作（接続、クエリ実行、結果の処理）
2. DB2の基本的な操作方法
3. データベースアクセス層の設計

## 1. JDBCの基本操作（接続、クエリ実行、結果の処理）

JDBCは、Javaプログラムからデータベースに接続し、SQLクエリを実行するためのAPIです。JDBCの基本操作は、次のように進めます。

### データベース接続

データベースに接続するためには、JDBCドライバをロードし、`DriverManager`を使用して接続を確立します。

### SQLクエリの実行

接続が確立したら、`Statement`または`PreparedStatement`を使用してSQLクエリを実行します。

### 結果の処理

クエリの結果は`ResultSet`オブジェクトを通じて取得し、処理します。

### 例：JDBCを使用した基本操作

```java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class JdbcExample {
    public static void main(String[] args) {
        String url = "jdbc:db2://localhost:50000/sample";
        String user = "db2user";
        String password = "password";

        try (Connection connection = DriverManager.getConnection(url, user, password);
             Statement statement = connection.createStatement()) {

            String query = "SELECT * FROM employees";
            ResultSet resultSet = statement.executeQuery(query);

            while (resultSet.next()) {
                System.out.println("ID: " + resultSet.getInt("id"));
                System.out.println("Name: " + resultSet.getString("name"));
                System.out.println("Position: " + resultSet.getString("position"));
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
```
## 2. DB2の基本的な操作方法
DB2は、IBMが提供するリレーショナルデータベース管理システム（RDBMS）です。DB2の基本操作には、データベースの作成、テーブルの作成、データの挿入、クエリの実行などが含まれます。

### データベースの作成
```sql
CREATE DATABASE sample;
```
### テーブルの作成
``` sql
CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    position VARCHAR(100)
);
```
### データの挿入
``` sql
INSERT INTO employees (id, name, position) VALUES (1, 'Alice', 'Manager');
INSERT INTO employees (id, name, position) VALUES (2, 'Bob', 'Developer');
```
### クエリの実行
``` sql
SELECT * FROM employees;
```
## 3. データベースアクセス層の設計
データベースアクセス層は、データベースとのやり取りを抽象化し、ビジネスロジックからデータベース操作を分離する役割を持ちます。この層を設計することで、コードの再利用性と保守性を向上させることができます。

### DAOパターンの使用
DAO（Data Access Object）パターンは、データベースアクセス層の設計において一般的に使用されるデザインパターンです。DAOパターンを使用することで、データベース操作を統一的に扱うことができます。

### DAOインターフェースの定義
``` java
public interface EmployeeDao {
    void addEmployee(Employee employee);
    Employee getEmployee(int id);
    List<Employee> getAllEmployees();
    void updateEmployee(Employee employee);
    void deleteEmployee(int id);
}
```
### DAOインターフェースの実装
``` java
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class EmployeeDaoImpl implements EmployeeDao {
    private String url = "jdbc:db2://localhost:50000/sample";
    private String user = "db2user";
    private String password = "password";

    @Override
    public void addEmployee(Employee employee) {
        String query = "INSERT INTO employees (id, name, position) VALUES (?, ?, ?)";
        try (Connection connection = DriverManager.getConnection(url, user, password);
             PreparedStatement preparedStatement = connection.prepareStatement(query)) {

            preparedStatement.setInt(1, employee.getId());
            preparedStatement.setString(2, employee.getName());
            preparedStatement.setString(3, employee.getPosition());
            preparedStatement.executeUpdate();

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

    @Override
    public Employee getEmployee(int id) {
        String query = "SELECT * FROM employees WHERE id = ?";
        try (Connection connection = DriverManager.getConnection(url, user, password);
             PreparedStatement preparedStatement = connection.prepareStatement(query)) {

            preparedStatement.setInt(1, id);
            ResultSet resultSet = preparedStatement.executeQuery();

            if (resultSet.next()) {
                return new Employee(resultSet.getInt("id"), resultSet.getString("name"), resultSet.getString("position"));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public List<Employee> getAllEmployees() {
        List<Employee> employees = new ArrayList<>();
        String query = "SELECT * FROM employees";
        try (Connection connection = DriverManager.getConnection(url, user, password);
             Statement statement = connection.createStatement();
             ResultSet resultSet = statement.executeQuery(query)) {

            while (resultSet.next()) {
                employees.add(new Employee(resultSet.getInt("id"), resultSet.getString("name"), resultSet.getString("position")));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
        return employees;
    }

    @Override
    public void updateEmployee(Employee employee) {
        String query = "UPDATE employees SET name = ?, position = ? WHERE id = ?";
        try (Connection connection = DriverManager.getConnection(url, user, password);
             PreparedStatement preparedStatement = connection.prepareStatement(query)) {

            preparedStatement.setString(1, employee.getName());
            preparedStatement.setString(2, employee.getPosition());
            preparedStatement.setInt(3, employee.getId());
            preparedStatement.executeUpdate();

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

    @Override
    public void deleteEmployee(int id) {
        String query = "DELETE FROM employees WHERE id = ?";
        try (Connection connection = DriverManager.getConnection(url, user, password);
             PreparedStatement preparedStatement = connection.prepareStatement(query)) {

            preparedStatement.setInt(1, id);
            preparedStatement.executeUpdate();

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
```
### エンティティクラスの作成
``` java
public class Employee {
    private int id;
    private String name;
    private String position;

    public Employee(int id, String name, String position) {
        this.id = id;
        this.name = name;
        this.position = position;
    }

    // ゲッターとセッター
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPosition() {
        return position;
    }

    public void setPosition(String position) {
        this.position = position;
    }
}
```
以上が、JDBCとDB2を使用した基本的なデータベース操作と、データベースアクセス層の設計についての解説です。これらの基礎を理解し、実際にコードを試してみることで、データベースとの連携スキルを向上させましょう。次回は、より高度なデータベース操作に挑戦してみましょう。