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"> <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> http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd
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}" />
<c:out value="${obj.firstname}" />
<c:out value="${obj.lastname}" />
<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入門」参照ください。

KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES20xx),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^


コメント