SpringでMySQLに接続する(JPA)

SpringでMySQLに接続してみます。

pom.xmlに以下を追加します。

<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>

pom.xmlのpropertiesタグ内に以下を追加します。

<hibernate.version>4.2.1.Final</hibernate.version>

persistence.xmlを作成します。JPAによる永続化のために必要な情報を記述しているファイルです。

「src/main/resources/META-INF」配下に作成します。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="2.0"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="persistenceUnit"
transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<property name="hibernate.hbm2ddl.auto" value="create"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/DB名" />
<property name="hibernate.connection.username" value="ユーザID"/>
<property name="hibernate.connection.password" value="パスワード"/>
</properties>

</persistence-unit>
</persistence>

persistence-unitタグのname属性で指定した名前はプログラムで使用します。

persistence.xmlが作成できたらエンティティクラスを作成します。

package jp.co.confrage.jpa;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.Data;

@Data
@Entity
@Table(name="tbl_customer")
public class MyData implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column
private int id;

@Column(length=40,nullable=false)
private String firstname;

@Column(length=40,nullable=false)
private String lastname;

@Column
private int age;
}

@Entityアノテーションでエンティティクラスであることを定義しています。

lombokを使用して@Dataアノテーションでセッター、ゲッターを省略しています。

@Tableアノテーションのname属性でテーブル名を指定します。

あとは省略します。次にData Access Object(DAO)を作成します。DAOでデータアクセスします。

インタフェースを作成します。

package jp.co.confrage.jpa;

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

public interface MyDataDao<T> extends Serializable {
public List<T> getAll();
public void add(MyData mydata);
}

次にインタフェースをインプリメントしたDAOクラスを作成します。(インタフェースは必ずしも必要ではありません)

package jp.co.confrage.jpa;

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 final long serialVersionUID = 1L;
private static EntityManagerFactory factory = Persistence.createEntityManagerFactory("persistenceUnit");

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

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

getAllメソッドでは全件セレクトし、Listを返しています。

addではmydataをインサートしています。persistメソッドでエンティティを保存するのでインサートが実行され、commitで確定されます。

次にコントローラ(リクエストハンドラ)を作成します。

package jp.co.confrage.jpa;

import java.util.List;

import javax.validation.Valid;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;

@Controller
@RequestMapping("db")
public class JpaController {

private static final Logger logger = LoggerFactory.getLogger(JpaController.class);

@RequestMapping(value = "hello", method = RequestMethod.GET)
public String hello1(Model model) {
logger.info("Welcome Sample Page.");

MyData mydata = new MyData();
model.addAttribute("myData",mydata);

MyDataDao<MyData> dao = new MyDataDaoImpl();
List<MyData> list = dao.getAll();
model.addAttribute("datalist", list);
return "dbHello";
}

@RequestMapping(value = "hello", method = RequestMethod.POST)
public String hello2(@Valid @ModelAttribute MyData mydata,Errors result,Model model) {
logger.info("Welcome Sample Page.");

if(result.hasErrors()){
return "dbHello";
}

MyDataDao<MyData> dao = new MyDataDaoImpl();
dao.add(mydata);
return "redirect:/db/hello";
}
}

初期表示時がhello1メソッドが実行され、送信ボタン押下時にhello2メソッドが実行されます。

最後にdbHello.jspです。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Home</title>
</head>
<body>
<h1>
Hello world!
</h1>

<table>
<form:form modelAttribute="myData">
<foorm:errors path="*" elevemnt="div" />
<tr>
<td><form:label path="firstname">性</form:label></td>
<td><form:input path="firstname" /></td>
</tr>
<tr>
<td><form:label path="lastname">名</form:label></td>
<td><form:input path="lastname" /></td>
</tr>
<tr>
<td><form:label path="age">年齢</form:label></td>
<td><form:input path="age" /></td>
</tr>
<tr>
<td cols="2"><input type="submit"></td>
</tr>
</form:form>
</table>

<hr>

<c:if test="${datalist != null }">
<c:forEach var="obj" items="${datalist}" varStatus="status">
<c:out value="${obj.id}" />&nbsp;
<c:out value="${obj.firstname}" />&nbsp;
<c:out value="${obj.lastname}" />&nbsp;
<c:out value="${obj.age}" /><br>
</c:forEach>
</c:if>
</body>
</html>

これでJPAを使用してデータベース(MySQL)にアクセスしています。

スポンサーリンク
  • このエントリーをはてなブックマークに追加
スポンサーリンク

コメントをどうぞ

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

CAPTCHA