SQLとデータベースの連携　

自分なりのまとめ
★☆MySQLを使用してます☆★

## JDBC
Java Datebase Connectivityの略
Javaプログラムとデータベースを接続するためのAPI。Javaプログラムからデータベースに対してSQLクリエを実行したり、データを操作ができる。

## 主な機能
**①データベース接続**
Javaプログラムからデータベースに接続し、操作を行う為の接続オブジェクト(`Connection`)を作成

**②SQLクリエの実行**
SQLクリエ(`SELECT`,`INSERT`,`UPDATE`,`DELETE`など)を実行するための 　`Statement`,`PreparedStatement`,`CallableStatement` オブジェクトを提供

**③結果セットの処理**
`SELECT`クリエの結果として得られるデータを処理するための`ResultSet`オブジェクトを提供

**④トランザクション管理**
データベース内でのトランザクション(複数のSQL操作を1つの単位として扱う)の制御を行う。`commit()`や`rollback()`を使ってトランザクションを確定や取り消しなどができる。

## JDBC URL形式
```
jdbc:mysql://サーバーのホスト名またはIPアドレス/データベース名;
```
**jdbc:mysql://** 
JDBCのプロトルコを指定し、MySQLに接続することを示す

**サーバーのホスト名またはIPアドレス**
MySQLサーバーが稼働しているマシンのホスト名(例：`localhost`)やIPアドレス(例:`192.168.1.100`)を指定

**/データベース名**
接続したい特定のデータベースの名前を指定。MySQLサーバーに複数のデータベースが存在する場合、ここで指定したデータベースに接続される

**追加の接続オブション**
追加の接続オプションを指定する場合は、クエリパラメータ形式で追加できる
`例: ?serverTimezone=Asia/Tokyo`
MySQLサーバーのタイムゾーンが日本標準時(JST)であることを指定

**例**
```sql
jdbc:mysql://localhost/test?serverTimezone=Asia/Tokyo";
ローカルホスト上のtestデータベースに接続し、その接続のタイムゾーンを日本標準時に設定している。
```

## 接続してみた
```java
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;

import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse; 


@WebServlet("/DBAccessServlet")
public class DBAccessServlet extends HttpServlet{
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { 
		doPost(request,response);
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { 
		try {
			// JDBC ドライバのクラスをロードする
			Class.forName("com.mysql.cj.jdbc.Driver");
			
			// データベースの接続 URLを設定する(○○○○の部分は使用するデータベース名）
			String url = "jdbc:mysql://localhost/○○○○?serverTimezone=Asia/Tokyo";
			//ユーザー名、パスワードを設定する(○○○○の部分は自分の設定したパスワード)
			Connection connection = DriverManager.getConnection(url, "root", "○○○○");
			
			// データベース接続成功メッセージをリクエスト属性として設定する
            request.setAttribute("message", "データベース接続しました");
		   
		    // データベース接続を閉じる
			connection.close();
			}  catch(Exception e) {
		   // 例外が発生した場合にスタックトレースを出力する
		   e.printStackTrace();
		} 
		
		// JSP ページにリクエストをフォワードする
		RequestDispatcher dispatch = request.getRequestDispatcher("/jsp/dbAccess.jsp");
		dispatch.forward(request, response);
	}
}
```

```jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
 <head>
  <meta http-equiv ="Content-Type" content="text/html; charset= UTF-8"> 
  <title>表示</title>
 </head>
 <body> 
  <p>${message}</p>
 </body>
</html>
```

## データを検索して表示させてみた
```java
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet("/DBAccessTestServlet")
public class DBAccessTestServlet extends HttpServlet {
    
    // GETリクエストをPOSTリクエストにフォワードする
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
    
    // POSTリクエストを処理するメソッド
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            // MySQLのJDBCドライバをロード
            Class.forName("com.mysql.cj.jdbc.Driver");
            
            // データベース接続URL、ユーザー名、パスワードを指定して、MySQLサーバーに接続
            String url = "jdbc:mysql://localhost/test1?serverTimezone=Asia/Tokyo"; 
            Connection connection = DriverManager.getConnection(url, "root", "sakanae41");
            
            // SQLクエリを定義。名前が「りんご」の商品の価格を取得する
            String sql = "SELECT price FROM foods WHERE name = ?";
            String price = null;
            
            // SQLクエリを準備し、プレースホルダーに値を設定
            PreparedStatement ps = connection.prepareStatement(sql);
            ps.setString(1, "りんご");
            
            // クエリを実行し、結果セットを取得
            ResultSet rs = ps.executeQuery();
            
            // 結果セットから価格を取得し、変数に格納
            while(rs.next()) {
                price = rs.getString("price");
            }
            
            // 取得した価格をリクエスト属性として設定
            request.setAttribute("message", "りんごの金額は" + price + "円です");
            
            // データベース接続をクローズ
            connection.close();
        } catch(Exception e) {
            // 例外発生時にエラーメッセージをリクエスト属性に設定し、例外をログ出力
            request.setAttribute("message", "エラーが発生しました: " + e.getMessage());
            e.printStackTrace();
        }
        
        // JSPページにリクエストをフォワード
        RequestDispatcher dispatch = request.getRequestDispatcher("/jsp/dbAccess.jsp");
        dispatch.forward(request, response);
    }
}
```

```jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
 <head>
  <meta http-equiv ="Content-Type" content="text/html; charset= UTF-8"> 
  <title>表示</title>
 </head>
 <body> 
   <%= (String)request.getAttribute("message") %>
 </body>
</html>
```