Spring Boot+JPAでデータベースに接続する方法

Spring Boot

Spring Boot+JPAでデータベースに接続する方法

JPAとは

JPAとはJava Persistence APIの略で、以下の2つの機能をJavaのAPI仕様として定義したものです。

  • リレーショナルデータベースで管理されているレコードを、Javaオブジェクトにマッピングする。
  • マッピングされたJavaオブジェクトに対して行われた操作を、リレーショナルデータベースのレコードに反映する。

スポンサーリンク

開発環境

開発環境

開発環境は以下の通り。

環境構築手順はこちら ⇒ EclipseでSpring Bootの環境構築 | 分かりやすく図解で説明

開発環境 名称 説明
開発言語 Java 人気の開発言語
開発ツール Eclipse Javaでの定番開発ツール
フレームワーク Spring Boot 人気のSpringフレームワークをベースとしたフレームワーク
テンプレートエンジン Thymeleaf Spring Bootと相性が良いテンプレートエンジン
データベース MySQL フリーで利用できる人気データベース

ディレクトリ構成

ディレクトリ構成は以下の通り。

springSample
src.main.java
com.example.demo
controller
UserController.java
entity
User.java
repository
UserRepository.java
service
UserService.java
src.main.resources
templates
user
list.html
static
css
list.css

事前準備

データベース接続設定

プロジェクトにある「application.properties」を開き、MySQLの接続情報を設定します。

spring.datasource.url=jdbc:mysql://localhost/sampledb?characterEncoding=UTF-8&serverTimezone=JST
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

build.gradleの依存関係

プロジェクトにある「build.gradle」を開き、使用する機能と依存関係の設定を行います。

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok:1.16.4'
	runtimeOnly 'org.springframework.boot:spring-boot-devtools'
	runtimeOnly 'mysql:mysql-connector-java'
	providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

データベースにテーブルとデータの登録

今回は以下のテーブルを作成します。

■ユーザー情報TEL

物理名 論理名 データ型 NOT NULL 説明
id ID BIGINT(20) 主キー(AUTO_INCREMENT)
name 名前 VARCHAR(100) ユーザーの名前
address 住所 VARCHAR(255) ユーザーの住所
phone 電話番号 VARCHAR(50) ユーザーの電話番号
update_date 更新日時 DATETIME 最終更新日時
create_date 更新日時 DATETIME 登録日時
delete_date 更新日時 DATETIME 論理削除した日時

 

以下のCreate文でテーブルを作成します。

