【プログラミング入門】javaでWEBアプリケーションを作ってみよう!【はじめに】
前回の記事でデータベースの環境構築が完了しました。
今回はAPIを追加して、データベースへの接続を行ってみましょう。
内容としては、追加、取得、更新、削除を行うAPIを作成していきます。
DB接続用のプロジェクトを作成してみよう
データベースの準備が整ったので、実際にプログラムの実装を行っていきます。
以前、STSで作成したdemoプロジェクトをそのまま利用しても構いませんが、別で新しいプロジェクトを作成します。
まず、STSを起動し以下の手順で新規プロジェクトを作成します。
「ファイル」→「新規」→「Spring スタータ・プロジェクト」
以下のウィンドウが開くかと思いますので、名前を「demo2」に変更して、次へをクリックしてください。
続いて以下の依存関係の選択が表示されるので、以下の3つを選択して下さい。
完了をクリックしてプロジェクトの作成が終わりです。
処理を実装しよう
プロジェクトの作成が完了したので、実装を行っていきます。
ファイル構成は以下のような形にしていきます。
追加・修正したファイルは以下の通りです。
追加:TestSchema.java
追加:TestEntity.java
追加:TestRepository.java
修正:application.properties
ファイルの作成、パッケージの作成方法については以前の記事を参照頂けたらと思います。
【プログラミング入門】javaでWEBアプリケーションを作ってみよう!【プログラミング編】
データベースへのアクセス処理については、SpringフレームワークのJPAというライブラリを今回使用します。
データベースに接続できれば、どのライブラリを使用しても問題ありませんが、JPAはSQLを記載しなくても処理ができるので、今回はJPAを使用することにしました。
では、説明しやすい順に実装内容を記載していきます。
TestEntity.java
はじめに説明するのはEntityファイルです。
簡単に説明するとjava側で処理するためのデータベースのデータ格納場所だと思って頂けたらと思います。
記載するルールとしては、データベースに作成したテーブルと項目を合わせることです。
相違があると接続して処理する際にエラーになります。
package com.example.demo.db.entity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name = "test_table") public class TestEntity { @Column(name = "test_id") @Id private int testId; @Column(name = "test_info") private String testInfo; public int getTestId() { return testId; } public void setTestId(int testId) { this.testId = testId; } public String getTestInfo() { return testInfo; } public void setTestInfo(String testInfo) { this.testInfo = testInfo; } }
@Entityは、対象のクラスがEntityであることの指定をしています。
@Tableはデータを保持するテーブル名を記載してください。
@Columnは作成したテーブルの項目を記載します。個々の項目とテーブルの項目を紐づけるイメージです。
@Idは主キーのことを指しています。データベース作成時に「PRIMARY KEY」の指定した項目と合わせる必要があります。
get~、set~というのは、getterr・setterと呼ばれるものでデータの出し入れする処理だと思って頂けたらいいと思います。
TestRepository.java
続いてRepositoryを作成します。
Repositoryとはテーブルにデータを追加したり、更新したり、取得したりする処理を行うところになります。
以下のように実装してみてください。
package com.example.demo.db.repository; import org.springframework.data.jpa.repository.JpaRepository; import com.example.demo.db.entity.TestEntity; public interface TestRepository extends JpaRepository<TestEntity, Integer> { }
処理するメソッドが無いように見えますが、extends で継承していることがわかりますでしょうか。
継承とは他のクラスで作成したメソッドを継承先でも使用できるようにする処理です。
JpaRepositoryというのがフレームワークであらかじめ必要そうな処理を用意してくれています。
これをTestRepository にextends (継承)することで、JpaRepositoryであらかじめ用意してくれている処理を使用することができます。
JpaRepositoryの後に記述されている<TestEntity, Integer>があるかと思いますが、一つ目には先ほど作成したTestEntityを指定してください。これによりこのRepositoryは「test_table」テーブルへアクセスする指定になります。
Integerは主キーの属性を指しています。今回は数字ですのでIntegerとしてください。
TestSchema.java
必ず必要ではありませんが、あると便利なので作成しました。
クライアントからリクエストがあったデータを格納する場所だと思って頂けたらと思います。
package com.example.demo.api; public class TestSchema { private int testId; private String testInfo; public int getTestId() { return testId; } public void setTestId(int testId) { this.testId = testId; } public String getTestInfo() { return testInfo; } public void setTestInfo(String testInfo) { this.testInfo = testInfo; } }
Entity同様、データを保持するデータクラスなので、書き方的にほぼ同じです。
クライアントから送信されてくるデータの項目名とあわせる必要があります。
Test.java
前回作成した時と同様APIの受け口を作成していきます。
前回はgetだけでしたが、今回はput、post、deleteを追加していきます。
以下、実装内容です。
package com.example.demo.api; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import com.example.demo.db.entity.TestEntity; import com.example.demo.db.repository.TestRepository; @CrossOrigin @RestController @RequestMapping("/api/test") public class Test { @Autowired TestRepository repository; @RequestMapping(method = RequestMethod.POST) public void post(@RequestBody TestSchema req) { TestEntity data = new TestEntity(); data.setTestId(req.getTestId()); data.setTestInfo(req.getTestInfo()); repository.save(data); } @RequestMapping(method = RequestMethod.GET) public List&lt;TestEntity&gt; get() { List&lt;TestEntity&gt; list = repository.findAll(); return list; } @RequestMapping(method = RequestMethod.PUT) public void put(@RequestBody TestSchema req) { TestEntity data = repository.getOne(req.getTestId()); data.setTestInfo(req.getTestInfo()); repository.save(data); } @RequestMapping(method = RequestMethod.DELETE) public void delete(@RequestBody TestSchema req) { TestEntity data = repository.getOne(req.getTestId()); repository.delete(data); } }
まず、TestRepositoryを@Autowiredで依存性の注入をします。
以下のサイトが分かりやすく説明されてますので、気になった方は一読ください。
https://qiita.com/hshimo/items/1136087e1c6e5c5b0d9f
※ざっくり説明すると、先ほど作成したリポジトリを使用するための事前準備程度に思って頂けたらよいです。
postメソッドは、新規追加処理になります。
データベースに新規レコードの追加処理を行います。
TestSchema のreqにクライアントの情報が入ってきますので、それをEntityの箱に詰めてリポジトリに追加をお願いしているイメージです。
※段ボール箱(Entity)に書類をいれたものを配達員(Repository)がデータベースさんに郵送している感じです。
getメソッドは、一覧取得処理を行っています。
findAllで「test_table」テーブルに入っているレコードをすべて取得する処理を行っています。
putメソッドは更新処理です。
まずはじめに指定されたIDでデータを取得して、そのデータを書き換えて保存するイメージです。
deleteメソッドもputと同じ要領でまずデータを取得してから対象のデータを消すように実装しています。
application.properties
application.propertiesは処理というよりかは設定になります。
こちらにデータベースの接続先を記載する形です。
spring.datasource.url=jdbc:mysql://localhost:3306/test_db?serverTimezone=JST
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
これを指定しておかないとデータベースに接続ができず、サーバ起動時にエラーになります。
以上で、サーバ側の実装が終わりです。
問題なく起動するか確認してみましょう。
以下のようにコンソールにエラーが出力されていなければOKです。エラーが出た場合はデータベースの接続先に問題ないか確認してみましょう。
最後に
実際に問題なく処理できるかまで当記事で記載しようかと思っていましたが、ボリュームが多くなってきましたのでわけます。
次回、クライアントの画面を簡単に作成して、画面からの入力でサーバが動作し、ちゃんとデータベースへデータが処理されていることを確認していきたいと思います。
※記事ができたらこちらにリンクを張ります。
コメント