SpringでMySQLに接続する(JPA)

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)にアクセスしています。

@Valueアノテーション

@Dataに対して@Valueアノテーションと言うのがあります。

@Valueは@Dataをイミュータブルにします。具体的には@Valueにすると全てのフィールドはprivate finalになります。その為、@Setterをクラスもしくはフィールドにつけるとエラーとなります。finalなのでセッターメソッドが作成できなくなります。

JPAについては「JPQL入門」参照ください。

コメント

株式会社CONFRAGE ITソリューション事業部をもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む

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