11. データベース

JavaとMySQL

JDBCとは

JDBC (Java Database Connectivity)は、Javaプログラムが異なる種類のデータベースにアクセスするためのAPIです。JDBCを使用することで、データベースにクエリを送信し、データの取得、更新、削除などの操作を行うことができます。

データベースに依存しない

JDBCは、データベース固有のコードとJavaコードを分離し、プラットフォーム非依存なデータベースアクセスを実現します。

mysql-connector-java

mysql-connector-javaMySQLデータベースにアクセスするためのJDBCドライバで、JavaプログラムとMySQLサーバーの通信を担当します。

インストール

SpringからMySQLに接続するために「mysql-connector-java」をインストールします。pom.xml に「mysql-connector-java」ライブラリの依存を追加します。

pom.xml
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.30</version>
</dependency>
  • MaveのDependencies からでも自動追加可能だが、バージョンに注意が必要です

JPA

ORMとは

ORM(Object-Relational Mapping)は、プログラムのオブジェクトとデータベースとの間でデータ変換(マッピング) するプログラムです。

ORMには以下のような特徴があります。

クラスオブジェクトでデータ操作

RDBではSQLでデータ操作するために、モデルクラスのメソッドなどでプログラミングします。

オブジェクトとRDBテーブルのマッピング

オブジェクトとRDBテーブルとの対応を定義し、オブジェクト指向プログラミングで扱いやすい形式でRDB操作できます。

クエリの抽象化

SQLなどのクエリを直接書かずに、プログラミングコードで処理します。データベース操作に必要なSQLの知識が少なくてもデータ操作でき、データベースの種類に依存しません。

リレーション管理

オブジェクト間のリレーションをDB内のテーブルと同期させることができます。これにより、面倒なDB操作がプログラムで処理できます。

Spring Data JPA

JPAとは

JPA(Java Persistence API)はJavaのORMツールの1つで、JavaオブジェクトとRDBのデータマッピングします。JPAを使用すると、DBデータアクセスやクエリの自動生成、ページング処理などが簡単に実装できます。

Spring Data JPAとは

SpringでJPAを利用するには、Spring Data JPAライブラリのインストールが必要です。Spring Data JPAで、CRUD(Create, Read, Update, Delete)操作を簡単に実装でき、データ永続化ができます。

ライブラリ依存追加

spring-boot-starter-data-jpa ライブラリの依存を追加します。※MaveのDependenciesからでも自動追加可能

pom.xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
  • MaveのDependenciesからでも自動追加可能だが、バージョンに注意

データベース作成

MySQLデータベース「mynews」を作成します。

データベース名 ポート ユーザ名 パスワード
mynews 3306 root
  • ユーザ名、パスワードは任意

テーブル定義

「schema.sql」作成

「src/main/resouces/」に「schema.sql」を作成します。

DDL(テーブル定義)

「schema.sql」にDDLを記述します。

schema.sql
CREATE TABLE IF NOT EXISTS users (
    id bigint PRIMARY KEY AUTO_INCREMENT,
    name varchar(255) NOT NULL,
    email varchar(255) UNIQUE NOT NULL,
    email_verified_at datetime NULL DEFAULT NULL,
    password varchar(255) NOT NULL,
    remember_token varchar(100) DEFAULT NULL,
    created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at datetime NULL DEFAULT NULL
);

CREATE TABLE IF NOT EXISTS articles (
    id bigint PRIMARY KEY AUTO_INCREMENT,
    title varchar(255) NOT NULL,
    body TEXT NOT NULL,
    image_path varchar(255) DEFAULT NULL,
    posted_at datetime NOT NULL,
    created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at datetime NULL DEFAULT NULL
);
users
項目 カラム データ型 NOT NULL その他
ID id bigint NOT NULL Primary Key
作成日 created_at datetime NOT NULL CURRENT_TIMESTAMP
更新日 updated_at datetime NULL
氏名 name varchar(255) NOT NULL
Email email varchar(255) NOT NULL
Email認証日 email_verified_at datetime NULL
パスワード password varchar(255) NOT NULL
トークン remember_token varchar(100) NULL
articles
項目 カラム データ型 NOT NULL その他
ID id bigint NOT NULL Primary Key
作成日 created_at datetime NOT NULL CURRENT_TIMESTAMP
更新日 updated_at datetime NULL
投稿日 posted_at datetime NOT NULL
タイトル title varchar(255) NOT NULL
本文 body TEXT NOT NULL
画像パス image_path varchar(255) NOT NULL

application.properties

application.propertiesは、アプリケーションの動作や構成などをカスタマイズする設定ファイルです。データベース接続情報、ポート番号、キャッシュ設定、プロファイルごとの設定などを定義します。

application.propertiesのパス

application.propertiesはデフォルトで「src/main/resources/」に作成されており、アプリケーション実行時に自動読み込みされます。

データベース接続設定

application.propertiesに、MySQLの接続情報を設定します。

application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/mynews
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.sql.init.mode=always
項目 プロパティ 設定値
接続URL spring.datasource.url jdbc:mysql://localhost:3306/mynews
ユーザ名 spring.datasource.username root
パスワード spring.datasource.password
ドライバー spring.datasource.driver-class-name com.mysql.jdbc.Driver
SQL初期化モード spring.sql.init.mode always

spring.sql.init.mode

spring.sql.init.modeで、 「src/main/resources/schema.sql」を自動実行するか設定します。alwaysはアプリケーション起動時に常にschema.sqlを実行するので、DDLでエラーにならないように注意が必要です。

データベース接続確認

Springを起動すると、application.propertiesが実行されます。MySQLデータベースに対して「schema.sql」が実行され、「articles」「users」テーブルが作成されていれば成功です。

演習

問題1

ORMを利用するメリットで正しいのはどれですか?

  1. データベースインデックスを最適にする。
  2. データベース間の複雑な結合操作を簡単にする。
  3. プレーンテキスト形式のデータベースバックアップを簡単にする。
  4. オブジェクト指向プログラミングとデータベース操作を簡単にする。

問題2

JPA(Java Persistence API)とは何ですか?

  1. Javaアプリケーションのコンパイルエラーを自動的に修正するツール
  2. Javaプログラムでのユーザー認証とアクセス制御を提供するライブラリ
  3. オブジェクトとRDBのマッピングをするJavaのAPI
  4. データベース内のテーブルをテキストファイルとしてエクスポートするためのライブラリ

問題3

Springのアプリケーション設定ファイルはどれですか?

  1. application.properties
  2. schema.sql
  3. JDBC
  4. ORM

Spring超入門