CRUDの実装
エンティティの削除
エンティティを削除するには、remove を使用するが、その前に merge する必要がある。(テキストp.297)
MyDataDaoImpl.java
public void delete(MyData data) { EntityManager manager = factory.createEntityManager(); EntityTransaction tx = manager.getTransaction(); tx.begin(); MyData entity = manager.merge(data); manager.remove(entity); tx.commit(); manager.close(); } public void delete(long id) { delete(findById(id)); }
データベースマネージャからSQLをダイレクトに実行する方法
別のアプリDatabaseManagerを使用することで、SQLを実行できる。
- 以下のファイルをローカルにコピーする。
\\KGAKUSEI1\share\澤田\hsqldb-2.3.2.zip - C:\Users\se3\db の下に解凍する。
- コマンドプロンプトを起動。
- 以下のコマンドを実行する。
> cd C:\Users\se3\db\hsqldb-2.3.2\hsqldb > java -cp lib/hsqldb.jar org.hsqldb.util.DatabaseManager
JSPに編集と削除のリンクを追加する
mydata.jsp のテーブル部分に、編集と削除のリンクをanchorタグで追加する。
mydata.jsp
<c:if test="${datalist != null}"> <table border="1"> <tr><th>ID</th><th>名前</th></tr> <c:forEach var="obj" items="${datalist}" varStatus="status"> <tr> <td>${obj.id}</td> <td>${obj.name}</td> <td><a href="/MyData/update?id=${obj.id}">編集</a></td> <td><a href="/MyData/delete?id=${obj.id}">削除</a></td> </tr> </c:forEach> </table> </c:if>
JPQLを活用する
MyDataアプリケーションで検索機能を追加する。
find.jspの作成
find.jsp
<!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 http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>${title}</title> </head> <body> <h1>${title}</h1> <p>${message}</p> <table> <form action="/MyData/find" method="post"> <tr> <td>FIND:</td> <td><input type="text" name="fstr" size="20" /></td> </tr> <tr> <td></td><td><input type="submit" /></td> </tr> </form> </table> <hr /> <c:if test="${datalist != null}"> <table border="1"> <tr><th>ID</th><th>名前</th></tr> <c:forEach var="obj" items="${datalist}" varStatus="status"> <tr> <td>${obj.id}</td> <td>${obj.name}</td> </tr> </c:forEach> </table> </c:if> </body> </html>
コントローラの追加
MyDataControllerに検索用メソッドを追加する。
MyDataController.java
@RequestMapping(value = "/find", method = RequestMethod.GET) public String find(Model model) { model.addAttribute("title", "MyData"); model.addAttribute("message", "検索のサンプルです"); MyDataDao<MyData> dao = new MyDataDaoImpl(); List<MyData> list = dao.getAll(); model.addAttribute("datalist", list); return "find"; } @RequestMapping(value = "/find", method = RequestMethod.POST) public String search(@RequestParam(value = "fstr")String s, Model model) { model.addAttribute("title", "MyData"); model.addAttribute("message", "「" + s + "」の検索結果"); MyDataDao<MyData> dao = new MyDataDaoImpl(); List<MyData> list = dao.find(s); model.addAttribute("datalist", list); return "find"; }
DAOにfindメソッドを追加する
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 List<T> find(String s); public void add(T data); public void update(T data); public void delete(T data); public void delete(long id); }
MyDataDaoImpl.java
public List<MyData> find(String s) { EntityManager manager = factory.createEntityManager(); List<MyData> list = null; String qs = "from MyData where id = :fstr"; Query query = manager.createQuery(qs).setParameter("fstr", Long.parseLong(s)); list = query.getResultList(); manager.close(); return list; }