JDBC　備忘録

### DAO
データベースにアクセスする機能をまとめたデータベースアクセス
専用のクラスのことをDAO(Data Access Object)と言います。

DAOはテーブル単位で定義することが一般的です。
現場によっても違ってくるので必ずチームメンバーに確認しましょう）


### DTO
クラスやメソッド間で複数のデータをまとめて受け渡す際に使用されるクラスをDTO (Data Transfer Object)と言います。基本的にDTOはそのクラスブロック内にフィールドとgetter/setterのみしか持ちません。
  
  
DTOは主にテーブルの1レコード分のデータを格納する目的で定義されます。そのため、1つのテーブルにつき1つDTOを定義することが一般的です。

```java:Java 
  	//ResultSetオブジェクトから1レコード分のデータをDTOに格納
		if(rs.next()){
			dto = new Sample4_02_1_Common_DTO();
			dto.setId    (   rs.getInt(    "id"     ) );
			dto.setName  (   rs.getString( "name"   ) );
			dto.setGender(   rs.getString( "gender" ) );
			dto.setAge   (   rs.getInt(    "age"    ) );
			dto.setCourse(   rs.getString( "course" ) );
		} 
  ```

### データベース接続の概要
Javaアプリケーションからデータベース(RDBMS)に接続する場合、
java.sql.DriverManagerクラスを使用し、以下の手順で行う。

①JDBCドライバのロード
Class.forNameメソッドを使ってドライバをロードします。

```java:Java 
		//JDBCドライバの相対パス
		//※バージョンによって変わる可能性があります（MySQL5系の場合は「com.mysql.jdbc.Driver」）
		String driverName = "com.mysql.cj.jdbc.Driver";
		
	----------------------------------------------------------------------------------------------------
	
		//-------------------------------------------
		//① JDBCドライバのロード
		//-------------------------------------------
		try {
			Class.forName(driverName);       //JDBCドライバをロード＆接続先として指定
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
  ```

  ②接続の確立
DriverManagerクラスのgetConnectionメソッドを使用してデータ
ベースとの接続に必要なConnectionオブジェクトを取得します。

```java:Java 
		//接続先のデータベース
		//※データベース名が「test_db」でない場合は該当の箇所を変更してください
		String jdbcUrl    = "jdbc:mysql://localhost/test_db?characterEncoding=UTF-8&serverTimezone=JST&useSSL=false";

		//接続するユーザー名
		//※ユーザー名が「test_user」でない場合は該当の箇所を変更してください
		String userId     = "test_user";

		//接続するユーザーのパスワード
		//※パスワードが「test_pass」でない場合は該当の箇所を変更してください
		String userPass   = "test_pass";
		
	-------------------------------------------------------------------------------------------------------------------
		
		//-------------------------------------------
		// ②接続の確立（Connectionオブジェクトの取得）
		//-------------------------------------------
		con = DriverManager.getConnection(jdbcUrl, userId, userPass);
  
  ```

④抽出結果の取得
ResultSetオブジェクトでSQLの実行結果が返ってくるので読み取って処理します。

```java:Java 
		ResultSet  rs  = null ;   // ResultSet（SQL抽出結果）格納用変数
	
	-------------------------------------------------------------------------------------------
		
		//SQL文の送信＆抽出結果（ResultSetオブジェクト）の取得
		rs = ps.executeQuery();
		
		//ResultSetオブジェクトから1レコードずつデータを取得＆加工＆表示する
		while (rs.next()) {

			//1レコード分のデータを取得＆加工（各カラムをコンマ綴りで結合）
			StringBuffer rsbuf = new StringBuffer();
			rsbuf.append(rs.getString("id"));
  
  ```

⑤接続の解除
データベースへのアクセスが終了したら明示的に接続を解除する必要があります。 
Connectionオブジェクト、Statement系オブジェクト、ResultSetオブジェクト、
それぞれでcloseメソッドを起動することで接続を解除できます。

```java:Java 
			//-------------------------------------------
			// ⑤接続の解除
			//-------------------------------------------

			//ResultSetオブジェクトの接続解除
			if (rs != null) {    //接続が確認できている場合のみ実施
				try {
					rs.close();  //接続の解除
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}

			//PreparedStatementオブジェクトの接続解除
			if (ps != null) {    //接続が確認できている場合のみ実施
				try {
					ps.close();  //接続の解除
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}

			//Connectionオブジェクトの接続解除
			if (con != null) {    //接続が確認できている場合のみ実施
				try {
					con.close();  //接続の解除
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
  
  ```

  ### PreparedStatementとプレースホルダ
  PreparedStatementにはプレースホルダを扱えるという特徴があります。
SQL文中に『 ？ 』をつけることで後から好きな値を設定して発行することができるようになります。

プレースホルダに値をセットする場合はPreparedStatementで用意されているsetXxxメソッドを使用します。
String型のデータを ? の部分にセットしたい場合はsetStringメソッド、int型の場合はsetIntメソッドという具合です。

setXxxメソッドは引数を2つ必要とし、第1引数には何番目の ? にセットするかという数値データを、第2引数には実際にセットしたいデータを入力します。

```java:Java 
			//-------------------------------------------
			//接続の確立（Connectionオブジェクトの取得）
			//-------------------------------------------
			con = DriverManager.getConnection(JDBC_URL, USER_ID, USER_PASS);

			//-------------------------------------------
			//SQL文の送信 ＆ 結果の取得
			//-------------------------------------------

			//発行するSQL文の生成（SELECT）
			StringBuffer buf = new StringBuffer();
			buf.append(" SELECT        ");
			buf.append("   id     ,    ");
			buf.append("   name   ,    ");
			buf.append("   gender ,    ");
			buf.append("   age    ,    ");
			buf.append("   course      ");
			buf.append(" FROM          ");
			buf.append("   uzuz_member ");
			buf.append(" WHERE         ");
			buf.append("   id = ?      ");  //第1パラメータ

			//PreparedStatement（SQL発行用オブジェクト）を生成＆発行するSQLをセット
			ps = con.prepareStatement(buf.toString());

			//パラメータをセット
			ps.setInt(1, pk);

			//SQL文の送信＆戻り値としてResultSet（SQL抽出結果）を取得
			rs = ps.executeQuery();
  
  ```