【Java】EclipseでOracle Databaseに接続する方法

# はじめに
今回は、JDBCを利用し、EclipseでOracle Databaseに接続する方法についてまとます。
大まかな手順と処理について記載しており、技術の詳細には触れていません。

※おことわり※
基本的に学習内容のアウトプットです。
初学者であるため、間違い等あればご指摘いただけますと嬉しいです。

# この記事の目的
以下内容のアウトプット
- JDBCドライバの追加
- データベースへ接続と切断
- SQLの操作

# 開発環境
- Java 16.0.2
- JDK javac 10.0.1
- JDBC Oracle 12.1.0.1.0 JDBC 4.1 compiled with JDK7
- Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
- Eclipse

# この記事の内容
1. 前提
2. チートシート
3. JDBCドライバの追加（準備） 
4. データベースへ接続と切断（DBManager）
5. SQLの操作（DBへ問い合わせ）

# 1. 前提
- データベースにテーブルが用意されている
- OracleのJDBCドライバがダウンロード済みである
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740809/570794c5-c57f-5af4-26ae-665ee3de7618.png)

# 2. チートシート
大まかな流れと処理を記載した、手順書です。
![JDBC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740809/a96051f7-d57d-a126-2e42-8d5b5746cd10.png)

# 3. JDBCドライバの追加（準備） 
Eplicseを開き、プロジェクトを新規作成します。
例：プロジェクト名 `jdbc_training`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740809/e2a3ef86-1dec-4cef-4082-347fc2068303.png)

上記で作成したプロジェクトの中に、`libフォルダ` を作成します。
（scrと同じ階層）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740809/96b4abe1-27e8-5db2-62bb-de9ba099611d.png)

libフォルダに、ダウンロード済みのJDBCドライバを格納します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740809/9a791eb1-782d-da68-7ff6-addb8a751205.png)

JDBCドライバをビルド・パスに追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740809/a63f653f-70dc-cdcc-1841-fb1c12c735fc.png)

libフォルダと同じ階層に、参照ライブラリーが自動で生成されたら成功です。

# 4. データベースへ接続と切断（DBManager）
パッケージとクラスを作成します。
例：パッケージ名 `jp.co.jdbc`　
　　ドライバクラス名 `DBManager`
　　実行用クラス名 `JdbcTraining01`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740809/c40b2168-6ef8-90c9-a1c8-9ebc92ac7d7a.png)

`DBManager.java` に以下プログラムを記述します。

**補足**
①定数宣言
正確には定数ではありません。参照型変数の参照の差し替えを禁止しています。

②ドライバクラス名
JDBCドライバ毎に異なります。
ojdbc7.jarの場合・・・`oracle.jdbc.driver.OracleDriver`

③Class#forName()メソッド
引数に指定されたクラスが存在しなかった場合、例外クラスを送出します。
例外クラス・・・`ClassNotFoundException`

④DriverManager#getConnection()メソッド
DBへの接続が失敗した場合、、例外クラスを送出します。
例外クラス・・・`SQLException`

```DBManager.java
package jp.co.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBManager {
	//　定数宣言_1⃣
	private static final String DRIVER = "xxxx";     // ドライバクラス名_2⃣
	private static final String URL = "jdbc:oracle:thin:@localhost:1521:XE";        // 接続するDBのURL
	private static final String USER_NAME = "xxxx";  // DB接続するためのユーザー名
	private static final String PASSWORD = "xxxx";   // DB接続するためのパスワード
	
	// 接続メソッドを定義
	public static Connection getConnection() throws ClassNotFoundException, SQLException{
		// JVMにJDBCドライバクラスを登録_3⃣
		Class.forName(DRIVER);
		// DBに接続_4⃣
		Connection conn = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
        System.out.println("DBへ接続成功！");
		// 接続情報を返す
		return conn;
	}
	
	// 切断メソッドの定義
	public static void close(Connection connection) {
		// 接続情報が入っていたら、切断処理を実行
		if(connection != null) {
			try {
				connection.close();
                System.out.println("DBへの接続を切断");
			}catch(SQLException e) {
				e.printStackTrace();
			}
		}
	}
}
```

実行用クラスの `JdbcTraining01.java` に、以下プログラムを記述します。

```JdbcTraining01.java
package jp.co.jdbc;

import java.sql.Connection;

public class JdbcTraining01 {
	public static void main(String[] args) {
		// connectionオブジェクトを生成
		Connection connection = null;
		
		try {
			// DB接続が成功したら、接続情報が返ってくる
			connection = DBManager.getConnection();
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			// DB接続を切断するメソッドに、接続情報を渡す
			DBManager.close(connection);
		}
	}
}
```

実行し、コンソールに以下が表示されたら成功です。
```console
DBへ接続成功！
DBへの接続を切断
```

# 5. SQLの操作（DBへ問い合わせ）
新しく実行用クラスを作成します。
例：クラス名 `JdbcTraining02`

**補足**
①SQLの実行、実行結果の受け取り
検索系SQL（SELECT文）・・・実行 `executeQuery()メソッド`　受け取り `ResultSet型` 
更新系SQL（INSERT, UPDATE, SELETE文）・・・実行 `executeUpdate()メソッド`　受け取り `int型`

②接続を切断
オブジェクトを生成したとの逆の順番で切断します。
```JdbcTraining02.java
package jp.co.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class JdbcTraining02 {
	public static void main(String[] args) {
		select();
	}
	
	public static void select() {
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;
		
		try {
    		// DBへ接続
			connection = DBManager.getConnection();
			
			// SQLを定義
			String sql = "SQL文を記述";

            // ステートメントを作成
			preparedStatement = connection.prepareStatement(sql);

            // プレースホルダに値をバインド
            preparedStatement.setString(1, xxxx);
			
			// SQLを実行し、実行結果を受け取る_1⃣
			resultSet = preparedStatement.executeQuery();
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			// 接続を切断_2⃣
			DBManager.close(resultSet);
			DBManager.close(preparedStatement);   // DBManager.javaに追加でメソッドを定義
			DBManager.close(connection);          // DBManager.javaに追記でメソッドを定義
		}
	}
}
```

DBManager.java の `切断メソッドを定義` の場所に、closeメソッドを追記する。
```DBManager.java
public static void close(PreparedStatement preparedStatement) {
		if(preparedStatement != null) {
			try {
				preparedStatement.close();
			}catch(SQLException e) {
				e.printStackTrace();
			}
		}
	}
	public static void close(ResultSet resultSet) {
		if(resultSet != null) {
			try {
				resultSet.close();
			}catch(SQLException e) {
				e.printStackTrace();
			}
		}
	}
```