【サーブレット&jsp】Insert文でデータベースにデータを登録する

Java

今回の記事ではサーブレットとjspでデータベースにデータを登録する方法について、解説していきます。
jspのフォームからデータを送信し、受け取ったデータをデータベースに登録します。

利用しているデータベースはPostgreSQLです。

「独学だと何から勉強したら良いかわからない」という方にはDig Skillがおすすめです!
Dig Skillでは月1000円でオリジナルのカリキュラムを使ってWebアプリの開発方法を学ぶことができます!30日間の無料体験もあるので、公式サイトをチェックしてみてください!

今回作成するもの

今回データを登録するテーブルは次のように本のタイトルと値段を管理するテーブルです。

idtitle(タイトル)price(値段)

本の一覧を表示している画面から、新規で本を登録することが出来ます。

入力して、「登録」ボタンを押すと本が登録されます。

一覧画面が再表示され、登録した本が新しく表示されます。

一覧表示についてはこちらの記事を参考にしてみてください。

books.jsp(パラメータを送信)

最初に入力する画面であるbooks.jspを作成します。

books.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.List" %>
<%@ page import="model.dao.dto.Book" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>本の一覧を表示する</title>
</head>
<body>
	<% List<Book> books = (List<Book>)request.getAttribute("books"); %>
	

	<p>テーブルに保存されている本のタイトル一覧</p>
	<table>
		<tr>
			<td>id</td>
			<td>タイトル</td>
			<td>値段</td>
		</tr>
		<% for(Book book: books) { %>
		<tr>
			<td><%= book.getId() %></td>
			<td><%= book.getTitle() %></td>
			<td><%= book.getPrice() %></td>
		</tr>
		<% } %>
	
	</table>

	<p>本を登録する</p>
	<form action="insert" method="POST">
		<label>タイトル</label><input type="text" name="title"><br>
		<label>値段</label><input type="number" name="price"><br>
		<input type="submit" value="登録">
	</form>
</body>
</html>

今回大切になるのは、画面下の方の「form」の箇所です。

<form action="insert" method="POST">
	<label>タイトル</label><input type="text" name="title"><br>
	<label>値段</label><input type="number" name="price"><br>
	<input type="submit" value="登録">
</form>

このformはactionとして「insert」に値を送信します。
送信するのは本のタイトルと値段です。

InsertServlet.java

次に画面から送信されてきたパラメータを受け取って、データベースに登録する「InsertServlet.java」です。
先ほどの画面のフォームはpostメソッドでパラメータが送信されてくるので、doPostメソッドを作成します。

InsertServlet.java

package uhablog;

import java.io.IOException;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import model.dao.InsertBookDao;

@WebServlet("/insert")
public class InsertServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * データベースにデータを登録する
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8"); // 文字化け防止
		
		// フォームの値を受け取る
		String title = request.getParameter("title");
		int price = Integer.parseInt(request.getParameter("price"));
		
		// データベースに登録する
		InsertBookDao dao = new InsertBookDao();
		try {
			int result = dao.insertBook(title, price);
		} catch (SQLException | ClassNotFoundException e) {
			e.printStackTrace();
		} 
		
		// 一覧画面にリダイレクトする
		response.sendRedirect("/BlogApplication/books-list");
	}
}

パラメータの受け取り

// フォームの値を受け取る
String title = request.getParameter("title");
int price = Integer.parseInt(request.getParameter("price"));

画面から送られてくる本のタイトルと、値段を取得しています。
画面から送られてくるパラメータは全てString型です。

タイトルはそのままString型として受け取れば問題ありません。
しかし、値段はint型に変換する必要があります。
そのためInteger.parseIntメソッドを使って、文字列をint型に変換しています。

データベースへの登録

// データベースに登録する
InsertBookDao dao = new InsertBookDao();
try {
	int result = dao.insertBook(title, price);
} catch (SQLException | ClassNotFoundException e) {
	e.printStackTrace();
} 

こちらでは受け取ったパラメータをもとにデータベースに登録しています。
ここで使っているInsertBookDaoとそのメソッドであるinsertBookはこの後詳しく解説します。

一覧画面にリダイレクト

// 一覧画面にリダイレクトする
response.sendRedirect("/BlogApplication/books-list");

登録後に一覧画面にリダイレクトしています。
リダイレクトすることで、データベースから本を再取得することが出来ます。
それによって登録した新しい本も一覧に表示することが出来ます。

InsertBookDao.java

次にInsertBookDaoeです。
この「InsertBookDao」でSQLを実行して、データベースにデータを登録します。

package model.dao;

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

public class InsertBookDao {
	// データベースのURL
	private static final String URL = "jdbc:postgresql://localhost:5432/BlogDB";
	
	// データベースにアクセスするユーザー
	private static final String USER = "uhablog";
	
	// データベースにアクセスするユーザーのパスワード
	private static final String PASSWORD = "P@ssword";
	
