SpringBootとGradleのススメ ~DB連携編(JPA)

springjava
スポンサーリンク
スポンサーリンク

SpringBoot+GradleアプリでDB連携する

前回はHelloWorldアプリの作成を行いました。SpringBootとGradleのススメ ~HelloWorld編今回はJSPを用いてDB連携してみたいと思います。

はじめに

JPAとは、JPA ( Java Persistence API )、Java標準のORMです。

環境設定

前回の記事SpringBootとGradleのススメ ~HelloWorld編を参考にEclipse等の環境は整えてください。また、今回はDB接続を行うので、ローカルにDBの作成しておいてください。

 

例)Mac、mysqlを使用してローカルDBの作成

DB作成

mysql> create database testdb;

DB選択

mysql> use testdb;

テーブル作成

mysql> create table idol(id int primary key auto_increment, name varchar(20), age int);

データの挿入

mysql> insert into idol (name, age) values ('miku', 15), ('yayoi', 14);

idol(アイドル)DBを作成し、みく、やよいのデータを入れました。

プロジェクト作成

ファイル>新規>その他>Spring>Springスタータープロジェクト依存関係は以下のものを付与

コア>DevTools

SQL>JPAとMySQL

テンプレート・エンジン>Thymeleaf

Web>Web

thymeleaf

GradleProject

適当に名前をつけてプロジェクトの作成。適当にdbtestと名前つけました。

DB接続をする為の設定を、src/main/resources/application.propertiesに記述します。

# DB接続情報
spring.datasource.url=jdbc:mysql://localhost/testdb
spring.datasource.username=username
spring.datasource.password=password
spring.datasource.driverClassName=com.mysql.jdbc.Driver

usernameとpasswordは各自設定したものを入力してください。

処理の実装

今回はDBからデータを取得して画面に表示したいと思います。

モデルとなるJavaクラス(Entity)の作成

JPAを利用する場合、DBのデータとなる部分はEntityと呼ばれるクラスとして定義されます。Entityがどのようなものかというと、DBのレコードをJavaオブジェクトとして保管したものです。今回作成したDBのデータをもとに以下のように作成します。

dbtest/src/main/java/dbtest/entity/Idol.java

package dbtest;

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

@Entity
@Table(name = "idol")
public class Idol {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String name;
    @Column(name="age")
    private Integer age;

    // getter and setter
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
}

アノテーションについて

必須項目

@Entity – エンティティクラスであることを示す

@id – プライマリーキーになるものを指定する

@GeneratedValue – プライマリーキーのフィールドに用意されていてAUTOに指定する事で値を自動生成する

 

任意項目

@Table – クラスに割り当てられるテーブルを指定する。省略した場合はクラス名がテーブル名として扱われる

@Column – フィールドに割り当てられるカラム名を指定する。省略した場合はフィールド名がカラム名として扱われる(nameの他にもlengthやnullableの指定も可能)

DBアクセスのインターフェースとなるJavaクラス(Repository)の作成

EntityはDBのテーブルデータをJava内でオブジェクトとして扱えるようにするクラスなので、単体ではDBアクセスはできません。その為、アクセス手段を提供するインターフェースとしてRepositoryと呼ばれるクラスを作成する必要があります。

dbtest/src/main/java/dbtest/repository/IdolRepository.java

package dbtest.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import dbtest.entity.Idol;

@Repository
public interface IdolRepository extends JpaRepository<Idol, Integer> {
}

JPARepositoryを継承しているのがキモです。

Controllerの作成

リポジトリを利用する為のContorollerを作成します。

dbtest/src/main/java/dbtest/controller/MainController.java

package dbtest.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import dbtest.entity.Idol;
import dbtest.repository.IdolRepository;

@Controller
public class MainController {
    @Autowired
    IdolRepository repository;
    @RequestMapping("/")
    private ModelAndView index(ModelAndView mav) {
        mav.setViewName("index");
        Iterable<Idol> list = repository.findAll();
        mav.addObject("data", list);
        return mav;
    }
}

@Autowired を使用してIdolRepositoryインスタンスをフィールドに関連づけています。

※インターフェースなのにインスタンスが設定できます。Springがよしなに処理を組み込んで無名クラスのインスタンスが設定されるようです、気になる人は調べてください。

テンプレートの作成

dbtest/src/main/resources/templates/index.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"></meta>
<title>INDEXページ</title>
</head>
<body>
<table>
<thead>
<tr>
<th>ID</th>
<th>名前</th>
<th>年齢</th>
</tr>
</thead>
<tbody>
<tr th:each="data:${data}">
<td th:text="${data.id}"></td>
<td th:text="${data.name}"></td>
<td th:text="${data.age}"></td>
</tr>
</tbody>
</table>
</body>
</html>

テンプレートエンジンとしてthymeleafを使用してます。

アプリケーションの起動

さて、一通り実装が終わりましたのでアプリケーションを起動します。プロジェクトを右クリック>実行>SpringBootアプリケーションを選択。アプリケーションがローカルホストで立ち上がります。

http://localhost:8080/ にアクセス

テスト画面

データの取得に成功しました。

参考サイト

Spring Bootでデータベースに接続する – Qiita

JPAでデータベースを使おう!(1/5):Spring BootではじめるMVC …

SpringBootをEclipse、Gradleで使ってみる - (6)JPAでDB(MySQL)に

コメント