スッキリわかるJava入門 実践編 第３版 まとめ - part9 -データベースアクセス

# はじめに

こんにちは　◤●ㅅ●◥ﾉ

今回はデータベースアクセスについて学びました！
## 第９章　データベースアクセス
### 1.データベースとは
本格的なプログラムの保存先
データベースの実体
→常時稼働してデータの格納や検索に関する要求を待ち受けるプログラム
　→このプログラムのことを __データベース管理システム__　と呼ばれている

特にデータを複数の表の形で整理して保存、管理する
→　__リレーショナルデータベース（RDB）__

JavaからRDBに対してデータの読み込みや書き込みを行うためには __SQL__　
というデータベースを操作する専用の言語で書かれた命令をRDBに送る

:star: データベースを使うメリット
・データベースを使うと、複雑なデータ検索や書き込みも簡単に行える
・Javaプログラムの中で複雑なデータ処理を記述する必要がない

### 2.データベースの基本操作
データベースはデータを管理するために複数の表を内部に保持されている
表は列と行で構成され、１つの行が１件のデータに相当し、列はデータの要素に相当する

#### ４つの基本操作
・検索　SELECT
・挿入　INSERT
・更新　UPDATE
・削除　DELETE

#### データベース利用のためのAPI
JavaではJDBCというデータベース操作専用のAPIが用意されている

・DriverManager
 DBMSへの接続準備のために利用する
・Connection
　DBMSへの接続や切断の際に利用する
・PreparedStatement
　SQL文を送信する際に利用する
・ResultSet
　DBMSから検索結果を受け取る際に利用する

### 3.データベースの接続と切断
JDBCを含むすべてのプログラムで共通することが
「接続」→「SQL送信」→「切断」
の３つのステップ
＋準備段階の４つのステップが必要となる

#### step0 事前準備
1.JDBCドライバの準備
2.JDBCドライバのロード

JDBCドライバの有効化
`Class.forName(JDBCドライバの完全限定名);`
#### step1 接続の確率
Javaプログラムからデータベースへの接続を確率するには
以下の構文を利用してjava.sql.Connectionのインスタンスを取得する
`con = DriverManager.getConnection(JDBC URL);`
`con = DriverManager.getConnection(JDBC URL,ID,PW);`

JDBC URL
→「データベース接続先を指定する文字列」

#### step2　SQL処理
大きく２つのパターンに分かれる
INSERT,UPDATE,DELETEの更新系
SELECTの検索系
を送るかになる
詳しくは４.更新系SQL文の送信以降の部分になる

#### step3 接続の切断
データベースの切断はConnectionのclose()を呼ぶだけ
close()はfinallyブロックに記述する

### 4.更新系SQL文の送信
更新系のSQL文には「何行分の処理に成功したか」を表す
単純な数字だけがデータベースから返されるという共通の特徴がある

更新系のSQL文の送信処理は以下の４つの手順で処理を行う
1.送信すべきSQL文のひな形を準備する
2.ひな形に流し込んでSQL文を組み立てる
3.組み立て終えたSQL文をDMBSに送信する
4.処理結果を判定する

#### step2.1-1.SQL文のひな形の準備
`PreparedStatement pstmt = con.prepareStatement(SQL文のひな形);`

#### step2.1-2.ひな形に値を流し込む
`pstmt.setInt(パラメータ番号、数値);`
`pstmt.setString(パラメータ番号、文字列);`

#### step2.1-3.SQL文をDBMSに送信する
送信にはPreparedStatementのexecuteUpdateメソッドを利用する
`int r = pstmt.executeUpdate();`

#### step2.1-4.成否判定を行う
executeUpdate()の戻り値が、想定された数値であれば成功
すべての処理が終わったところで、PreparedStatementのclose()を読んで忘れずに後片付けをする

### 5.検索系SQL文の送信
検索系SQL文の送信処理は、次のようになる
1.送信すべきSQL文のひな形を準備する
2.ひな形に値を流し込んでSQL文を組み立てる
3.組み立て終えたSQL文をDMBSに送信する
4.ResultSetを使い、結果表からデータを取り出す

SQLの雛形を作り、値を流し込んで組み立てるまでは更新系SQL文と全く同じ
送信のみ違うのでその手順が以下のもの

#### step2.2-3.検索系SQL文の送信
`ResultSet rs = pstmt.executeQuery();`

executeQuery()を呼び出すと、すぐにSELECT文がデータベースに送られ、結果が返ってくる

### 6.結果表の処理
Resultsetは注目している特定の１行の情報しか取り出すことができない
JDBCにおけるResultSetは次の手順で利用することができる
1.next()で注目行を１つずつ先に進める
2.get()~で必要な列の情報を取り出す

ResultSet利用のイディオム
※イディオムは2つ以上の語が結びついて特殊な意味を持つ言葉のこと
`while(rs.next()) 検索結果の全行を順に処理`
`if(rs.next())　検索結果があるかないかを判定`

### 7.JavaとDBのデータ型
日時情報の取り扱いには注意が必要
データベースの日時情報は日付情報だけもち、時刻情報は保持しない
→jaba.util.Date型の情報はデータベースでは両方を保持するTIMESTAMP型を利用する

### 8.トランザクション処理
データベースにはファイルにはない特徴がある
その中の代表的な機能が __トランザクション__
→プログラムからデータベースに送信する１つ以上のSQL文の要求を１つのグループとして扱う考え方

DBMSは以下のようなトランザクション制御を行う
:star: データベースのトランザクション制御
同一トランザクションに属するSQL文の処理要求が複数ある場合
・すべてが成功して初めて処理結果を確定する（コミット）
・途中で失敗したら、トランザクション実行前の状態に戻す（ロールバック）

データベースの処理を確定させること→ __コミット__
実行前の状態に戻すこと→ __ロールバック__

#### トランザクションの利用
JDBCを用いてトランザクション制御を指示するにはデータベース接続時に取得したConnectionを利用する
具体的には以下の３つのメソッドを適切なタイミングで使用する

:pencil2: 自動コミットモードの解除
JDBCの初期状態ではトランザクション制御がなされない状態になっている
次の構文を使うことで明示的にトランザクション制御を行うことができる

`con.setAutoCommit(false);`

:pencil2: 送信済みの処理要求の確定（コミット）
一連のトランザクションに必要なSQL文をすべて送ったらコミットをする
`con.commit();`

:pencil2: 送信済みの処理要求のキャンセル
複数のSQL文の要求を送信している途中でキャンセルしたい時
`con.rollback();`

## まとめ
データベースには検索性能、並列実行、トランザクション制御などファイルにはない特徴を持つ
リレーショナルデータベース（RDB）はデータを表形式で管理する
RDBはSQLという専用の言語で書かれた命令を使って操作する
SQLでは、検索、挿入、更新、削除の４つの基本的な操作を行うことができる
データーベースにSQL文を送信するにはJDBCというAPIを利用する

今回もありがとうございました！
ではまた〜　◤●ㅅ●◥ﾉ"