今回は、Struts2フレームワークを使ってO/Rマッパ経由で家電情報を削除するプログラムをご紹介したいと思います。
はじめに
前回までで、O/Rマッパを使った新規保存と編集を見てきました。
今回は、O/Rマッパを使った削除をお伝えしたいと思います。
前回までの表示(SELECT文)と新規保存(INSERT文)と編集(UPDATE文)、今回お伝えする削除(DELETE文)を合わせると、テーブルの4つの基本操作をO/Rマッパですべてご紹介できたことになります。
開発環境
開発環境は下記の通りです。
Struts2 | 2.5.14.1 |
Hibernate | 4.3.0.Final |
MySQL | 8.0.16 |
ビューの作成
javascript
削除ボタンをクリックした場合の処理を追加しました。
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>家電リスト</title>
<style>
table {
border-collapse: collapse;
}
td {
border: 1px solid gray;
padding: 3px 8px;
}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
<h2>家電リスト</h2>
<p>
<button id="btnNew">新規</button>
</p>
<table>
<tr>
<td>id</td>
<td>家電名</td>
<td>購入日時</td>
<td colspan="2">アクション</td>
</tr>
<s:iterator value="list">
<tr>
<td class="id"><s:property value="id"/></td>
<td><s:property value="householdAppliancesName"/></td>
<td><s:date name="purchaseDate" format="yyyy/MM/dd"/></td>
<td><button class="btnEdit">編集</button></td>
<td><button class="btnDelete">削除</button></td>
</tr>
</s:iterator>
</table>
<script>
$(function() {
//新規ボタン
$('#btnNew').on('click', function() {
//クエリ文字列で新規登録フラグを立てます
location.href = "${pageContext.request.contextPath}/dispModify?isNew=true";
});
//編集ボタン
$('.btnEdit').on('click', function() {
var id = $(this).parents("tr").find(".id").html();
//クエリ文字列でidを渡します
location.href = "${pageContext.request.contextPath}/dispModify?id=" + id;
});
//削除ボタン
$('.btnDelete').on('click', function() {
//削除する行のidを取得
var id = $(this).parents("tr").find(".id").html();
//フォームデータの取得
var fd = new FormData();
//フォームデータの追加
fd.append("id", id);
//urlの設定
var url = "${pageContext.request.contextPath}/delete";
//AJAX通信
$.ajax({
url: url,
type: 'POST',
data: fd,
processData: false,
contentType: false
})
//Ajaxリクエストが成功した時発動
.done( (data) => {
//一覧画面を再表示する
location.href = "${pageContext.request.contextPath}/display";
})
//Ajaxリクエストが失敗した時発動
.fail( (data) => {
})
//Ajaxリクエストが成功・失敗どちらでも発動
.always( (data) => {
});
});
});
</script>
</body>
</html>
モデルの作成
連携データの作成
編集時に既にidを追加していたため、今回は変更していません。
package com.pom2019.Struts2Web.model;
import java.util.List;
import com.pom2019.Struts2Web.entities.HouseholdAppliances;
public class IndexModel {
private List<HouseholdAppliances> list;
//新規登録フラグ
private String isNew;
//登録用
private String id;
private String householdAppliancesName;
private String purchaseDate;
//ゲッター、セッター
public List<HouseholdAppliances> getList() {
return list;
}
public void setList(List<HouseholdAppliances> list) {
this.list = list;
}
public String getIsNew() {
return isNew;
}
public void setIsNew(String isNew) {
this.isNew = isNew;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getHouseholdAppliancesName() {
return householdAppliancesName;
}
public void setHouseholdAppliancesName(String householdAppliancesName) {
this.householdAppliancesName = householdAppliancesName;
}
public String getPurchaseDate() {
return purchaseDate;
}
public void setPurchaseDate(String purchaseDate) {
this.purchaseDate = purchaseDate;
}
}
DAOの作成
今回使用するメソッドは、下記の通りになります。
findById
idから検索して削除する家電データ(オブジェクト)を取得します。
delete
引数に与えられた家電データ(オブジェクト)を実際に削除します。
package com.pom2019.Struts2Web.entities.dao;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import com.pom2019.Struts2Web.entities.HouseholdAppliances;
public class HouseholdAppliancesDao {
private SessionFactory sf;
public HouseholdAppliancesDao() {
super();
}
public HouseholdAppliancesDao(SessionFactory sf) {
super();
this.sf = sf;
}
@SuppressWarnings("unchecked")
public List<HouseholdAppliances> findAll() {
Session ss = sf.openSession();
return ss.createQuery("from HouseholdAppliances").list();
}
@SuppressWarnings("unchecked")
public List<HouseholdAppliances> findById(String id) {
Session ss = sf.openSession();
return ss.createQuery("from HouseholdAppliances "
+ "where id = " + id).list();
}
public boolean save(HouseholdAppliances h) {
Session ss = sf.openSession();
Transaction trans = null;
try {
trans = ss.beginTransaction();
ss.save(h);
trans.commit();
} catch (Exception e) {
trans.rollback();
return false;
} finally {
ss.close();
}
return true;
}
public boolean update(HouseholdAppliances h) {
Session ss = sf.openSession();
Transaction trans = null;
try {
trans = ss.beginTransaction();
ss.update(h);
trans.commit();
} catch (Exception e) {
trans.rollback();
return false;
} finally {
ss.close();
}
return true;
}
public boolean delete(HouseholdAppliances h) {
Session ss = sf.openSession();
Transaction trans = null;
try {
trans = ss.beginTransaction();
ss.delete(h);
trans.commit();
} catch (Exception e) {
trans.rollback();
return false;
} finally {
ss.close();
}
return true;
}
}
コントローラの作成
今回追加したアクションは、下記の通りになります。
delete
idから家電データ(オブジェクト)を取得して、削除処理を実行しています。
package com.pom2019.Struts2Web.actions;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.pom2019.Struts2Web.entities.HouseholdAppliances;
import com.pom2019.Struts2Web.entities.dao.HouseholdAppliancesDao;
import com.pom2019.Struts2Web.model.IndexModel;
import com.pom2019.listener.HibernateListener;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.servlet.ServletContext;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.util.ServletContextAware;
import org.hibernate.SessionFactory;
@Namespace("/")
@ParentPackage("struts-default") @Action(value = "delete", results = {
@Result(name = "success", location = "/WEB-INF/content/displayList.jsp")
})
public String delete() {
//パラメータの取得
String id = indexModel.getId();
//削除用インスタンスの取得
SessionFactory sf = (SessionFactory) context.getAttribute(HibernateListener.KEY_NAME);
HouseholdAppliancesDao hDao = new HouseholdAppliancesDao(sf);
HouseholdAppliances h = hDao.findById(id).get(0);
//削除処理
hDao.delete(h);
//エラー回避用に空変数をセット
indexModel.setList(new ArrayList<HouseholdAppliances>());
return ActionSupport.SUCCESS;
}
public class Index extends ActionSupport implements ServletContextAware, ModelDriven<IndexModel> {
private static final long serialVersionUID = -1884587001523422505L;
ServletContext context;
private IndexModel indexModel = new IndexModel();
@Action(value = "display", results = {
@Result(name = "success", location = "/WEB-INF/content/displayList.jsp")
})
public String execute() {
SessionFactory sf = (SessionFactory) context.getAttribute(HibernateListener.KEY_NAME);
HouseholdAppliancesDao hDao = new HouseholdAppliancesDao(sf);
List<HouseholdAppliances> hList = hDao.findAll();
indexModel.setList(hList);
return ActionSupport.SUCCESS;
}
@Action(value = "dispModify", results = {
@Result(name = "success", location = "/WEB-INF/content/displayModify.jsp")
})
public String dispModify() {
String id = indexModel.getId();
//idがパラメータとして存在した場合(編集の場合)
if (id != null && !"".equals(id)) {
SessionFactory sf = (SessionFactory) context.getAttribute(HibernateListener.KEY_NAME);
HouseholdAppliancesDao hDao = new HouseholdAppliancesDao(sf);
List<HouseholdAppliances> hList = hDao.findById(id);
if (hList.size() > 0) {
//編集する家電情報を取得する
HouseholdAppliances h = hList.get(0);
indexModel.setHouseholdAppliancesName(h.getHouseholdAppliancesName());
indexModel.setPurchaseDate(new SimpleDateFormat("yyyy/MM/dd").format(h.getPurchaseDate()));
}
}
return ActionSupport.SUCCESS;
}
@Action(value = "save", results = {
@Result(name = "success", location = "/WEB-INF/content/displayModify.jsp")
})
public String save() {
//パラメータの取得
String householdAppliancesName = indexModel.getHouseholdAppliancesName();
String purchaseDate = indexModel.getPurchaseDate();
//保存用インスタンスの生成
HouseholdAppliances h = new HouseholdAppliances();
//家電名の設定
h.setHouseholdAppliancesName(householdAppliancesName);
//購入日時の設定
Date d = new Date();
try {
d = new SimpleDateFormat("yyyy/MM/dd").parse(purchaseDate);
} catch(ParseException e) {}
h.setPurchaseDate(d);
//保存処理
SessionFactory sf = (SessionFactory) context.getAttribute(HibernateListener.KEY_NAME);
HouseholdAppliancesDao hDao = new HouseholdAppliancesDao(sf);
hDao.save(h);
return ActionSupport.SUCCESS;
}
@Action(value = "update", results = {
@Result(name = "success", location = "/WEB-INF/content/displayModify.jsp")
})
public String update() {
//パラメータの取得
String id = indexModel.getId();
String householdAppliancesName = indexModel.getHouseholdAppliancesName();
String purchaseDate = indexModel.getPurchaseDate();
//編集用インスタンスの取得
SessionFactory sf = (SessionFactory) context.getAttribute(HibernateListener.KEY_NAME);
HouseholdAppliancesDao hDao = new HouseholdAppliancesDao(sf);
HouseholdAppliances h = hDao.findById(id).get(0);
//家電名の設定
h.setHouseholdAppliancesName(householdAppliancesName);
//購入日時の設定
Date d = new Date();
try {
d = new SimpleDateFormat("yyyy/MM/dd").parse(purchaseDate);
} catch(ParseException e) {}
h.setPurchaseDate(d);
//更新処理
hDao.update(h);
return ActionSupport.SUCCESS;
}
@Action(value = "delete", results = {
@Result(name = "success", location = "/WEB-INF/content/displayList.jsp")
})
public String delete() {
//パラメータの取得
String id = indexModel.getId();
//削除用インスタンスの取得
SessionFactory sf = (SessionFactory) context.getAttribute(HibernateListener.KEY_NAME);
HouseholdAppliancesDao hDao = new HouseholdAppliancesDao(sf);
HouseholdAppliances h = hDao.findById(id).get(0);
//削除処理
hDao.delete(h);
//エラー回避用に空変数をセット
indexModel.setList(new ArrayList<HouseholdAppliances>());
return ActionSupport.SUCCESS;
}
public void setServletContext(ServletContext context) {
this.context = context;
}
@Override
public IndexModel getModel() {
return indexModel;
}
}
実行結果
idが6のデータを削除します。
idが6のデータが削除されました。
まとめ
4つの基本操作を知っていれば、ちょっとしたシステムを構築できるようになります。
ここをスタート地点として、複数プライマリキーのテーブルを扱ったり、テーブル数を増やしていけば、扱える処理も増えていくことになります。
最後までお読み頂きありがとうございました。