【Java】JDBCをインストールして、servlet + MySQL で接続してみた。( DAO /  Bean を使用バージョンあり)

# ◆ 目次
◇ ディレクトリ構成
◇ 【画像】出力内容 ＆ DB内容

1. JDBC ドライバ導入
2. context.xml を作成する
2. 実行(複数パターン)
    1. 【実行】servlet（サーブレット）
    2. 【実行】DAO ~Beanを使わない~
    3. 【実行】DAO ~Beanを使用~

# ◇ ディレクトリ構成
:file_folder: book
　┣━ :file_folder: src
　┃　　┣━ :file_folder:　sample
　┃　　┃　　┣━ :page_facing_up: All.java
　┃　　┃　　┣━ :page_facing_up: ProductList.java
　┃　　┃　　┗━ :page_facing_up: ProductList2.java
　┃　　┃
　┃　　┣━ :file_folder: dao
　┃　　┃　　┣━ :page_facing_up: DAO.java
　┃　　┃　　┗━ :page_facing_up: ProductDAO.java
　┃　　┃
　┃　　┗━ :file_folder: bean
　┃　　　　　┗━ :page_facing_up: Product.java
　┃
　┗━ :file_folder: WebContent
　　　　┣━ :file_folder: META-INF
　　　　┃　　┗━ :page_facing_up: context.xml
　　　　┃
　　　　┗━ :file_folder: WEB-INF
　　　　　　　┗━ :file_folder: lib
　　　　　　　　　　┗━ :page_facing_up: mysql-connector-java-5.1.48-bin.jar


# ◇ 【画像】出力内容 ＆ DB内容
・表示イメージ（左）
・DBの内容（右）
![スクリーンショット 2019-10-28 16.04.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197404/0fb0e551-7cd3-7d67-aac6-50866bd8881f.png)


# 1. JDBC ドライバ導入
1. 公式サイトから``mysql-connector-java-8.0.18.zip``を[ダウンロード](https://dev.mysql.com/downloads/connector/j/)
2. 解凍するして``mysql-connector-java-5.1.48-bin.jar``を取り出す
3. ``/WebContent/WEB-INF/lib/mysql-connector-java-5.1.48-bin.jar``に入れる

# 2. context.xml を作成する
``/WebContent/META-INF/context.xml``に作成する

```ruby:context.xml
<?xml version="1.0" encoding="UTF-8" ?>
<Context>
	<Resource name = "jdbc/book"
              auth = "Container"
              type = "javax.sql.DataSource"
              driverClassName = "com.mysql.jdbc.Driver"
              url      = "jdbc:mysql://localhost/book"
              username = "username"
              password = "password">
	</Resource>
</Context>
```
# 3. 実行（複数パターン）
1. 【実行】servlet（サーブレット）
2. 【実行】DAO ~Beanを使わない~
3. 【実行】DAO ~Beanを使用~

## 1. 【実行】servlet（サーブレット）
``/src/sample/All.java``に作成する

```ruby:All.java
package sample;

import java.io.*;
import java.sql.*;

import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import javax.sql.*;

/**
 * Servlet implementation class All
 */
@WebServlet("/All")
public class All extends HttpServlet {


	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		PrintWriter out = response.getWriter();

		try {
			// コネクション取得
			InitialContext ic = new InitialContext();
			DataSource ds = (DataSource) ic.lookup("java:/comp/env/jdbc/book");
			Connection con = ds.getConnection();

			// SQL文送信
			PreparedStatement st = con.prepareStatement("select * from product");
			// 実行＆結果受け取り
			ResultSet rs = st.executeQuery();

			// データの表示
			while (rs.next()) {
				out.println(
					rs.getInt("id")      + ":" + 
					rs.getString("name") + ":" + 
					rs.getInt("price")
				);
			}

			// データベース切断
			st.close();
			con.close();

		} catch (Exception e) {
			// 接続・SQL文エラー
			e.printStackTrace(out);

		} // try
	}

}
```

## 2. 【実行】DAO ~Beanを使わない~
DAO（Data Access Object）を作成！！！！( ^ω^ )
上記、``1. 【実行】servlet（サーブレット）``の内容をライブラリ化する

1 )  ``DAO.java`` を作成する（コネクション取得）
2 ) ``ProductList.java`` を作成する（DAO取得 & 処理 & 表示）