	/**
	 * データベースの接続を取得する
	 * @return
	 * @throws SQLException
	 */
	public static Connection getConnection() throws ClassNotFoundException, SQLException{
		Class.forName("org.postgresql.Driver");
		return DriverManager.getConnection(URL, USER, PASSWORD);
	}
	
	/**
	 * データベースにデータを登録する
	 * @param title
	 * @param price
	 * @return
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 */
	public int insertBook(String title, int price) throws ClassNotFoundException, SQLException {
		
		// 登録した行数を保持する変数
		int result = 0;
		
		// 実行するSQL
		String sql = "INSERT INTO BooksInfo(title, price) values(?, ?);";
		
		// DBに接続する
		try (Connection con = getConnection();
				PreparedStatement pstmt = con.prepareStatement(sql);) {
			
			// パラメータの設定
			pstmt.setString(1, title);
			pstmt.setInt(2, price);
			
			// SQLの実行
			result = pstmt.executeUpdate();
		}		
		return result;
	}
}

データベースへの接続

// データベースのURL
private static final String URL = "jdbc:postgresql://localhost:5432/BlogDB";
	
// データベースにアクセスするユーザー
private static final String USER = "uhablog";

// データベースにアクセスするユーザーのパスワード
private static final String PASSWORD = "P@ssword";
	
/**
 * データベースの接続を取得する
 * @return
 * @throws SQLException
 */
public static Connection getConnection() throws ClassNotFoundException, SQLException{
	Class.forName("org.postgresql.Driver");
	return DriverManager.getConnection(URL, USER, PASSWORD);
}

データベースへの接続を取得するためのフィールドとメソッドです。
フィールドとして、URL、ユーザー名、ユーザーのパスワードを保持しています。

getConnectionメソッドで、先ほどのフィールドを利用して接続を取得し、返却しています。

insertBookメソッド

/**
 * データベースにデータを登録する
 * @param title
 * @param price
 * @return
 * @throws ClassNotFoundException
 * @throws SQLException
 */
public int insertBook(String title, int price) throws ClassNotFoundException, SQLException {
		
	// 登録した行数を保持する変数
	int result = 0;
		
	// 実行するSQL
	String sql = "INSERT INTO BooksInfo(title, price) values(?, ?);";
		
	// DBに接続する
	try (Connection con = getConnection();
			PreparedStatement pstmt = con.prepareStatement(sql);) {
			
		// パラメータの設定
		pstmt.setString(1, title);
		pstmt.setInt(2, price);
			
		// SQLの実行
		result = pstmt.executeUpdate();
	}		
	return result;
}

このメソッドでSQLを実行し、本をデータベースに登録します。

準備

// 登録した行数を保持する変数
int result = 0;
		
// 実行するSQL
String sql = "INSERT INTO BooksInfo(title, price) values(?, ?);";

データベースに対して、新規登録や更新、削除などの処理を行うと、変更があった行数がint型で返却されます。
そのため、その行数を保持するための変数を宣言しています。

また実行するSQLをString型の変数に格納しています。
実際に登録するタイトルや値段は後から設定するため、この時点では「?」としておきます。

DBへの接続

// DBに接続する
try (Connection con = getConnection();
		PreparedStatement pstmt = con.prepareStatement(sql);) {

次にデータベースに接続します。
先ほどのgetConnection()メソッドを使って、DBへの接続を取得しています。

その後、その接続を使って、prepareStatementメソッドで、先ほど作成したsqlを引数として渡しています。

SQLの実行

// パラメータの設定
pstmt.setString(1, title);
pstmt.setInt(2, price);
			
// SQLの実行
result = pstmt.executeUpdate();

こちらでSQLの実行をしています。
まず、pstmtに対してsetXXXXを使って、パラメータを設定しています。

先ほどString型の変数にsqlを記述した際、「?」を使っていた箇所があります。
ここに対して、値を設定しています。

String型の値を設定する場合はsetStringメソッドを使い、int型の値を設定する場合はsetIntメソッドを使います。

パラメータの設定を行う前のSQLは次のようになっていました。

INSERT INTO BooksInfo(title, price) values(?, ?);

パラメータの設定を行うことで次のようになります。

INSERT INTO BooksInfo(title, price) values(引数titleに設定されている値, 引数priceに設定されている値);

そしてパラメータの設定を行なったSQLを実行しているのが次の箇所です。

// SQLの実行
result = pstmt.executeUpdate();

ここまで完成したら、完成です。
サーバーを起動し、動作確認してみましょう。

「独学だと何から勉強したら良いかわからない」という方にはDig Skillがおすすめです!
Dig Skillでは月1000円でオリジナルのカリキュラムを使ってWebアプリの開発方法を学ぶことができます!30日間の無料体験もあるので、公式サイトをチェックしてみてください!

コメント

タイトルとURLをコピーしました