あずきみるくのあずきはニガテ - for Engineer

ひよっこプログラマがやってみたことやハマっちゃったことなど、備忘録的な感じで書いていきます。

SpringBootをEclipse、Gradleで使ってみる - (6)JPAでDB(MySQL)につなごう!

とうとうきました。DBです。

でーたべーすです。


SpringBootにはJPAという便利なものがあるようです。

早速、「JPA」でググりました。
NPO法人 日本パラグライダー協会ホームページ」がTOPHITしました。
・・・間違いなく、違いますw

JPA(Java Persistence API)とは永続化に関する仕様であり、Spring Data JPAはこれをサポートしたO/Rマッピングフレームワークです。
Spring Data JPAを使用すると、Queryメソッドと呼ばれるメソッドをRepositoryインタフェースに定義するだけで、指定した条件に一致するEntityを取得することが出来るため、Entityの操作を行うための実装を減らすことができます。

出典:
Spring Data JPAを使用したプログラミング方法 — intra-mart Accel Platform /

だそうです。
最近、引用させてもらってばっかでごめんなさい。
平たく言うと、SpringでDB使うためのORまっぱー、ってこと?
(平たくない?!)


と、いうわけで、いつも通り。
早速始めてみましょう。

今回の達成目標はDBをつなげて、コンソール(標準出力)に表示するまで

作成したプロジェクトの階層は下記の通りになります。

f:id:azuki-milk-lush:20150202162739j:plain

※今回、「Apprication.java」は編集しません。
 内容はこちらをご参照ください。
 SpringBootをeclipse、Gradleで使ってみる ー(1)準備 - あずきみるくのあずきはニガテ - for Engineer
 また、今回は画面には出力しないので、
 「src/main/resources/templates」内は対象外とします。

1)build.gradleの編集

とりあえず、これがないと始まりません。

今回、DBはMySQL(ver.5.6.22)を使うことにしました。
下記の「MySQL」という記述のある部分が追加したところです。

apply plugin: 'java'
// eclipse for web
apply plugin: 'eclipse-wtp'

ext {
  // spring boot plugin
  springBootVersion = "1.2.1.RELEASE"

  // MySQL connecterVersion
  mySQLVersion = '5.1.34'
  
  //Tthymeleaf
  thymeleafVersion = "2.1.4.RELEASE"
}

ext.defaultEncoding = 'UTF-8'
ext.artifactId = 'SpringBoot'
version = '1.0'

// Java Use Version
sourceCompatibility = targetCompatibility = 1.8
tasks.withType(AbstractCompile) each {
  it.options.encoding = ext.defaultEncoding
}

repositories {
  mavenCentral()
}

dependencies {

  //spring-boot
  compile "org.springframework.boot:spring-boot-gradle-plugin:$springBootVersion"
  compile "org.springframework.boot:spring-boot-starter-web:$springBootVersion"
  compile "org.springframework.boot:spring-boot-starter-test:$springBootVersion"
  compile "org.springframework.boot:spring-boot-starter-thymeleaf:$springBootVersion"
  compile "org.springframework.boot:spring-boot-starter-data-jpa:$springBootVersion"

  // MySQL
  compile "mysql:mysql-connector-java:$mySQLVersion"
}

これで、リフレッシュすることで、必要なライブラリを取得することができます。

2)DBの準備

では、今回、取得してくるDBの中身を作っておきましょう。
テスト用なので、すっごく簡単ですw
任意のデータベース?スキーマ?で、以下の内容でテーブル作っちゃってください。

※もちろん、既存のテーブルを使用することもできます。
 その場合は適当に読み替えて作ってみてください。

 create table emp(empID Integer(5), empName varchar(30));

 insert into emp(empID, empName) values (1, "東京太郎");
 insert into emp(empID, empName) values (2, "大阪花子");

こんな感じで出来上がりました。
f:id:azuki-milk-lush:20150202152423j:plain

3)application.propertiesの作成

ここに、接続先の情報を記述します。
階層は「(プロジェクト)/src/main/resources/application.properties」です。

spring.datasource.url=jdbc:mysql://localhost/(データベース名)
spring.datasource.username=(ユーザ名)
spring.datasource.password=(パスワード)
spring.datasource.driverClassName=com.mysql.jdbc.Driver