CREATE TABLE `sampledb`.`user` (
  `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(100) NOT NULL,
  `address` VARCHAR(255) NULL,
  `phone` VARCHAR(50) NULL,
  `update_date` DATETIME NOT NULL,
  `create_date` DATETIME NOT NULL,
  `delete_date` DATETIME NULL,
  PRIMARY KEY (`id`));

 

以下のInsert文でテーブルにデータを登録します。

INSERT INTO `sampledb`.`user` (`id`, `name`, `address`, `phone`, `update_date`, `create_date`) VALUES ('1', 'テスト太郎', '東京都サンプル区1-1', '080-0000-0000', '2019-05-06 12:00:00', '2019-05-01 12:00:00');

バックエンド(サーバ)のソースコード

スポンサーリンク

Entityクラスの作成

データベースから取得したデータを格納するEntityクラスを作成します。

package com.example.demo.entity;

import java.io.Serializable;
import java.util.Date;
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;

/**
 * ユーザー情報 Entity
 */
@Entity
@Data
@Table(name="user")
public class User implements Serializable {

   /**
    * ID
    */
    @Id
    @Column(name="id")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
	private Long id;

	/**
	 * 名前
	 */
	@Column(name="name")
	private String name;

	/**
	 * 住所
	 */
	@Column(name="address")
	private String address;

	/**
	 * 電話番号
	 */
	@Column(name="phone")
	private String phone;

	/**
	 * 更新日時
	 */
	@Column(name="update_date")
	private Date updateDate;

	/**
	 * 登録日時
	 */
	@Column(name="create_date")
	private Date createDate;

	/**
	 * 削除日時
	 */
	@Column(name="delete_date")
	private Date deleteDate;
}

Repositoryクラスの作成

データベースへアクセスするためのRepositoryクラスを作成します。

package com.example.demo.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.example.demo.entity.User;

/**
 * ユーザー情報 Repository
 */
@Repository
public interface UserRepository extends JpaRepository<User, Long> {}

Controllerクラスの作成

フロントエンドとサーバーエンドの入出力の管理を行うControllerクラスを作成します。

package com.example.demo.controller;

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.example.demo.entity.User;
import com.example.demo.service.UserService;

/**
 * ユーザー情報 Controller
 */
@Controller
public class UserController {

    /**
     * ユーザー情報 Service
     */
    @Autowired
    UserService userService;

    /**
     * ユーザー情報一覧画面を表示
     * @param model Model
     * @return ユーザー情報一覧画面のHTML
     */
    @RequestMapping(value = "/user/list", method = RequestMethod.GET)
    public String displayList(Model model) {
        List<User> userlist = userService.searchAll();
        model.addAttribute("userlist", userlist);
        return "user/list";
    }
}

Serviceクラスの作成

具体的な処理(ビジネスロジック)を記述するServiceクラスを作成します。

package com.example.demo.service;

import java.util.List;
import javax.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.example.demo.entity.User;
import com.example.demo.repository.UserRepository;

/**
 * ユーザー情報 Service
 */
@Service
@Transactional(rollbackOn = Exception.class)
public class UserService {

    /**
     * ユーザー情報 Repository
     */
    @Autowired
    UserRepository userRepository;

    public List<User> searchAll() {
        // ユーザーTBLの内容を全検索
        return userRepository.findAll();
    }
}

フロントエンド(画面)のソースコード

HTMLの作成

ユーザーの一覧画面をHTMLで作成します。テンプレートエンジンは「Thymeleaf」を使用しています。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
  <head>
    <title>Hello</title>
    <link href="/css/list.css" rel="stylesheet"></link>
    <meta charset="utf-8" />
  </head>
  <body>
    <h1>ユーザー情報一覧</h1>
    <table>
        <thead>
            <tr>
                <th>ID</th>
                <th>名前</th>
                <th>住所</th>
                <th>電話番号</th>
                <th>更新日時</th>
                <th>登録日時</th>
                <th>削除日時</th>
            </tr>
        </thead>
        <tbody>
            <tr th:each="user : ${userlist}" th:object="${user}">
                <td class="center" th:text="*{id}"></td>
                <td th:text="*{name}"></td>
                <td th:text="*{address}"></td>
                <td class="center" th:text="*{phone}"></td>
                <td class="center" th:text="${#dates.format(user.updateDate, 'yyyy/MM/dd')}"></td>
                <td class="center" th:text="${#dates.format(user.createDate, 'yyyy/MM/dd')}"></td>
                <td class="center" th:text="${#dates.format(user.deleteDate, 'yyyy/MM/dd')}"></td>
            </tr>
        </tbody>
    </table>
  </body>
</html>

CSSの作成

HTMLで読み込むスタイルシート(CSS)を作成します。

table{
    width: 90%;
    border-collapse: collapse;
    font-size: 12px;
}

table th, table td {
    border: 1px solid #ddd;
    padding: 6px;
}

table th {
    background-color: #F2F2F2;
}

.center {
    text-align: center;
}

スポンサーリンク

Webアプリケーションの実行

Spring Bootプロジェクトを実行して http://localhost:8080/user/list へアクセスします。

以下の画面が表示されれば、完了です。

JPAで一覧画面

終わりに

本記事では「Spring Boot+JPAでデータベースに接続する方法」を行う手順について紹介しました。

次回は、JPAではなくMyBatisを利用したアプリケーションの作り方を紹介します。

よろしければ記事の評価をお願いします

© 2020 ITを分かりやすく解説