### 1 ) DAO.java を作成する（コネクション取得）
```ruby:DAO.java
package dao;

import java.sql.Connection;

import javax.naming.InitialContext;
import javax.sql.DataSource;

public class DAO {
	static DataSource ds;

	public Connection getConnection() throws Exception {
		
		// 初期コンテキスト構築
		InitialContext ic = new InitialContext();
		
		// DBの接続先情報を取得（context.xmlの内容）
		ds = (DataSource) ic.lookup("java:/comp/env/jdbc/book");

		return ds.getConnection();
	}
}
```
### 2 ) ProductList.java を作成する（DAO取得 & 処理 & 表示）
```ruby:ProductList.java
package sample;

import dao.DAO;

import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet("/sample/productList")
public class ProductList extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		PrintWriter out = response.getWriter();

		try {
			// DB接続
			DAO dao = new DAO();
			Connection con = dao.getConnection();

			// SQL作成
			PreparedStatement st = con.prepareStatement("SELECT * FROM product");

			// SQL実行
			ResultSet rs = st.executeQuery();

			// データをセット
			while (rs.next()) {
				out.println(
	                    rs.getInt("id")      + ":" + 
	                    rs.getString("name") + ":" + 
	                    rs.getInt("price")   + "<br>"
	                );
			}

			// 接続解除
			st.close();
			con.close();

		} catch (Exception e) {
			e.printStackTrace(out);
		}

	}
}
```
## 3. 【実行】DAO ~Beanを使用~
1 )  ``DAO.java`` を作成する（コネクション取得）
2 )  ``Product.java`` を作成する（Bean）
3 ) ``ProductDAO.java`` を作成する（DAO取得 & 処理）
4 ) ``ProductList2.java`` を作成する（ProductDAO取得 & 表示）

### 1 ) DAO.java を作成する（コネクション取得）
上記、``2 ) 【実行】DAO ~Beanを使わない~``と同じ為
！！！！！　割愛　！！！！！

### 2 ) Product.java を作成する（Bean）
```ruby:Product.java
package bean;

public class Product implements java.io.Serializable {
	private int id;
	private String name;
	private int price;

	public int getId() {
		return id;
	}

	public String getName() {
		return name;
	}

	public int getPrice() {
		return price;
	}

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

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

	public void setPrice(int price) {
		this.price = price;
	}
}
```
### 3 ) ProductDAO.java を作成する（DAO取得 & 処理）
```ruby:ProductDAO.java

package dao;

import java.sql.*;
import java.util.*;
import bean.Product;

public class ProductDAO extends DAO {
	public List<Product> listAll() throws Exception {

		List<Product> list = new ArrayList<>();

		// DB接続
		Connection con = getConnection();

		// SQL作成
		PreparedStatement st = con.prepareStatement("SELECT * FROM product");

		// SQL実行
		ResultSet rs = st.executeQuery();

		// データをセット
		while (rs.next()) {
			Product p = new Product();
			p.setId(rs.getInt("id"));
			p.setName(rs.getString("name"));
			p.setPrice(rs.getInt("price"));

			list.add(p);
		}

		// 接続解除
		st.close();
		con.close();

		return list;
	}
}
```
### 4 ) ProductList2.java を作成する（ProductDAO取得 & 表示）
```ruby:ProductList2.java
package sample;

import java.io.*;
import java.sql.*;
import java.util.List;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import javax.sql.*;
import bean.Product;
import dao.ProductDAO;

@WebServlet("/sample/productList2")
public class Search2 extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		PrintWriter out = response.getWriter();

		try {
			ProductDAO dao = new ProductDAO();

			List<Product> list = dao.listAll();

			for (Product p : list) {
				out.println(
						p.getId()    + ":" + 
						p.getName()  + ":" + 
						p.getPrice() + "<br>"
				);
			}

		} catch (Exception e) {
			e.printStackTrace(out);
		}

	}

}
```

# 参考サイト
※ めちゃくちゃ参考になった！！！
Java で MySQL に 接続する 方法
https://garafu.blogspot.com/2016/05/how-to-connect-mysql.html#con-svlt1