
アプリ作りを始めよう
前回(No.9)の投稿から随分と経ってしまいましたが、再開したいと思います。
ここまで、Angular、Spring、PostgreSQL、各々の環境を整備しながら、ざっくり概要を把握してきて、雰囲気はなんとなく理解したけれど、実質まだまだ、たいしたことはしてません、
全然作ってませんから。
けど今回からはコードも書いて、もうちょっと「身につくこと」を増やしていこうと思います。
まずはDB系の処理から
こういうアプリケーションを作るにあたっては、
上から作るか?(フロント側、HTML、CSS、Angular等々の部分)
下から作るか?(バックエンド側、PostgreSQL、テーブル、SQL等々の部分)
まぁ、今回作る自分のアプリは、たいした規模じゃないので、どっちから始めて大差ないと思うけど、、、
それでも、管理する情報の整理をまずはしておかないと、なにを出して(表示して)、なにを入れるか(登録するか)、後でいろいろ再整理という事態になると面倒なので、情報の整理からつまり、下から作っていくことにします。
具体的には、下記図の赤枠の部分、PostgreSQLのテーブルをSpringベースのJavaで操作(まずは読込み、いずれは追加・変更)ができるように、していこうかなと。

検索処理を作る
以前に整理した「アプリケーションの構成」でなかでの、まずは部品系のところを作ることにします。具体的には下記「カテゴリマスターの検索」と「部品マスターの検索」あたりから。

カテゴリ・テーブル
「エンジン」とか「ブレーキ」とか、大まかな部位を「カテゴリ」として括ろうとしていて、その定義テーブルを「カテゴリ」とします。
とりあえずシンプルに、項目はIDとNameがあるだけにしておきます。
(PGADMIN4でテーブル・カラム追加)

7件、初期データを用意。(PGADMIN4でデータ投入)

まずはこのテーブルに対し、検索処理を作成します。
部品・テーブル
こっちは「エンジン・オイル・排出ボルト」みたいな、部品を指すことになります。
なので「カテゴリ」より、少し項目多め。

初期データとして2件用意しておきましよう。

2つ、テーブルを作成しましたが、まずはカテゴリの検索ができるようにしてみます。
Accessing Data MySQL>>PostgreSQLへ
前回も利用した「入門コンテンツ」のなかに、「Accessing Data MySQL」というのがありました。
”PostgreSQL”と銘打ったものがないけれど、まぁ似たようなものでしょ?、、、
ということでこれをベースにしてみる。
「ファイル」メニュー、「新規」で「その他…」を選択。「Spring Boot」配下の「入門コンテンツのインポート」から「Accessing Data Mysql」を選択。

せっかくなので、名前を「tts」に名称変更しておきます。

あとは、ガイドを見ながら進んでみます。

build.gradle
中を見てみると、
plugins {
id 'org.springframework.boot' version '2.2.2.RELEASE'
id 'io.spring.dependency-management' version '1.0.8.RELEASE'
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
runtimeOnly 'mysql:mysql-connector-java'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
test {
useJUnitPlatform()
}
「runtimeOnly ‘mysql:mysql-connector-java’」とMySQL記載があるので、ここは、
「runtimeOnly ‘org.postgresql:postgresql’」としておきます。
ついでに、「group = ‘com.example’」は、「group = ‘com.chankazu.tts’」に
application.properties
もとの定義は以下のとおり
spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:3306/db_example
spring.datasource.username=springuser
spring.datasource.password=ThePassword
PostgreSQL向けに変更します。(ttsdb, ttsusr は作成済み)
spring.jpa.database=POSTGRESQL
spring.datasource.url=jdbc:postgresql://localhost:5432/ttsdb
spring.datasource.username=ttsusr
spring.datasource.password=ttsusr
spring.jpa.hibernate.ddl-auto=validate
spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
hibernate.properties
PostgreSQLにした場合は、この定義も必要になるみたい。よくわからないけれど、application.propertiesと同じ位置に追加。
hibernate.jdbc.lob.non_contextual_creation = true
エンティティ(Category)を作成
入門コンテンツに入っていたソースを参考に、カテゴリマスターのJavaクラスを作ります。
package com.chankazu.tts.accessingdatapostgresql;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity // This tells Hibernate to make a table out of this class
public class Category {
@Id
private Long id;
private String name;
protected Category() {}
public Category(Long id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return String.format(
"Category[id=%d, name='%s']",id, name);
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
リポジトリ(CategoryRepository)を作成
下記のような感じで「findAll」とか「findById」と書いておけば、そういうメソッドが作られるみたい。
たとえば「findAllOrderByNameAsc()」と書いておくと、Nameの昇順でSelectして、CategoryのListを返すメソッドが自動的に作られる、ということみたい。
これは便利(ただ、ネーミングに制約がある模様。そのあたりを知らなくて最初、ちょっとハマってしまった)。
package com.chankazu.tts.accessingdatapostgresql;
import java.util.List;
import org.springframework.data.repository.CrudRepository;
public interface CategoryRepository extends CrudRepository<Category, Integer> {
List<Category> findAll();
Category findById(Long id);
}
アプリケーションクラスを作成
実はもう一つ、参考にしていたガイドがあります。

エンティティとリポジトリを使って、カテゴリを検索して結果が返ってくることを確認できれば良いので、このガイドのアプリケーションクラスのdemoメソッドを流用することにします。
package com.chankazu.tts.accessingdatapostgresql;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class AccessingDataPostgresqlApplication {
private static final Logger log =
LoggerFactory.getLogger(AccessingDataPostgresqlApplication.class);
public static void main(String[] args) {
SpringApplication.run(AccessingDataPostgresqlApplication.class, args);
}
@Bean
public CommandLineRunner demo(CategoryRepository repository) {
return (args) -> {
// fetch all Categories
log.info("Categories found with findAll():");
log.info("-------------------------------");
for (Category category : repository.findAll()) {
log.info(category.toString());
}
log.info("");
// fetch an individual Category by ID
Category category = repository.findById(1L);
log.info("Category found with findById(1L):");
log.info("--------------------------------");
log.info(category.toString());
log.info("");
};
}
}
上記のように、「findAll」と「findById」が、logに書かれれば、SpringでのPostgreSQL利用がとりあえず出来たことになるかなと。
プロジェクト構成
とりあえず、こんな感じになりました。

とりあえず、「動くこと最優先」にしたので、いまいちな構成です。まぁ、たいしたことしてないし、、、
今後見直し、発展させ、美しいプロジェクトにしたいと思います。
テストは次回へ
ちょっと長くなったので、テスト・実行は次回に。
なんか「スラスラ」と書き上げたようにみえるかも?だけれど、実は結構あちこち引っかかったので、そういう部分もまとめておこうと思います。
コメント
[…] 前回は(No.10の記事)、SpringのMySQL向け入門コンテンツを流用し、PostgreSQLへのテーブルアクセスをする、簡単なプログラムを組みました。 […]