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(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント