（初心者向け）Spring Data JPAの基礎知識

現在学習しているSpring bootの中で、Spring Data JPAを利用する機会があったので、復習も兼ねて投稿します。

## Spring Data JPAとは
Spring bootでデータベースにアクセスできるライブラリ/フレームワークのこと。

Spring Data JPAでは、JavaクラスとDBテーブルをつなぎ合わせてくれるHibernate（ハイバーネート）ライブラリを内部実装している。


## Spring Data JPAでDBを自動生成してみる
今回は練習も兼ねてMySQLとSpring Data JPAを繋げてみます。
## MySQLでデータベースの設定を行う。
### データベースの作成。
```sql
create database db_sample;
```
### ユーザーとパスワードの設定
```sql
create user 'username'@'localhost' IDENTIFIED BY 'password';
```
### 権限の設定
```sql
GRANT ALL PRIVILEGES ON * . * TO 'username'@'localhost';
```
※補足
GRANT文　＝　設定したユーザーに対してアクセス権限の設定をする文。
二つの*（アスタリスク）はそれぞれ、データベースとテーブルを指定している。
今回は*（アスタリスク）なので、全てのデータベースとテーブルへのアクセスを許可している。

### 設定した権限をリロード
```sql
FLUSH PRIVILEGES;
```

### プロジェクトの作成
「新規」　→ 「Spring スタータープロジェクト」　から新規プロジェクトを作成。

ライブラリの追加で「MySQL Driver」を選択する
![スクリーンショット 2022-04-16 10.33.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754263/5e174872-8bfb-9cf4-c4d7-fdc1bb1d38bc.png)

②modelクラスの作成
パッケージ「model」を作成。
sampleクラスを作成します。
![スクリーンショット 2022-04-16 10.41.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754263/a3481be2-25fd-15c8-91e1-b6cbb2a973ef.png)

```java
package com.example.demo.model;

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

import lombok.Data;

@Data
@Entity
public class Sample {
	
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private Integer id;
	
	private String name;

}

```

@Data 
Beanクラスに付与することで下記のコードを省略できる。
・getter
・setter
・hashcodeメソッドのオーバーライド
・toStringメソッドのオーバーライド
・equalsメソッドのオーバーライド

@Entity 
データの入れ物であることを指すアノテーション。
付与したクラスがEntityクラスであることを示す。

@Id 
Entityの主キーを示すアノテーション。
@Idを付与すると、プライマリテーブルのプライマリキーカラムであると仮定される。

@GeneratedValue 
プライマリキーカラムにユニークな値を自動で生成，付与する方法を指定するアノテーション。
@Idを持つエンティティクラスなどに適用される。

#### Strategy
エンティティクラスのプライマリキー値を生成する方法を指定する属性。

#### GenerationType.IDENTITY
データベースのidentity列を利用して，プライマリキー値を生成する。



## application.propertiesファイルを作成
application/propertiesファイルを作成し、以下を記載しデータベースの設定を行う。
```properties
spring.jpa.hibernate.ddl-auto=create
spring.datasource.url=jdbc:mysql://localhost:3306/db_sample
spring.datasource.username=username
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
```

### ◆spring.jpa.hibernate.ddl-auto
Spring boot起動時にテーブルの自動生成を行う。設定できるのは下記。

<font color = red>Create</font>
entityテーブルがあれば削除し、再生成を行う。

<font color = red>Create-drop</font>
entityテーブルがあれば削除し、再生成を行う。また、Springboot終了時にテーブルを削除する。

<font color = red>Update</font>
Entityのテーブルがない場合、作成する。


### ◆spring.datasource.url
接続URLを指定


### ◆spring.datasource.username
MySQLで設定したユーザー名を指定


### ◆spring.datasource.password
MySQLで設定したパスワードを指定


### ◆spring.datasource.driver-class-name
JDBC ドライバのクラス名を指定する必要があり、
MySQLでは、<font color = red>com.mysql.cj.jdbc.Driver</font>を指定する。


これで準備完了。
~Application.javaを右クリック　→ Spring bootアプリケーションで実行。
![スクリーンショット 2022-04-16 11.56.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754263/02cf693d-c914-89ef-9e73-d8ebdfef9b1f.png)

自動生成できました！！


## 参考文献
https://qiita.com/tk10/items/26a3b50c2ad8694f8643#4-2-data

https://www.digitalocean.com/community/tutorials/how-to-create-a-new-user-and-grant-permissions-in-mysql-ja

https://spring.pleiades.io/guides/gs/accessing-data-mysql/