4)Entityの作成

テーブルの情報をクラスにした感じです。
このEntityインスタンス1個が、テーブルのレコード1件に相当すると思ってもらえば早いかと。

今回、「emp」という名前のテーブルを作成したので、「Emp.java」というクラスを作成します。

「(プロジェクト名)/src/main/java/sample/hello/entity/Emp.java

package sample.hello.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;


@Entity // このクラスはEntityとして登録しますよ、とspringに教えてます
public class Emp {

	@Id // プライマリーキーのものに設定してください
	@GeneratedValue // 主に数字に対して、順番に一意に設定しますよ、の意味
	protected Integer empID;

	@Column // ただの変数じゃなくて、DBのカラムだよ、の意味
	protected String empname;

	// setter & getter ---------------------
	public Integer getEmpID() {
		return empID;
	}

	public void setEmpID(Integer empID) {
		this.empID = empID;
	}

	public void setEmpName(String empName) {
		this.empname = empName;
	}

    public String getEmpName(){
    	return empname;
    }

    // constructor --------------------------
	public Emp(){
		super();
	}

    public Emp(Integer id, String name){
        super();
        this.empID =id;
        this.empname = name;
    }
    
}
ちょこっとメモ

知ってるかもですが、getter&setterは簡単に自動生成できます。
まず、変数(ex.protected Integer empID;)を宣言したら
「右クリック>ソース>getterおよびsetterの生成」を選択し、
手順に従ってぽちぽちしたら簡単に自動生成されます。

ちなみに、setterがないと、DBから値を取得した際に設定できないみたいなので、忘れないように書いておいてくださいね。

ちょこっとメモ その2

「@Column」アノテーションですが、これを設定していないと、DBから値を取得したときに、「設定するカラムがない!」と怒られます。
つまり、DBにこのカラムが存在しているのに、その値を設定するフィールドがない、ということなんですね。
(ちょっとわかりにくい?)

5)Repositoryインターフェースの作成

DBとEntityをつなぐ役割のようです。
「emp」というDBと「Emp.java」をつなぐリポジトリなので、「EmpRepository.java」という名前にします。

「(プロジェクト名)/src/main/java/sample/hello/repository/EmpRepository.java

package sample.hello.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import sample.hello.entity.Emp;

@Repository
public interface EmpRepository extends JpaRepository<Emp, Integer>{
}

「JpaRepository」を継承してるのがミソです。
この子がうまいこと、紐づけを行ってくれるのですね。きっと。
<>の中身は、「<紐づけるEntity, プライマリーキーの型>」になります。

6)Controllerの修正

続きでやってるので、もともとあるものに対して修正します。

package sample.hello;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import sample.hello.entity.Emp;
import sample.hello.repository.EmpRepository;


@Controller //コントローラーだよ、っていう定義
@EnableAutoConfiguration /
public class SampleController {

  @Autowired //リポジトリを紐づけます
  EmpRepository repository;

  @RequestMapping("/")
  @ResponseBody
  public String home(){

    // 全件取得します
	Iterable<Emp> list = repository.findAll();

	// 取得した内容を出力します
	for(Emp emp: list){
	  System.out.println(emp.getEmpID() + ":" + emp.getEmpName());
		}
		return "Hello!"; //ここは気にしないでください。
                 //ないと怒られますので~。
	}
  }
}

・・・めんどくさければ上書きしていただいてもOKですw

ポイントは「@Autowired」の紐づけです。
これで、「Emp.java」に取得結果を紐づけたりするようです。
(あってるかな?)

7)実行

webから実行する体にしてますので。。。
http://localhost:8080/
でいっちゃってください。

標準出力には。。。

1:東京太郎
2:大阪花子
1:東京太郎
2:大阪花子

とでます。

・・・なんで2回?!

謎はまだ解明されてませんが、とりあえず、出たね、ってことでw

また次回。
次はもうそろそろ、ログイン的なものを作らねば。。。

<参考>
今回もいろいろお世話になりました・・・

JPAでデータベースを使おう!(1/5):Spring BootではじめるSpring MVCアプリケーション高速開発入門
Spring Boot その3