6月30日

JPAによるデータベースの利用

6月26日のページに掲載されたコードを入力して動作確認する。

http://localhost:8080/SpringMyApp/mydataにアクセスして、入力フォームが表示されること。

入力フォームに入力して送信すると、画面の下に入力した名前が追加されること。

spring9

<!DOCTYPE html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<html>
<head>
	<meta charset="utf-8">
	<title>${title}</title>
</head>

<body>
	<h1>${title}</h1>
	<p>${message}</p>
	<table>
	<form:form modelAttribute="myData">
		<form:errors path="*" element="div" />
		<form:hidden path="id"/>
		<tr>
			<td><form:label path="name">名前</form:label></td>
			<td><form:input path="name" size="20" /></td>
		</tr>
		<tr>
			<td><form:label path="age">年齢</form:label></td>
			<td><form:input path="age" size="20" /></td>
		</tr>
		<tr>
			<td><form:label path="mail">メール</form:label></td>
			<td><form:input path="mail" size="20" /></td>
		</tr>
		<tr>
			<td><form:label path="memo">メモ</form:label></td>
			<td><form:input path="memo" cols="20" rows="5" /></td>
		</tr>
		<tr>
			<td></td>
			<td><input type="submit"></td>
		</tr>
	</form:form>
	</table>

	<hr>
	<c:if test="${datalist != null}">
	<table>
		<tr><th>ID</th><th>名前</th></tr>
		<c:forEach var="obj" items="${datalist}" varStatus="status">
			<tr>
				<td><c:out value="${obj.id}" />
				<td><c:out value="${obj.name}" />
			</tr>
		</c:forEach>
	</table>
	</c:if>
</body>
</html>

エンティティの基本操作

インタフェースにメソッドを追加する。

MyDataDao.java

package jp.abc;

import java.io.Serializable;
import java.util.List;

public interface MyDataDao <T> extends Serializable {
	public List<T> getAll();
	public T findById(long id);
	public T findByName(String name);
	public void add(T data);
	public void update(T data);
	public void delete(T data);
	public void delete(long id);
}

実装クラスにメソッドだけを追加してコンパイルエラーをなくす。

package jp.abc;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.Query;

public class MyDataDaoImpl implements MyDataDao<MyData> {
	private static EntityManagerFactory factory =
		Persistence.createEntityManagerFactory("persistenceUnit");

	public List<MyData> getAll() {
		EntityManager manager = factory.createEntityManager();
		Query query = manager.createQuery("from MyData");
		List<MyData> list = query.getResultList();
		manager.close();
		return list;
	}

	public MyData findById(long id) {
		return null;
	}

	public MyData findByName(String name) {
		return null;
	}

	public void add(MyData mydata) {
		EntityManager manager = factory.createEntityManager();
		EntityTransaction transaction = manager.getTransaction();
		transaction.begin();
		manager.persist(mydata);
		transaction.commit();
		manager.close();
	}

	public void update(MyData mydata) {
		//
	}

	public void delete(long id) {
		//
	}

	public void delete(MyData mydata) {
		//
	}
}

DAOの実装を追加する。
ただし、データベースアクセスのコードは省略しておく。
まずはURLにアクセスしたときに動作するようにする。

MyDataDaoImple.java

package jp.abc;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.Query;

public class MyDataDaoImpl implements MyDataDao<MyData> {
	private static EntityManagerFactory factory =
		Persistence.createEntityManagerFactory("persistenceUnit");

	public List<MyData> getAll() {
		EntityManager manager = factory.createEntityManager();
		Query query = manager.createQuery("from MyData");
		List<MyData> list = query.getResultList();
		manager.close();
		return list;
	}

	public MyData findById(long id) {
		return null;
	}

	public MyData findByName(String name) {
		return null;
	}

	public void add(MyData mydata) {
		EntityManager manager = factory.createEntityManager();
		EntityTransaction transaction = manager.getTransaction();
		transaction.begin();
		manager.persist(mydata);
		transaction.commit();
		manager.close();
	}

	public void update(MyData mydata) {
		//
	}

	public void delete(long id) {
		//
	}

	public void delete(MyData mydata) {
		//
	}
}

コントローラに実装を追加する。
テキストでは

    return "redirect:/helo";

としているが、ここでは

    return "redirect:/mydata";

とする。

MyDataController.java

package jp.abc;

import java.util.List;

import javax.validation.Valid;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class MyDataController {

	@RequestMapping(value = "/mydata", method = RequestMethod.GET)
	public String mydata(Model model) {
		model.addAttribute("title", "Sample");
		model.addAttribute("message", "MyDataのサンプルです");
		MyData mydata = new MyData();
		model.addAttribute("myData", mydata);
		MyDataDao<MyData> dao = new MyDataDaoImpl();
		List<MyData> list = dao.getAll();
		model.addAttribute("datalist", list);
		return "mydata";
	}

	@RequestMapping(value = "/mydata", method = RequestMethod.POST)
	public String form(@Valid @ModelAttribute MyData mydata,
			Errors result, Model model) {
		if (result.hasErrors()) {
			model.addAttribute("title", "Sample [ERROR]");
			model.addAttribute("message", "値を再チェックしてください!");
			return "mydata";
		}
		MyDataDao<MyData> dao = new MyDataDaoImpl();
		dao.add(mydata);
		return "redirect:/mydata";
	}

	@RequestMapping(value = "/update", method = RequestMethod.GET)
	public String edit(@RequestParam(value = "id")int id, Model model) {
		model.addAttribute("title", "Sample");
		model.addAttribute("message", "更新のページ");
		MyDataDao<MyData> dao = new MyDataDaoImpl();
		MyData mydata = dao.findById(id);
		model.addAttribute("myData", mydata);
		model.addAttribute("datalist", dao.getAll());
		return "mydata";
	}

	@RequestMapping(value = "/update", method = RequestMethod.POST)
	public String update(@RequestParam(value = "id")int id,
			@Valid @ModelAttribute MyData mydata,
			Errors result, Model model) {
		model.addAttribute("title", "Sample");
		model.addAttribute("message", "更新のページ");
		MyDataDao<MyData> dao = new MyDataDaoImpl();
		dao.update(mydata);
		return "redirect:/update?id=" + mydata.getId();
	}

	@RequestMapping(value = "/delete", method = RequestMethod.GET)
	public String delete(@RequestParam(value = "id")int id, Model model) {
		MyDataDao<MyData> dao = new MyDataDaoImpl();
		dao.delete(id);
		return "redirect:/mydata";
	}

}

MyDataDaoImple.java に findMyId() の実装を追加すると、
http://localhost:8080/SpringMyApp/update?id=1
にアクセスしたときに、id=1のデータがフォームに表示される。

	public MyData findById(long id) {
		EntityManager manager = factory.createEntityManager();
		String sql = "from MyData where id = " + id;
		MyData mydata = (MyData)manager.createQuery(sql).getSingleResult();
		return mydata;
	}

update() メソッドの実装を追加すると、データの更新ができるようになる。

	public void update(MyData mydata) {
		EntityManager manager = factory.createEntityManager();
		EntityTransaction transaction = manager.getTransaction();
		transaction.begin();
		manager.merge(mydata);
		transaction.commit();
		manager.close();
	}

MyDataDaoImple.javaに削除を実装する。

	public void delete(MyData mydata) {
		EntityManager manager = factory.createEntityManager();
		EntityTransaction transaction = manager.getTransaction();
		transaction.begin();
		manager.remove(mydata);
		transaction.commit();
		manager.close();
	}

	public void delete(long id) {
		delete(findById(id));
	}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です