本講座の対象者
・WEBアプリ作成したい人
・dockerで環境構築したい人
・docker-composeで環境構築したい人
・Spring環境構築したい人
・Springアプリ作成したい人
本講座のゴール
・JavaフレームワークSpringについて理解します。
・docker-composeについて理解します。
・docker-composeでSpring環境のWEBアプリ構築について理解します。
氏名:梅本 利春:フリーランスエンジニア(15年くらい)
出身:北海道紋別郡湧別町
経歴:WEBアプリ(主にバックエンド)、Androidアプリ、GUIアプリなど
使用言語:Java/Android/C#/Ruby/Python/Javascript
使用DB:Oracle/Postgresql/MySQL/SQLite
ハンズオンの流れ
1.事前準備
・Dockerセットアップ
・JDKセットアップ
・Sprint Tool Suite4環境構築
2.Docker環境構築
3.患者一覧画面作成
4.受付一覧画面作成
5.修正画面作成
6.登録画面作成
時間があれば・・・
7.Docker概要
8.SpringBoot概要
1.Dockerセットアップ
(Windows7/8/10Pro以外)
Windows7環境構築
Vagrant構築
#実行ポリシーをRestricted以外に変更
Set-ExecutionPolicy RemoteSigned
#インストール
.\Install-WMF5.1.ps1
#実行ポリシーをRestrictedに変更
Set-ExecutionPolicy Restricted
vagrant --version
#結果:Vagrant 2.2.0
vagrant plugin install vagrant-vbguest #vbguestインストール(共有フォルダ用)
mkdir drug_docker #dataフォルダ作成(共有フォルダ)
vagrant box add centos/7 #BOX取得
vagrant box list #BOX結果確認:centos/7 (virtualbox, 1809.01)
vagrant init centos/7 #Vagrantfile生成
#生成されたVagrantfileの35行目の「#」削除(コメント解除)
#35行目:#config.vm.network "private_network", ip: "192.168.33.10"
#生成されたVagrantfileの38行目あたりのconfig.vm.synced_folder「#」削除(コメント解除)
#38行目:#config.vm.synced_folder "./drug_docker", "/var/vagrant_data"
vagrant up #結果:default: Machine booted and ready!
Docker/docker-composeインストール
vagrant ssh #Vagrantfileが存在する場所に移動して接続
#必要なパッケージインストール
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
#リポジトリ追加
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum makecache fast #YUMパッケージインデックス更新
#インストール可能バージョン確認
sudo yum list docker-ce.x86_64 --showduplicates | sort -r
#インストール(バージョン指定)
sudo yum -y install docker-ce-18.03.1.ce-1.el7.centos
#Docker-Composeダウンロード※証明書の検証でNGがでた為、オプション-kを追加。検証をOFFにする
#/usr/local/bin/docker-composeにダウンロードするとエラーとなった為、/home/vagrant/docker-composeにダウンロード、移動、権限変更する
sudo curl -k -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-`uname -s`-`uname -m` > /home/vagrant/docker-compose
sudo mv ./docker-compose /usr/local/bin/docker-compose
sudo chmod 755 /usr/local/bin/docker-compose
sudo systemctl start docker #起動
sudo systemctl status docker #確認
sudo usermod -aG docker $USER #現在のユーザーをdockerグループに入れる
exit #切断
vagrant ssh #再ログイン
systemctl status docker #確認
Docker/docker-composeバージョン確認
$ docker --version
//結果:Docker version 18.06.1-ce, build e68fc7a
$ docker-compose --version
//結果:docker-compose version 1.21.0, build unknown
1.Dockerセットアップ
(64bit Windows 10 Pro)
Windows環境構築(64bit Windows 10 Pro)
1.Docker for Windowsのダウンロード
URL:https://docs.docker.com/docker-for-windows/install/
「Download from Docker Store」選択
「Get Docker」選択
2.Docker for Windowsのインストール
そのまま「OK」を選択
//バージョン確認
>docker --version
Docker version 18.06.1-ce, build e68fc7a
>docker-compose --version
docker-compose version 1.22.0, build f46880fe
Mac環境構築
バージョン確認
$ docker --version
Docker version 18.06.0-ce, build 0ffa825
$ docker-compose --version
docker-compose version 1.22.0, build f46880f
1.JDKセットアップ(Windows)
JDK11.0.1のダウンロード
URL:https://www.oracle.com/technetwork/java/javase/downloads/index.html
Java SE 11.0.1(LTS)の「Download」選択
Windows: 「Accept」選択後、「jdk-11.0.1_windows-x64_bin.exe」選択してダウンロード
Mac : 「Accept」選択後、「dk-11.0.1_osx-x64_bin.dmg」選択してダウンロード
ダウンロードされたファイルを実行
1.次へ
2.インストール先を入力して次へ
3.次へ
4.インストールされた旨の画面に進んだので「閉じる」選択
JAVA_HOME設定
1.コントロールパネル⇒システム⇒システムの詳細設定⇒環境変数
2.システム環境変数に「JAVA_HOME」があれば選択、編集ボタン、なければ新規ボタンを選択
※存在する場合は既存のアプリケーションに影響しますので終了後に戻してください。
3.インストールしたホームディレクトリを入力
例:F:\ProgramFIles\Java\jdk-11.0.1
確認
1.DOSを開く
java -version #java version "11.0.1" 2018-10-16 LTS
path #jdkのbinパスが出力されることを確認:F:\ProgramFIles\Java\jdk-11.0.1\bin;
1.JDKセットアップ(Mac)
JDK11.0.1のダウンロード
URL:https://www.oracle.com/technetwork/java/javase/downloads/index.html
Java SE 11.0.1(LTS)の「Download」選択
Windows: 「Accept」選択後、「jdk-11.0.1_windows-x64_bin.exe」選択してダウンロード
Mac : 「Accept」選択後、「dk-11.0.1_osx-x64_bin.dmg」選択してダウンロード
ダウンロードされたファイルを実行
1.ダブルクリック
2.続ける
3.インストール
4.閉じる
5.バージョン確認
#バージョン確認 java version "11.0.1" 2018-10-16 LTS
java -version
JDKのアンインストール※参考まで
cd /Library/Java/JavaVirtualMachines
ls #jdk確認
#ファイル命名:/Library/Java/JavaVirtualMachines/jdkmajor.minor.macro[_update].jdk
# jdk1.7.0_80.jdkをアンインストールする場合
sudo rm -rf jdk1.7.0_80.jdk
STS4インストール
1.適当な場所にdrugフォルダを作成します。
2.docker-compose.yml作成します。ファイル名:docker-compose.yml
version: "3"
services:
drug_db:
image: postgres:9.6
container_name: "drug_db"
ports:
- 5555:5432
environment:
- POSTGRES_USER=root
- POSTGRES_PASSWORD=password
tty: true
restart: always
user: root
volumes:
- ./init:/docker-entrypoint-initdb.d
- drug_db:/var/lib/postgresql/data
volumes:
drug_db:
external: false
3.drugフォルダ内にinitフォルダを作成します。
4.initフォルダ内にユーザとデータベース作成スクリプトを配置します。
ファイル名:1_createdb.sql
create user drug_user with password 'pass';
create database drugdb;
5.initフォルダ内にユーザ権限、スキーマ作成シェルを配置します。
ファイル名:2_user_permission.sh
#!/bin/bash
# ※Windows10Pro環境では上記コメント「!/bin/bash」は不要
# ※Windows環境では改行がCRLFとして読み込まれるため、エディタの設定で改行をLF、文字コードをUTF-8に変更してください。
psql -U root -d drugdb << "EOSQL"
ALTER ROLE drug_user WITH SUPERUSER;
CREATE SCHEMA drug_user;
EOSQL
6.initフォルダ内にシーケンス、テーブル、初期データ作成シェルを配置します。
ファイル名:3_createdata.sh
#!/bin/bash
# ※Windows10Pro環境では上記コメント「!/bin/bash」は不要
# ※Windows環境では改行がCRLFとして読み込まれるため、エディタの設定で改行をLF、文字コードをUTF-8に変更してください。
psql -U drug_user -d drugdb << "EOSQL"
CREATE SEQUENCE drug_user.uke_no_seq MAXVALUE 99999999 CYCLE;
CREATE SEQUENCE drug_user.pt_no_seq MAXVALUE 99999999 CYCLE;
CREATE SEQUENCE drug_user.md_no_seq MAXVALUE 99999999 CYCLE;
CREATE SEQUENCE drug_user.hp_no_seq MAXVALUE 99999999 CYCLE;
CREATE SEQUENCE drug_user.dr_no_seq MAXVALUE 99999999 CYCLE;
CREATE SEQUENCE drug_user.ka_no_seq MAXVALUE 99999999 CYCLE;
CREATE TABLE drug_user.pt_tran
(
uke_no integer NOT NULL ,
receipt_date timestamp without time zone ,
pt_no integer ,
hp_no integer ,
dr_no integer ,
del_flg integer ,
register_user_id character varying(30) ,
register_date timestamp without time zone ,
update_user_id character varying(30) ,
update_date timestamp without time zone ,
CONSTRAINT pt_tran_pk PRIMARY KEY (uke_no)
);
CREATE TABLE drug_user.ptset_tran
(
uke_no integer NOT NULL ,
gyo_no integer NOT NULL ,
md_no integer ,
tb_no integer ,
nomi_no integer ,
times_no integer ,
del_flg integer ,
register_user_id character varying(30) ,
register_date timestamp without time zone ,
update_user_id character varying(30) ,
update_date timestamp without time zone ,
CONSTRAINT ptset_tran_pk PRIMARY KEY (uke_no,gyo_no)
);
CREATE TABLE drug_user.pt_master
(
pt_no integer NOT NULL,
pt_name character varying(50) ,
birthday_dt timestamp without time zone ,
insurance_no integer ,
insurance_cd character varying(50) ,
insurance2_cd character varying(10) ,
fuyo_flg integer ,
exp_dt timestamp without time zone ,
del_flg integer DEFAULT 0 ,
register_user_id character varying(30) ,
register_date timestamp without time zone ,
update_user_id character varying(30) ,
update_date timestamp without time zone ,
tel_no character varying(13) ,
add_no character varying(8) ,
add1_name character varying(32) ,
add2_name character varying(32) ,
add3_name character varying(32) ,
gender_flg integer DEFAULT 0 ,
CONSTRAINT pt_master_pk PRIMARY KEY (pt_no)
);
CREATE TABLE drug_user.md_master
(
md_no integer NOT NULL ,
md_name character varying(200) ,
times_no integer ,
tb_no integer ,
take_time character varying(20) ,
dtail character varying(200) ,
del_flg integer DEFAULT 0 ,
register_user_id character varying(30) ,
register_date timestamp without time zone ,
update_user_id character varying(30) ,
update_date timestamp without time zone ,
md_price_k integer ,
md_kensaku_flg character varying(6) ,
CONSTRAINT md_master_pk PRIMARY KEY (md_no)
);
CREATE TABLE drug_user.hp_master
(
hp_no integer NOT NULL ,
hp_name character varying(50) ,
hp_add_no integer DEFAULT 0 ,
hp_add1_name character varying(200) ,
hp_add2_name character varying(200) ,
hp_add3_name character varying(200) ,
hp_tel character varying(13) ,
hp_cd character varying(13) ,
del_flg integer DEFAULT 0 ,
register_user_id character varying(30) ,
register_date timestamp without time zone ,
update_user_id character varying(30) ,
update_date timestamp without time zone ,
CONSTRAINT hp_master_pk PRIMARY KEY (hp_no)
);
CREATE TABLE drug_user.hpdtl_master
(
hp_no integer NOT NULL ,
ka_flg integer NOT NULL ,
dr_no integer NOT NULL ,
del_flg integer DEFAULT 0 ,
register_user_id character varying(30) ,
register_date timestamp without time zone ,
update_user_id character varying(30) ,
update_date timestamp without time zone ,
CONSTRAINT hpdtl_master_pk PRIMARY KEY (hp_no,ka_flg,dr_no)
);
CREATE TABLE drug_user.dr_master
(
dr_no integer NOT NULL ,
dr_name character varying(50) ,
hp_no integer DEFAULT 0 ,
ka_no integer DEFAULT 0 ,
del_flg integer DEFAULT 0 ,
register_user_id character varying(30) ,
register_date timestamp without time zone ,
update_user_id character varying(30) ,
update_date timestamp without time zone ,
CONSTRAINT dr_master_pk PRIMARY KEY (dr_no)
);
CREATE TABLE drug_user.ka_master
(
ka_no integer NOT NULL ,
ka_name character varying(50) ,
del_flg integer DEFAULT 0 ,
register_user_id character varying(30) ,
register_date timestamp without time zone ,
update_user_id character varying(30) ,
update_date timestamp without time zone ,
CONSTRAINT ka_master_pk PRIMARY KEY (ka_no)
);
CREATE TABLE drug_user.name_master
(
name_kbn integer NOT NULL ,
name_no integer NOT NULL ,
nm_name character varying(200) ,
name1_flg integer DEFAULT 0 ,
name2_flg integer DEFAULT 0 ,
name3_flg integer DEFAULT 0 ,
name4_flg integer DEFAULT 0 ,
name5_flg integer DEFAULT 0 ,
del_flg integer DEFAULT 0 ,
register_user_id character varying(30) ,
register_date timestamp without time zone ,
update_user_id character varying(30) ,
update_date timestamp without time zone ,
CONSTRAINT name_master_pk PRIMARY KEY (name_kbn,name_no)
);
CREATE TABLE drug_user.nomi_master
(
nomi_no integer NOT NULL ,
nomi_name character varying(200) ,
times_no integer DEFAULT 0 ,
nomi_name_flg character varying(6) ,
del_flg integer DEFAULT 0 ,
register_user_id character varying(30) ,
register_date timestamp without time zone ,
update_user_id character varying(30) ,
update_date timestamp without time zone ,
CONSTRAINT nomi_master_pk PRIMARY KEY (nomi_no)
);
CREATE TABLE drug_user.kasan_master
(
kasan_no integer NOT NULL ,
kasan_name character varying(50) ,
kasan_p integer DEFAULT 0 ,
del_flg integer DEFAULT 0 ,
register_user_id character varying(30) ,
register_date timestamp without time zone ,
update_user_id character varying(30) ,
update_date timestamp without time zone ,
CONSTRAINT kasan_master_pk PRIMARY KEY (kasan_no)
);
commit;
INSERT INTO drug_user.md_master VALUES ( 1,'モンテルカスト錠10mg[タカタ]',1,1,'夕食後','説明',0,'2019-02-07 18:00:00.000000000',null,null);
INSERT INTO drug_user.md_master VALUES ( 2,'ロラタジン錠[NP]',1,1,'夕食後','説明',0,'2019-02-07 18:00:00.000000000',null,null);
INSERT INTO drug_user.md_master VALUES ( 3,'デキストロメトルファン臭化水素酸塩錠15mg[トーワ]',1,1,'1日3回朝昼夕食後','説明',0,'2019-02-07 18:00:00.000000000',null,null);
INSERT INTO drug_user.hp_master VALUES ( 1,'関東労災病院',0,'神奈川県川崎市中原区1234','2','3','tel','hpcd',0,'2019-02-07 18:00:00.000000000',null,null);
INSERT INTO drug_user.hp_master VALUES ( 2,'横浜市立市民病院',0,'神奈川県横浜市戸塚区1234','2','3','tel','hpcd',0,'2019-02-07 18:00:00.000000000',null,null);
INSERT INTO drug_user.hp_master VALUES ( 3,'かとうクリニック',0,'神奈川県横浜市港北区1234','2','3','tel','hpcd',0,'2019-02-07 18:00:00.000000000',null,null);
INSERT INTO drug_user.hpdtl_master VALUES ( 1,1,1,0,'2019-02-07 18:00:00.000000000',null,null);
INSERT INTO drug_user.hpdtl_master VALUES ( 1,2,1,0,'2019-02-07 18:00:00.000000000',null,null);
INSERT INTO drug_user.hpdtl_master VALUES ( 1,1,2,0,'2019-02-07 18:00:00.000000000',null,null);
INSERT INTO drug_user.hpdtl_master VALUES ( 2,1,3,0,'2019-02-07 18:00:00.000000000',null,null);
INSERT INTO drug_user.hpdtl_master VALUES ( 2,1,4,0,'2019-02-07 18:00:00.000000000',null,null);
INSERT INTO drug_user.hpdtl_master VALUES ( 3,1,1,0,'2019-02-07 18:00:00.000000000',null,null);
INSERT INTO drug_user.hpdtl_master VALUES ( 3,2,1,0,'2019-02-07 18:00:00.000000000',null,null);
INSERT INTO drug_user.hpdtl_master VALUES ( 3,3,1,0,'2019-02-07 18:00:00.000000000',null,null);
INSERT INTO drug_user.hpdtl_master VALUES ( 3,1,5,0,'2019-02-07 18:00:00.000000000',null,null);
INSERT INTO drug_user.hpdtl_master VALUES ( 3,2,5,0,'2019-02-07 18:00:00.000000000',null,null);
INSERT INTO drug_user.dr_master VALUES ( 1,'先生1',0,0,0,'2019-02-07 18:00:00.000000000',null,null);
INSERT INTO drug_user.dr_master VALUES ( 2,'先生2',0,0,0,'2019-02-07 18:00:00.000000000',null,null);
INSERT INTO drug_user.dr_master VALUES ( 3,'先生3',0,0,0,'2019-02-07 18:00:00.000000000',null,null);
INSERT INTO drug_user.dr_master VALUES ( 4,'先生4',0,0,0,'2019-02-07 18:00:00.000000000',null,null);
INSERT INTO drug_user.dr_master VALUES ( 5,'先生5',0,0,0,'2019-02-07 18:00:00.000000000',null,null);
INSERT INTO drug_user.name_master VALUES (1, 1,'小児科',0,0,0,0,0,0,'2019-02-07 18:00:00.000000000',null,null);
INSERT INTO drug_user.name_master VALUES (1, 2,'内科',0,0,0,0,0,0,'2019-02-07 18:00:00.000000000',null,null);
INSERT INTO drug_user.name_master VALUES (1, 3,'呼吸器科',0,0,0,0,0,0,'2019-02-07 18:00:00.000000000',null,null);
INSERT INTO drug_user.name_master VALUES (1, 4,'外科',0,0,0,0,0,0,'2019-02-07 18:00:00.000000000',null,null);
INSERT INTO drug_user.name_master VALUES (1, 5,'泌尿器科',0,0,0,0,0,0,'2019-02-07 18:00:00.000000000',null,null);
INSERT INTO drug_user.pt_master VALUES ( 1,'患者1','1979-05-22 00:00:00.000000000',1000000001,'A0000001','B00001',1,'2020-02-07 18:00:00.000000000',0,'admin','2019-02-09 11:00:00.000000000',null,null);
INSERT INTO drug_user.pt_master VALUES ( 2,'患者2','1980-06-22 00:00:00.000000000',1000000002,'A0000002','B00002',1,'2020-02-08 18:00:00.000000000',0,'admin','2019-02-09 11:00:00.000000000',null,null);
INSERT INTO drug_user.pt_master VALUES ( 3,'患者3','1981-07-22 00:00:00.000000000',1000000003,'A0000003','B00003',1,'2020-02-09 18:00:00.000000000',0,'admin','2019-02-09 11:00:00.000000000',null,null);
INSERT INTO drug_user.pt_master VALUES ( 4,'患者4','1982-08-22 00:00:00.000000000',1000000004,'A0000004','B00004',1,'2020-02-10 18:00:00.000000000',0,'admin','2019-02-09 11:00:00.000000000',null,null);
INSERT INTO drug_user.pt_master VALUES ( 5,'患者5','1983-09-22 00:00:00.000000000',1000000005,'A0000005','B00005',1,'2020-02-11 18:00:00.000000000',0,'admin','2019-02-09 11:00:00.000000000',null,null);
INSERT INTO drug_user.pt_tran VALUES ( 1,'2019-02-08 10:00:00.000000000',1,1,1,0,'admin','2019-02-09 11:00:00.000000000',null,null);
INSERT INTO drug_user.pt_tran VALUES ( 2,'2019-02-08 11:00:00.000000000',2,1,2,0,'admin','2019-02-09 11:00:00.000000000',null,null);
INSERT INTO drug_user.pt_tran VALUES ( 3,'2019-02-08 12:00:00.000000000',3,1,3,0,'admin','2019-02-09 11:00:00.000000000',null,null);
INSERT INTO drug_user.pt_tran VALUES ( 4,'2019-02-09 11:00:00.000000000',4,2,4,0,'admin','2019-02-09 11:00:00.000000000',null,null);
INSERT INTO drug_user.pt_tran VALUES ( 5,'2019-02-09 12:00:00.000000000',5,2,5,0,'admin','2019-02-09 11:00:00.000000000',null,null);
INSERT INTO drug_user.pt_tran VALUES ( 6,'2019-02-09 13:00:00.000000000',1,1,1,0,'admin','2019-02-09 11:00:00.000000000',null,null);
INSERT INTO drug_user.pt_tran VALUES ( 7,'2019-02-10 14:00:00.000000000',2,1,2,0,'admin','2019-02-09 11:00:00.000000000',null,null);
COMMIT;
EOSQL
3.起動
docker-compose up
#バックグラウンドで実行する場合はオプション-dをつける。
#バックグラウンドでは実行ログが表示されないので正常に動いたら-dをつける。
機能概要
患者情報を全件取得して一覧表示
1.プロジェクト作成
パッケージエクスプローラ右クリック⇒新規⇒Spring スターター・プロジェクト
名前:drugstore
パッケージ:org.drug.store
その他はそのままで次へ
Spring Bootバージョン:2.1.1
依存関係は下記を選択
①Lombok:アノテーション(@Data)でgetter/setterなどを自動生成
②Spring Web:URL MappingなどのAPIを提供
③Thymeleaf:テンプレートエンジン。HTMLでフロント作成できる。
④JDBC API:DBドライバ / ⑤PostgreSQL Driver:DB / ⑥MyBatis Framework:ORマッパー
ファイル構成
ファイル構成(Maven標準ディレクトリ)
drugstore
├── src/main/java # 作成するアプリケーション/ライブラリのソースコード。
│ └── org.drug.store #★
│ └── DtrugstoreApplication # メインクラス
├── src/main/resources #★ 作成するアプリケーション/ライブラリのリソース。
│ ├── static # js/cssファイル格納用
│ ├── templates # テンプレートエンジン。HTMLが格納される
│ └── application.properties # 設定情報:DB接続/ポート番号
├── src/test/java #
│ └── org.drug.store #
│ └── Test20181220ApplicationTests # 検証用クラス
├── JREシステムライブラリ # ライブラリ
├── Maven依存関係 # Maven依存関係
├── target/generated-sources/annotations # ソースコード生成
├── target/generated-test-sources/test-annotations # テスト用ソース生成
├── src # ディレクトリ
│ ├── main #
│ └── test #
├── target # ディレクトリ
│ ├── generated-sources #
│ └── generated-test-sources #
├── mvnw # Maven Warapperラッパースクリプト。バージョン互換性に対応
├── mvnw.cmd #
└── pom.xml # 依存関係
設定:src/main/resources/application.properties
application.properties:設定情報
※コピペする際はコメント欄「#」(空白含む)は削除してください。
※spring.datasource.urlは1つのみ。Vagrant環境の場合は192.168.33.10の行を使用、それ以外はlocalhostを使用
#PostgreSQLデータベース:Win10ProまたはMac
spring.datasource.url=jdbc:postgresql://localhost:5555/drugdb
#PostgreSQLデータベース:Vagrant環境
spring.datasource.url=jdbc:postgresql://192.168.33.10:5555/drugdb
#PostgreSQLユーザー
spring.datasource.username=drug_user
#PostgreSQLパスワード
spring.datasource.password=pass
#PostgreSQLドライバ
spring.datasource.driver-class-name=org.postgresql.Driver
#Webポート番号
server.port=8000
動作確認
起動:localhost→右クリック→起動
起動ログでエラーが発生しないことを確認する
エラーが発生した場合はapplication.propertiesのチェック
パッケージ作成:src.main.java.org.drug.store.ptuserlist
患者(PtUser)クラス作成:src/main/java/org/drug/store/ptuserlist/PtUser.java
PtUser.java:pt_userテーブルとマッピング(DBと連携)
package org.drug.store.ptuserlist;
import lombok.Data;
@Data
public class PtUser {
private int ptNo;
private String ptName;
private String birthdayDt;
private int insuranceNo;
private String insuranceCd;
private String insuranceCd2;
private int fuyoFlg;
private String expDt;
}
PtUserFormクラス作成:src/main/java/org/drug/store/ptuserlist/PtUserForm.java
PtUserForm.java:HTMLと連携
package org.drug.store.ptuserlist;
import lombok.Data;
@Data
public class PtUserForm {
private int ptNo;
private String ptName;
private String birthdayDt;
private int insuranceNo;
private String insuranceCd;
private String insuranceCd2;
private int fuyoFlg;
private String expDt;
}
パッケージ作成:src.main.java.org.drug.store.mapper
PtUserMapper.java:ORマップ定義
※<が全角ですので変更してください
package org.drug.store.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.drug.store.ptuserlist.PtUser;
@Mapper
public interface PtUserMapper {
List<PtUser> selectAll();
}
フォルダ作成:src/main/resources/org/drug/store/mapper
PtUserMapper.xml:SQL定義ファイル
※<が全角ですので変更してください
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.drug.store.mapper.PtUserMapper">
<select id="selectAll" resultType="org.drug.store.ptuserlist.PtUser">
SELECT pt_no as ptNo
,pt_name as ptName
,TO_CHAR(pt.birthday_dt,'yyyy/MM/dd') as birthdayDt
,insurance_no as insuranceNo
,insurance_cd as insuranceCd
,insurance2_cd as insuranceCd2
,fuyo_flg as fuyoFlg
,TO_CHAR(pt.exp_dt,'yyyy/MM/dd') as expDt
FROM drug_user.pt_master pt
WHERE del_flg = 0
</select>
</mapper>
パッケージ:src.main.java.org.drug.store.ptuserlist
PtUserListService.java:ビジネスロジック
※<が全角ですので変更してください
package org.drug.store.ptuserlist;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.drug.store.ptuserlist.PtUser;
import org.drug.store.mapper.PtUserMapper;
@Service
@Transactional //宣言的トランザクション管理:begin/commit/rollbackを直接書かない。publicのみ。メソッド開始/終了で制御
public class PtUserListService {
@Autowired
PtUserMapper ptUserMapper;
public List<PtUser> getUserList() {
List<PtUser> userList = ptUserMapper.selectAll();
return userList;
}
}
コントローラ:src/main/java/org/drug/store/ptuserlist/PtUserListController.java
PtUserListController.java:リクエストを受け取りマッピングするコントローラ
※<が全角ですので変更してください
package org.drug.store.ptuserlist;
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 org.drug.store.ptuserlist.PtUser;
@Controller
public class PtUserListController {
@Autowired
private PtUserListService ptUserListService;
@RequestMapping(path = "/ptuserlist", method = RequestMethod.GET)
String index(Model model) {
List<PtUser> list = this.ptUserListService.getUserList();
model.addAttribute("list", list);
return "drug/store/ptuserlist";
}
}
src/main/resources/templates⇒新規⇒フォルダ:drug/store
HTML:src/main/resources/templates/drug/store⇒新規⇒その他⇒Web⇒HTMLファイル:ptuserlist.html
ptuserlist.html:画面表示するHTML
※コピペする際はDOCTYPE、html、head、bodyの開始タグ<が全角の為、半角に修正お願いします。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
Insert title here
</head>
<body>
患者一覧
患者ID
患者名
生年月日
保険番号
保険記号
保険記号2
扶養
有効期限
</body>
</html>
src/main/resources/static/⇒新規⇒フォルダ:css
HTML:src/main/resources/static/css/⇒新規⇒その他⇒Web⇒CSSファイル:index.css
index.css:トップページのスタイルCSS
@charset "UTF-8";
/*********************************
* 表題 **
**********************************/
p {
text-align: center;
font-size: 30px;
}
/**********************************
* 線と表示サイズの為に設定 **
**********************************/
table {
border-collapse: collapse;
border: solid thick;
table-layout: fixed;
}
colgroup, tbody {
border: solid medium;
}
th {
border: solid thin;
height: 2.4em;
width: 2.4em;
}
td {
border: solid thin;
height: 2.4em;
width: 2.4em;
text-align: center;
padding: 0;
}
/**********************************
* 表の位置とデザインの為に設定 **
**********************************/
table.list {
font-size: 15px;
margin: 0 auto;
border-collapse: separate;
border-spacing: 0px 1px;
}
table.list th {
padding: 12px;
vertical-align: middle;
text-align: center;
border-bottom: #999 1px solid;
color:#fff;
}
table.list td {
padding: 12px;
vertical-align: middle;
text-align: left;
border-bottom: #999 1px solid;
font-size: 15px;
}
table.list th.r1 {
width: 152px;
border-right: #999 1px solid;
background: #447791;
}
table.list th.r2,
table.list td.r2 {
width: 128px;
border-left: #fff 1px solid;
border-right: #999 1px solid;
background: #5893b1;
}
table.list th.r2,
table.list th.r3,
table.list th.r4 {
text-align: center;
}
table.list th.r3,
table.list td.r3 {
width: 128px;
border-left: #fff 1px solid;
border-right: #999 1px solid;
background: #7cacc2;
}
table.list th.r4,
table.list td.r4 {
width: 128px;
border-left: #fff 1px solid;
background: #a0c2d3;
}
/**********************************************
* 表のマウスホバー時の配色変更の為に設定 **
**********************************************/
.list {
border:1px;
}
.list tr:hover
{
background: #fbf8e9;
-o-transition: all 0.1s ease-in-out;
-webkit-transition: all 0.1s ease-in-out;
-moz-transition: all 0.1s ease-in-out;
-ms-transition: all 0.1s ease-in-out;
transition: all 0.1s ease-in-out;
}
/**********************************************
* ボタンの為に設定 **
**********************************************/
.btn-circle-flat {
display: inline-block;
text-decoration: none;
background: #87befd;
color: #FFF;
width: 120px;
height: 120px;
line-height: 120px;
border-radius: 50%;
text-align: center;
vertical-align: middle;
overflow: hidden;
transition: .4s;
}
.btn-circle-flat:hover {
background: #668ad8;
}
.button {
text-align: center;
}
1.vagrant環境はvagrant upで仮想環境を起動してvagrant sshで接続します。
vagrant up #vagrant起動
vagrant ssh #接続
2.docker-compose.ymlファイルが存在する場所で下記コマンド実行
docker-compose up -d
WEBサーバー起動
WEBブラウザで確認
URL:http://localhost:8000/ptuserlist
機能概要
特定患者の受付情報を全件取得して一覧表示
ファイル構成
ファイル構成(Maven標準ディレクトリ)
drugstore
├── src/main/java # 作成するアプリケーション/ライブラリのソースコード。
│ └── org.drug.store #★
│ └── DtrugstoreApplication # メインクラス
├── src/main/resources #★ 作成するアプリケーション/ライブラリのリソース。
│ ├── static # js/cssファイル格納用
│ ├── templates # テンプレートエンジン。HTMLが格納される
│ └── application.properties # 設定情報:DB接続/ポート番号
├── src/test/java #
│ └── org.drug.store #
│ └── Test20181220ApplicationTests # 検証用クラス
├── JREシステムライブラリ # ライブラリ
├── Maven依存関係 # Maven依存関係
├── target/generated-sources/annotations # ソースコード生成
├── target/generated-test-sources/test-annotations # テスト用ソース生成
├── src # ディレクトリ
│ ├── main #
│ └── test #
├── target # ディレクトリ
│ ├── generated-sources #
│ └── generated-test-sources #
├── mvnw # Maven Warapperラッパースクリプト。バージョン互換性に対応
├── mvnw.cmd #
└── pom.xml # 依存関係
パッケージ作成:org.drug.store.ptuketukelist
受付(PtUketuke)クラス作成:src/main/java/org/drug/store/ptuketukelist/PtUketuke.java
PtUketuke.java:pt_tran,pt_masterテーブルとマッピング(DBと連携)
package org.drug.store.ptuketukelist;
import lombok.Data;
@Data
public class PtUketuke {
private int ukeNo;
private String receiptDate;
private String hpName;
private String drName;
}
PtUketukeFormクラス作成:src/main/java/org/drug/store/ptuketukelist/PtUketukeForm.java
PtUketukeForm.java:HTMLと連携
package org.drug.store.ptuketukelist;
import lombok.Data;
@Data
public class PtUketukeForm {
private int ukeNo;
private String receiptDate;
private String hpName;
private String drName;
}
パッケージ:src.main.java.org.drug.store.mapper
PtUketukeMapper.java:ORマップ定義
※<が全角ですので変更してください
package org.drug.store.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.drug.store.ptuketukelist.PtUketuke;
@Mapper
public interface PtUketukeMapper {
List<PtUketuke> selectAll();
}
フォルダ作成:src/main/resources/org/drug/store/mapper
PtUketukeMapper.xml:SQL定義ファイル
※<が全角ですので変更してください
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.drug.store.mapper.PtUketukeMapper">
<select id="selectAll" resultType="org.drug.store.ptuketukelist.PtUketuke">
SELECT pt.uke_no as ukeNo
,TO_CHAR(pt.receipt_date,'yyyy/MM/dd') as receiptDate
,hm.hp_name as hpName
,dm.dr_name as drName
FROM drug_user.pt_tran pt
,drug_user.pt_master pm
,drug_user.hp_master hm
,drug_user.dr_master dm
WHERE pt.del_flg = 0
AND pt.pt_no = pm.pt_no
AND pt.hp_no = hm.hp_no
AND pt.dr_no = dm.dr_no
AND pt.pt_no = 1
ORDER BY pt.uke_no
</select>
</mapper>
パッケージ:src.main.java.org.drug.store.ptuketukelist
PtUketukeService.java:ビジネスロジック
※<が全角ですので変更してください
package org.drug.store.ptuketukelist;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.drug.store.ptuketukelist.PtUketuke;
import org.drug.store.mapper.PtUketukeMapper;
@Service
@Transactional //宣言的トランザクション管理:begin/commit/rollbackを直接書かない。publicのみ。メソッド開始/終了で制御
public class PtUketukeService {
@Autowired
PtUketukeMapper ptUketukeMapper;
public List<PtUketuke> getUketukeList() {
List<PtUketuke> uketukeList = ptUketukeMapper.selectAll();
return uketukeList;
}
}
コントローラ:src/main/java/org/drug/store/ptuketukelist/PtUketukeController.java
PtUketukeController.java:リクエストを受け取りマッピングするコントローラ
※表示バグがあり、下記のPtUketukeの文字が小文字になっています。大文字に変更してください。
・最終行の"</ptuketuke>"は不要です。
package org.drug.store.ptuketukelist;
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;
@Controller
public class PtUketukeController {
@Autowired
private PtUketukeService ptuketukeService;
@RequestMapping(path = "/ptuketukelist", method = RequestMethod.GET)
String index(Model model) {
List list = this.ptuketukeService.getUketukeList();
model.addAttribute("list", list);
return "drug/store/ptuketukelist";
}
}
HTML:src/main/resources/templates/drug/store⇒新規⇒その他⇒Web⇒HTMLファイル:ptuketukelist.html
ptuketukeList.html:画面表示するHTML
※コピペする際はDOCTYPE、html、head、bodyの開始タグ<が全角の為、半角に修正お願いします。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
Insert title here
</head>
<body>
受付一覧
受付No
受付日
病院名
医者名
</body>
</html>
src/main/resources/static/⇒新規⇒フォルダ:css
HTML:src/main/resources/static/css/⇒新規⇒その他⇒Web⇒CSSファイル:ptuketuke.css
ptuketuke.css:トップページのスタイルCSS
@charset "UTF-8";
/*********************************
* 表題 **
**********************************/
p {
text-align: center;
font-size: 30px;
}
/**********************************
* 線と表示サイズの為に設定 **
**********************************/
table {
border-collapse: collapse;
border: solid thick;
table-layout: fixed;
}
colgroup, tbody {
border: solid medium;
}
th {
border: solid thin;
height: 2.4em;
width: 2.4em;
}
td {
border: solid thin;
height: 2.4em;
width: 2.4em;
text-align: center;
padding: 0;
}
/**********************************
* 表の位置とデザインの為に設定 **
**********************************/
table.list {
font-size: 15px;
margin: 0 auto;
border-collapse: separate;
border-spacing: 0px 1px;
}
table.list th {
padding: 12px;
vertical-align: middle;
text-align: center;
border-bottom: #999 1px solid;
color:#fff;
}
table.list td {
padding: 12px;
vertical-align: middle;
text-align: left;
border-bottom: #999 1px solid;
font-size: 15px;
}
table.list th.r1 {
width: 152px;
border-right: #999 1px solid;
background: #447791;
}
table.list th.r2,
table.list td.r2 {
width: 128px;
border-left: #fff 1px solid;
border-right: #999 1px solid;
background: #5893b1;
}
table.list th.r2,
table.list th.r3,
table.list th.r4 {
text-align: center;
}
table.list th.r3,
table.list td.r3 {
width: 128px;
border-left: #fff 1px solid;
border-right: #999 1px solid;
background: #7cacc2;
}
table.list th.r4,
table.list td.r4 {
width: 128px;
border-left: #fff 1px solid;
background: #a0c2d3;
}
/**********************************************
* 表のマウスホバー時の配色変更の為に設定 **
**********************************************/
.list {
border:1px;
}
.list tr:hover
{
background: #fbf8e9;
-o-transition: all 0.1s ease-in-out;
-webkit-transition: all 0.1s ease-in-out;
-moz-transition: all 0.1s ease-in-out;
-ms-transition: all 0.1s ease-in-out;
transition: all 0.1s ease-in-out;
}
/**********************************************
* ボタンの為に設定 **
**********************************************/
.btn-circle-flat {
display: inline-block;
text-decoration: none;
background: #87befd;
color: #FFF;
width: 120px;
height: 120px;
line-height: 120px;
border-radius: 50%;
text-align: center;
vertical-align: middle;
overflow: hidden;
transition: .4s;
}
.btn-circle-flat:hover {
background: #668ad8;
}
.button {
text-align: center;
}
3.WEBサーバー起動
4.WEBブラウザで確認
URL:http://localhost:8000/ptuketukelist
機能概要:今回は②(本来は患者一覧での登録は②、受付一覧では①)
①新規受付登録:特定患者の受付登録
②新規会員受付登録:新規患者の受付登録
ファイル構成
ファイル構成(Maven標準ディレクトリ)
drugstore
├── src/main/java # 作成するアプリケーション/ライブラリのソースコード。
│ └── org.drug.store #★
│ └── DtrugstoreApplication # メインクラス
├── src/main/resources #★ 作成するアプリケーション/ライブラリのリソース。
│ ├── static # js/cssファイル格納用
│ ├── templates # テンプレートエンジン。HTMLが格納される
│ └── application.properties # 設定情報:DB接続/ポート番号
├── src/test/java #
│ └── org.drug.store #
│ └── Test20181220ApplicationTests # 検証用クラス
├── JREシステムライブラリ # ライブラリ
├── Maven依存関係 # Maven依存関係
├── target/generated-sources/annotations # ソースコード生成
├── target/generated-test-sources/test-annotations # テスト用ソース生成
├── src # ディレクトリ
│ ├── main #
│ └── test #
├── target # ディレクトリ
│ ├── generated-sources #
│ └── generated-test-sources #
├── mvnw # Maven Warapperラッパースクリプト。バージョン互換性に対応
├── mvnw.cmd #
└── pom.xml # 依存関係
パッケージ作成:org.drug.store.ptuketukeregister
受付(PtUketukeRegister)クラス作成:src/main/java/org/drug/store/ptuketukeregister/PtUketukeRegister.java
PtUketukeRegister.java:pt_tran,pt_masterテーブルとマッピング(DBと連携)
package org.drug.store.ptuketukeregister;
import lombok.Data;
import java.sql.Timestamp;
@Data
public class PtUketukeRegister {
private String ptName;
private Timestamp birthdayDt;
private int insuranceNo;
private String insuranceCd;
private String insuranceCd2;
private int fuyoFlg;
private int genderFlg;
private Timestamp expDt;
private String receiptDate;
private int[] mdNo;
}
PtUketukeRegisterFormクラス作成:src/main/java/org/drug/store/ptuketukeregister/PtUketukeRegisterForm.java
PtUketukeRegisterForm.java:HTMLと連携
package org.drug.store.ptuketukeregister;
import lombok.Data;
@Data
public class PtUketukeRegisterForm {
private String ptName; //患者名
private String birthdayDtYear; //生年月日_年
private String birthdayDtMonth; //生年月日_月
private String birthdayDtDay; //生年月日_日
private int insuranceNo; //保険番号
private String insuranceCd; //保険記号
private String insuranceCd2; //保険記号2
private int fuyoFlg; //扶養
private int genderFlg; //性別
private String expDtYear; //有効期限_年
private String expDtMonth; //有効期限_月
private String expDtDay; //有効期限_日
private String receiptDtYear; //受付日_年
private String receiptDtMonth; //受付日_月
private String receiptDtDay; //受付日_日
private int[] mdNo; //薬番号
}
PtGenderEnumクラス作成:src/main/java/org/drug/store/common/PtGenderEnum.java
PtGenderEnum.java:性別定数
package org.drug.store.common;
public enum PtGenderEnum {
MALE(0,"男"),
FEMALE(1,"女");
final int code;
final String label;
private PtGenderEnum (int code , String label) {
this.code = code;
this.label = label;
}
public int getCode() {
return code;
}
public String getLabel() {
return label;
}
public static PtGenderEnum valueOf(int rm ) {
switch (rm) {
case 0:
return MALE;
case 1:
return FEMALE;
default:
throw new IllegalArgumentException("argument out of range");
}
}
}
パッケージ:src.main.java.org.drug.store.mapper
PtUketukeMapper.java:ORマップ定義
insert_pt_tranメソッドを追加
※<が全角ですので変更してください
package org.drug.store.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.drug.store.ptuketukelist.PtUketuke;
@Mapper
public interface PtUketukeMapper {
List<PtUketuke> selectAll();
void insert_pt_tran(PtUketukeRegister uketuke); //ここを追加
}
フォルダ作成:src/main/resources/org/drug/store/mapper
PtUketukeMapper.xml:SQL定義ファイル
※<が全角ですので変更してください
※resulttype⇒resultType
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
INSERT INTO drug_user.pt_master (pt_no,pt_name,birthday_dt,insurance_no,insurance_cd,insurance2_cd,fuyo_flg,exp_dt,del_flg,register_user_id,register_date )
VALUES ( nextval('pt_no_seq'), #{ptName} , #{birthdayDt}, #{insuranceNo} , #{insuranceCd}, #{insuranceCd2}, #{fuyoFlg}, #{expDt}, 0,'test1',CURRENT_DATE )
サービス:src/main/java/org/drug/store/common/DrugCommonUtil.java
DrugCommonUtil.java:共通部品
package org.drug.store.common;
import java.sql.Timestamp;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import org.springframework.util.StringUtils;
public class DrugCommonUtil {
private static DateTimeFormatter DATEFORMAT_DATETIME = DateTimeFormatter.ofPattern("yyyyMMDDHHmmss");
private static DateTimeFormatter DATEFORMAT_DATE = DateTimeFormatter.ofPattern("yyyyMMdd");
/**
* 日時文字列(YYYYMMDDHHMISS)をTimestamp値に変換
*
* @param srcString
* @return 日時yyyyMMddHHmmssのTimestamp値
*/
public static Timestamp dateTimeStringToTimestamp(String srcString) {
if(isEmpty(srcString)) {
return null;
}try {
LocalDateTime dateTime = LocalDateTime.parse(srcString, DATEFORMAT_DATETIME);
return Timestamp.valueOf(dateTime);
}catch(DateTimeParseException e){
return dateStringToTimestamp(srcString);
}
}
/**
* 日付文字列(YYYYMMDD)をTimestamp値に変換
*
* @param srcString
* @return 日時yyyyMMddのTimestamp値
*/
public static Timestamp dateStringToTimestamp(String srcString) {
if(isEmpty(srcString)) {
return null;
}try {
LocalDate date = LocalDate.parse(srcString, DATEFORMAT_DATE);
return Timestamp.valueOf(date.atTime(LocalTime.MIN));
}catch(DateTimeParseException e) {
return null;
}
}
/**
* 拡張null判定。null、空文字に加えて文字列"null"もtrueと判定する.
*
* @param val
* 判定文字列
* @return 判定結果
*/
public static boolean isEmpty(String val) {
if(StringUtils.isEmpty(val)||StringUtils.pathEquals(val, "null")) {
return true;
}
return false;
}
}
サービス:src/main/java/org/drug/store/ptuketukeregister/PtUketukeRegisterService.java
PtUketukeRegisterService.java:ビジネスロジック
※<が全角ですので変更してください
package org.drug.store.ptUketukeRegister;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.sql.Timestamp;
import org.drug.store.common.DrugCommonUtil;
import org.drug.store.mapper.PtUketukeMapper;
import org.drug.store.mapper.PtUserMapper;
import org.drug.store.ptuserlist.PtUser;
@Service
@Transactional //宣言的トランザクション管理:begin/commit/rollbackを直接書かない。publicのみ。メソッド開始/終了で制御
public class PtUketukeRegisterService {
@Autowired
private PtUketukeMapper ptUketukeMapper;
@Autowired
PtUserMapper ptUserMapper;
public List<PtUser> getUserList() {
List<PtUser> userList = ptUserMapper.selectAll();
return userList;
}
public void insertUketuke(PtUketukeRegisterForm uketuke) {
PtUketukeRegister ptUketuke = new PtUketukeRegister();
//生年月日
String year = uketuke.getBirthdayDtYear();
String month = uketuke.getBirthdayDtMonth();
String day = uketuke.getBirthdayDtDay();
month = String.format("%02d", Integer.parseInt(month));
day = String.format("%02d", Integer.parseInt(day));
Timestamp tsBirthdayDt = DrugCommonUtil.dateStringToTimestamp(year+month+day);
ptUketuke.setPtName(uketuke.getPtName());
ptUketuke.setBirthdayDt(tsBirthdayDt);
ptUketuke.setGenderFlg(uketuke.getGenderFlg()); //性別
ptUketukeMapper.insert_pt_tran(ptUketuke);
}
}
コントローラ:src/main/java/org/drug/store/ptuketukeregister/PtUketukeRegisterController.java
PtUketukeRegisterController.java:リクエストを受け取りマッピングするコントローラ
※<が全角ですので変更してください
package org.drug.store.ptuketukeregister;
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;
@Controller
public class PtUketukeRegisterController {
@Autowired
private PtUketukeRegisterService ptUketukeRegisterService;
@RequestMapping(path = "/ptuketuke", method = RequestMethod.GET)
String index(Model model) {
PtUketukeRegisterForm ptUketukeRegisterForm = new PtUketukeRegisterForm();
model.addAttribute("uketuke",ptUketukeRegisterForm);
model.addAttribute("ptGenderEnums",PtGenderEnum.values());
return "drug/store/ptuketuke";
}
@RequestMapping(path = "/ptuketuke", method = RequestMethod.POST)
String uketuke(Model model, PtUketukeRegisterForm ptUketukeRegisterForm) {
//登録
this.ptUketukeRegisterService.insertUketuke(ptUketukeRegisterForm);
//再検索
List<PtUser> list = this.ptUketukeRegisterService.getUserList();
model.addAttribute("list", list);
return "drug/store/ptuserlist";
}
}
HTML:src/main/resources/templates/drug/store⇒新規⇒その他⇒Web⇒HTMLファイル:ptuketuke.html
ptuketuke.html:画面表示するHTML
※コピペする際はDOCTYPE、html、head、bodyの開始タグ<が全角の為、半角に修正お願いします。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
Insert title here
</head>
<body>
</body>
</html>
src/main/resources/static/⇒新規⇒フォルダ:css
HTML:src/main/resources/static/css/⇒新規⇒その他⇒Web⇒CSSファイル:ptuketukeregister.css
ptuketukeregister.css:トップページのスタイルCSS
@charset "UTF-8";
.kana {
ime-mode: active;
}
button._hidden {
display: none;
}
.container {
width: 1100px;
margin-right: auto;
margin-left: auto;
}
.box {
display: table-cell;
}
.row {
display: table-row;
}
.gray {
background: gray;
width: 1000px
}
.silver {
background: silver;
}
.orange {
background: orange;
}
.row2 {
height: 100px;
}
.UserInfo1_1 {
width: 220px;
background: #e7f3f0;
float:left;
}
.UserDtl_1 {
font-size: 1.3em;
float:left;
width: 280px;
}
.UserInfoTitle {
width: 30px;
height: 423px;
font-size: 2.5em;
color: #FFFFFF;
background: #1e9484;
float:left;
border: 1px solid gray;
}
.UserInfoTitle2 {
width: 30px;
height: 80px;
font-size: 2.5em;
color: #FFFFFF;
background: #1e9484;
float:left;
border: 1px solid gray;
}
.head {
font-size: 1.3em;
font-weight: bold;
margin: 0 1px 0 2px;
height: 30px;
}
.head2 {
font-size: 1.3em;
font-weight: bold;
margin: 0 1px 0 2px;
height: 53px;
}
.head3 {
font-size: 1.3em;
font-weight: bold;
margin: 0 1px 0 2px;
height: 120px;
}
/** 登録ボタン **/
.flat.fade {
position: relative;
text-align: center;
/* 中央揃え */
display: block;
margin: 0 auto;
/* 幅の指定 */
width: 100%;
max-width: 200px;
box-sizing: border-box;
padding: 10px;
/* 色の指定 */
background: linear-gradient(135deg, #ffd900, #ff9300);
color: #fff;
font-weight: bold;
border-radius: 8px;
transition: 0.3s;
}
.flat.fade:hover {
opacity: 0.7;
}
.flat.fade:active, .flat.fade:focus {
top: 2px;
}
src/main/resources/static/⇒新規⇒フォルダ:js
HTML:src/main/resources/static/js/⇒新規⇒その他⇒Web⇒jsファイル:ptuketuke.js
ptuketuke.js:受付登録JS
※<optionの開始タグは全角です。修正をお願いします。
(function() {
'use strict';
/*
今日の日付データを変数todayに格納
*/
var optionLoop, this_day, this_month, this_year, today;
today = new Date();
this_year = today.getFullYear();
this_month = today.getMonth() + 1;
this_day = today.getDate();
/*
ループ処理(スタート数字、終了数字、表示id名、デフォルト数字)
*/
optionLoop = function(start, end, id, this_day) {
var i, opt;
opt = null;
for (i = start; i <= end ; i++) {
if (i === this_day) {
opt += "<option value='" + i + "' selected>" + i + "</option>";
} else {
opt += "<option value='" + i + "'>" + i + "</option>";
}
}
return document.getElementById(id).innerHTML = opt;
};
/*
関数設定(スタート数字[必須]、終了数字[必須]、表示id名[省略可能]、デフォルト数字[省略可能])
*/
//生年月日
optionLoop(1950, this_year, 'birthdayDtYear', this_year);
optionLoop(1, 12, 'birthdayDtMonth', this_month);
optionLoop(1, 31, 'birthdayDtDay', this_day);
//有効期限
optionLoop(this_year, this_year+10, 'expDtYear', this_year);
optionLoop(1, 12, 'expDtMonth', this_month);
optionLoop(1, 31, 'expDtDay', this_day);
//受付日
optionLoop(this_year-5, this_year+5, 'receiptDtYear', this_year);
optionLoop(1, 12, 'receiptDtMonth', this_month);
optionLoop(1, 31, 'receiptDtDay', this_day);
//電話番号(数字のみ)(JQuery)
$('#nkTel').on("keypress", function(event){return leaveOnlyNumber(event);});
function leaveOnlyNumber(e){
// 数字以外の不要な文字を削除
var st = String.fromCharCode(e.which);
if ("0123456789".indexOf(st,0) < 0) { return false; }
return true;
}
})();
3.WEBサーバー起動
4.WEBブラウザで確認
URL:http://localhost:8000/ptuketuke
Dockerの登場背景
手順書が古くなる、無駄なリソースが必要など諸問題あり
スケールしやすい、リソース共有が便利、仮想化の流れへ
自分の環境では動くが他の環境では動かないといった問題が発生
Docker実行環境の例。
Dockerとは非常に軽量なコンテナ型のアプリケーション実行環境
CPUやメモリ、ディスク入出力など、コンテナ内で利用するリソースを他のコンテナから隔離したり、設定に基づいて振り分けたりする機能。
Dockerでは、最終的なアプリケーションはホストOS上の1つのプロセスとして実行されているため、余計なオーバーヘッドがない。
ハイパーバイザ型やホスト型の仮想実行環境の例。
この環境では、仮想化されたハードウェア上でLinux OSが動作し、さらにその上で目的のアプリケーションのプロセスが動作している。
アプリケーションを実行するためにはまずゲストOSを稼働させなければならず、起動に時間もかかるし、CPUやメモリ、ディスクなどのリソースも多く消費する。
Dockerと仮想マシンの比較
Dockerコンポーネント
Dockerのメリット
Dockerを一通りこなすためには・・・
Docker-composeとは
docker-composeのメリット
・開発、テスト環境に適している
・単一ホスト上でも環境を分けたい場合に利用
・Composeファイルを再利用できる
Spring Bootの特徴
MVCモデル
コントローラ:
モデル:MODEL
ビュー:HTML/CSS
プロジェクトの依存関係
要するにここで使いたいSpringフレームワークを選ぶ
ここで選んだフレームワークが pom.xml に書き込まれ、Mavenが必要なJar一式を落としてくれる
今回のアプリで選んだフレームワークは以下の通り
・Web:リクエストマッピングで使用
・Thymeleaf:HTMLテンプレートエンジン。
・Postgresql:データベース
・JDBC:データベースを接続するドライバ
・Lombok:アノテーション(@Data)でgetter/setterなどを自動生成
基本的な使い方
フレームワークを利用する。必要に応じてpom.xmlに追加することで柔軟に拡張可能。
pom.xmlに追加するとMaven依存関係ライブラリに必要なJarファイルがダウンロードされる。
下記URLのリクエストマッピングを実装する場合
URL:http://localhost:8000/web/test
コントローラクラスにwebをマッピングしてメソッドにtestをマッピングします。
@Controller
@RequestMapping("web")
public class SampleController {
@RequestMapping(path = "/test", method = RequestMethod.GET)
String showPage(Model model) {
return "test";
}
}
pom.xml
org.springframework.boot
spring-boot-starter-jdbc
org.springframework.boot
spring-boot-starter-thymeleaf
org.springframework.boot
spring-boot-starter-web
org.postgresql
postgresql
runtime
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-tomcat
provided
org.springframework.boot
spring-boot-starter-test
test
@Service
@Transactional
public class SampleService {
@Autowired
private JdbcTemplate jdbcTemplate;
public List getUserList() {
List userList = jdbcTemplate.queryForObject("select * from java_user.user", new UserMapper());
return userList;
}
//下記メソッド追加
public boolean insertUser(Model model, @ModelAttribute UserForm userForm) {
jdbcTemplate.update("INSERT INTO java_user.user(name,nm_add,nk_tel) VALUES(?,?,?)",userForm.getName(),userForm.getNm_add(),userForm.getNk_tel());
return true;
}
}
package org.drug.store;
import java.util.List;
@Controller
public class SampleController {
//下記メソッド追加 SampleControllerにリクエストマッピング=/memberのメソッド=GETで追加
@RequestMapping(path = "/member", method = RequestMethod.GET)
String member(Model model) {
return "/sample/member";
}
//下記メソッド追加 SampleControllerにリクエストマッピング=/memberのメソッド=POSTで追加
@RequestMapping(path = "/member", method = RequestMethod.POST)
String memberReg(Model model, @ModelAttribute UserForm userForm ) {
this.sampleService.insertUser(model, userForm);
List list = this.sampleService.getUserList();
model.addAttribute("list", list);
return "/sample/index";
}
}
※コピペする際はDOCTYPE、html、head、bodyの開始タグ<が全角の為、半角に修正お願いします。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
Insert title here
</head>
<body>
</body>
</html>
@charset "UTF-8";
.kana {
ime-mode: active;
}
button._hidden {
display: none;
}
.container {
margin-left: 200px;
}
.box {
display: table-cell;
}
.row {
display: table-row;
}
.gray {
background: gray;
width: 1000px
}
.silver {
background: silver;
}
.orange {
background: orange;
}
.row2 {
height: 100px;
}
.UserInfo1_1 {
width: 220px;
background: #e7f3f0;
float:left;
}
.UserDtl_1 {
font-size: 1.3em;
float:left;
width: 280px;
}
.UserInfoTitle {
width: 30px;
height: 150px;
font-size: 2.5em;
color: #FFFFFF;
background: #1e9484;
float:left;
border: 1px solid gray;
}
.UserInfoTitle2 {
width: 30px;
height: 90px;
font-size: 2.5em;
color: #FFFFFF;
background: #1e9484;
float:left;
border: 1px solid gray;
}
.head {
font-size: 1.3em;
font-weight: bold;
margin: 0 1px 0 2px;
height: 30px;
}
.head2 {
font-size: 1.3em;
font-weight: bold;
margin: 0 1px 0 2px;
height: 60px;
}
function executeSubmit() {
var name = document.getElementById('name').value;
if ( name == '' ) {
alert('氏名を入力してください');
return;
}
console.log(name);
document.forms[0].submit();
return;
}
$(function(){
// ここにプログラムを記述
$('#num-input').on('input', function() {
console.log('test1');
// 半角変換
var halfVal = $(this).val().replace(/[!-~]/g,
function (tmpStr) {
// 文字コードをシフト
return String.fromCharCode(tmpStr.charCodeAt(0) - 0xFEE0);
}
);
// 数字以外の不要な文字を削除
$(this).val(halfVal.replace(/[^0-9]/g, ''));
});
});
動作確認
URL:http://localhost:8080/sample
次回セミナー(まだ検討中ですが。。)
1.会員登録、注文登録
業務で扱うような画面設計を考慮した登録機能
2.API
JSONを使用したAPI連携機能
3.その他
Flaskを利用したアプリ、他検討中・・・
機能概要:病院の一覧を取得して一覧表示
ファイル構成
ファイル構成(Maven標準ディレクトリ)
drugstore
├── src/main/java # 作成するアプリケーション/ライブラリのソースコード。
│ └── org.drug.store #★
│ └── DtrugstoreApplication # メインクラス
├── src/main/resources #★ 作成するアプリケーション/ライブラリのリソース。
│ ├── static # js/cssファイル格納用
│ ├── templates # テンプレートエンジン。HTMLが格納される
│ └── application.properties # 設定情報:DB接続/ポート番号
├── src/test/java #
│ └── org.drug.store #
│ └── Test20181220ApplicationTests # 検証用クラス
├── JREシステムライブラリ # ライブラリ
├── Maven依存関係 # Maven依存関係
├── target/generated-sources/annotations # ソースコード生成
├── target/generated-test-sources/test-annotations # テスト用ソース生成
├── src # ディレクトリ
│ ├── main #
│ └── test #
├── target # ディレクトリ
│ ├── generated-sources #
│ └── generated-test-sources #
├── mvnw # Maven Warapperラッパースクリプト。バージョン互換性に対応
├── mvnw.cmd #
└── pom.xml # 依存関係
パッケージ作成:org.drug.store.hpList
病院リスト(HpList)クラス作成:src/main/java/org/drug/store/hpList/HpList.java
HpList.java:hp_masterテーブルとマッピング(DBと連携)
package org.drug.store.hplist;
import lombok.Data;
@Data
public class HpList {
private int hpNo;
private String hpName;
private String hpTel;
private String hpCd;
}
HpListFormクラス作成:src/main/java/org/drug/store/hpList/HpListForm.java
HpListForm.java:HTMLと連携
package org.drug.store.hplist;
import lombok.Data;
@Data
public class HpListForm {
private int hpNo;
private String hpName;
private String hpTel;
private String hpCd;
}
パッケージ:src.main.java.org.drug.store.mapper
HpListMapper.java:ORマップ定義
insert_hp_masterメソッドを追加
※<が全角ですので変更してください
package org.drug.store.mapper;
import java.util.List;
import org.drug.store.hplist.HpList;
import org.drug.store.hpregister.HpRegister;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface HpListMapper {
List selectAll();
}
フォルダ作成:src/main/resources/org/drug/store/mapper
HpListMapper.xml:SQL定義ファイル
※<が全角ですので変更してください
※resulttype⇒resultType
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
サービス:src/main/java/org/drug/store/hpList/HpListService.java
HpListService.java:ビジネスロジック
※<が全角ですので変更してください
package org.drug.store.hplist;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.drug.store.mapper.HpListMapper;
@Transactional
@Service
public class HpListService {
@Autowired
HpListMapper hpListMapper;
public List getHpList(){
List hpList = hpListMapper.selectAll();
return hpList;
}
}
コントローラ:src/main/java/org/drug/store/hpList/HpListController.java
HpListController.java:リクエストを受け取りマッピングするコントローラ
※<が全角ですので変更してください
package org.drug.store.hplist;
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;
@Controller
public class HpListController {
@Autowired
private HpListService hpListService;
@RequestMapping(path="/hplist", method = RequestMethod.GET)
public String index(Model model) {
List list = this.hpListService.getHpList();
model.addAttribute("list", list);
return "drug/store/hplist";
}
}
HTML:src/main/resources/templates/drug/store/hplist.html
hplist.html:画面表示するHTML
※コピペする際はDOCTYPE、html、head、bodyの開始タグ<が全角の為、半角に修正お願いします。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
病院一覧
ID
病院名
電話番号
医療機関コード
</body>
</html>
機能概要:病院を新規登録する
ファイル構成
ファイル構成(Maven標準ディレクトリ)
drugstore
├── src/main/java # 作成するアプリケーション/ライブラリのソースコード。
│ └── org.drug.store #★
│ └── DtrugstoreApplication # メインクラス
├── src/main/resources #★ 作成するアプリケーション/ライブラリのリソース。
│ ├── static # js/cssファイル格納用
│ ├── templates # テンプレートエンジン。HTMLが格納される
│ └── application.properties # 設定情報:DB接続/ポート番号
├── src/test/java #
│ └── org.drug.store #
│ └── Test20181220ApplicationTests # 検証用クラス
├── JREシステムライブラリ # ライブラリ
├── Maven依存関係 # Maven依存関係
├── target/generated-sources/annotations # ソースコード生成
├── target/generated-test-sources/test-annotations # テスト用ソース生成
├── src # ディレクトリ
│ ├── main #
│ └── test #
├── target # ディレクトリ
│ ├── generated-sources #
│ └── generated-test-sources #
├── mvnw # Maven Warapperラッパースクリプト。バージョン互換性に対応
├── mvnw.cmd #
└── pom.xml # 依存関係
パッケージ作成:org.drug.store.hpregister
病院登録(HpRegister)クラス作成:src/main/java/org/drug/store/hpregister/HpRegister.java
HpRegister.java:hp_masterテーブルとマッピング(DBと連携)
package org.drug.store.hpregsiter;
import lombok.Data;
@Data
public class HpRegister {
private int hpNo;
private String hpName;
private String hpAddNo;
private String hpAddName1;
private String hpAddName2;
private String hpAddName3;
private String hpTel;
private String hpCd;
}
HpRegisterFormクラス作成:src/main/java/org/drug/store/hpregister/HpRegisterForm.java
HpRegisterForm.java:HTMLと連携
package org.drug.store.hpregister;
import lombok.Data;
@Data
public class HpRegisterForm {
private int hpNo;
private String hpName;
private String hpAddNo;
private String hpAddName1;
private String hpAddName2;
private String hpAddName3;
private String hpTel;
private String hpCd;
}
パッケージ:src.main.java.org.drug.store.mapper
HpListMapper.java:ORマップ定義
insert_hp_masterメソッドを追加
※<が全角ですので変更してください
package org.drug.store.mapper;
import java.util.List;
import org.drug.store.hplist.HpList;
import org.drug.store.hpregister.HpRegister;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface HpListMapper {
List selectAll();
//ここを追加
void insert_hp_master(HpRegister toroku);
}
フォルダ作成:src/main/resources/org/drug/store/mapper
HpListMapper.xml:SQL定義ファイル
※<が全角ですので変更してください
※resulttype⇒resultType
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
//ここから追加
INSERT INTO
drug_user.hp_master(
hp_no,
hp_name,
hp_add_no,
hp_add1_name,
hp_add2_name,
hp_add3_name,
hp_tel,
hp_cd,
del_flg,
register_user_id,
register_date
)
VALUES
(
nextval('hp_no_seq'),
#{hpName},
#{hpAddNo},
#{hpAddName1},
#{hpAddName2},
#{hpAddName3},
#{hpTel},
#{hpCd},
0,
'test1',
CURRENT_DATE
)
サービス:src/main/java/org/drug/store/hpregister/HpRegisterService.java
HpRegisterService.java:ビジネスロジック
※<が全角ですので変更してください
package org.drug.store.hpregister;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.drug.store.hplist.HpList;
import org.drug.store.mapper.HpListMapper;
@Service
@Transactional
public class HpRegisterService {
@Autowired
HpListMapper hpListMapper;
public List getHpList(){
List list =hpListMapper.selectAll();
return list;
}
public void insertToroku(HpRegisterForm toroku) {
HpRegister hpToroku = new HpRegister();
hpToroku.setHpName(toroku.getHpName());
hpToroku.setHpAddNo(toroku.getHpAddNo());
hpToroku.setHpAddName1(toroku.getHpAddName1());
hpToroku.setHpAddName1(toroku.getHpAddName2());
hpToroku.setHpAddName1(toroku.getHpAddName2());
hpToroku.setHpTel(toroku.getHpTel());
hpToroku.setHpCd(toroku.getHpCd());
hpListMapper.insert_hp_master(hpToroku);
}
}
コントローラ:src/main/java/org/drug/store/hpregister/HpRegisterController.java
HpRegisterController.java:リクエストを受け取りマッピングするコントローラ
※<が全角ですので変更してください
package org.drug.store.hpregister;
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 org.drug.store.hplist.HpList;
@Controller
public class HpRegisterController {
@Autowired
private HpRegisterService hpRegisterService;
@RequestMapping(path ="/hptoroku", method = RequestMethod.GET)
String index(Model model) {
HpRegisterForm hpRegisterForm = new HpRegisterForm();
model.addAttribute("hpToroku", hpRegisterForm);
return "drug/store/hptoroku";
}
@RequestMapping(path="/hptoroku", method = RequestMethod.POST)
String toroku(Model model, HpRegisterForm hpRegisterForm) {
//登録
this.hpRegisterService.insertToroku(hpRegisterForm);
//再検索
List list = this.hpRegisterService.getHpList();
model.addAttribute("list", list);
return "drug/store/hplist";
}
}
HTML:src/main/resources/templates/drug/store/hptoroku.html
hptoroku.html:画面表示するHTML
※コピペする際はDOCTYPE、html、head、bodyの開始タグ<が全角の為、半角に修正お願いします。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
hptoroku
</body>
</html>
機能概要:医師の一覧を取得して一覧表示
ファイル構成
ファイル構成(Maven標準ディレクトリ)
drugstore
├── src/main/java # 作成するアプリケーション/ライブラリのソースコード。
│ └── org.drug.store #★
│ └── DtrugstoreApplication # メインクラス
├── src/main/resources #★ 作成するアプリケーション/ライブラリのリソース。
│ ├── static # js/cssファイル格納用
│ ├── templates # テンプレートエンジン。HTMLが格納される
│ └── application.properties # 設定情報:DB接続/ポート番号
├── src/test/java #
│ └── org.drug.store #
│ └── Test20181220ApplicationTests # 検証用クラス
├── JREシステムライブラリ # ライブラリ
├── Maven依存関係 # Maven依存関係
├── target/generated-sources/annotations # ソースコード生成
├── target/generated-test-sources/test-annotations # テスト用ソース生成
├── src # ディレクトリ
│ ├── main #
│ └── test #
├── target # ディレクトリ
│ ├── generated-sources #
│ └── generated-test-sources #
├── mvnw # Maven Warapperラッパースクリプト。バージョン互換性に対応
├── mvnw.cmd #
└── pom.xml # 依存関係
パッケージ作成:org.drug.store.drList
医師リスト(DrList)クラス作成:src/main/java/org/drug/store/drList/DrList.java
DrList.java:dr_masterテーブルとマッピング(DBと連携)
package org.drug.store.drlist;
import lombok.Data;
@Data
public class DrList {
private int drNo;
private String drName;
private String hpName;
private String kaName;
}
DrListFormクラス作成:src/main/java/org/drug/store/drList/DrListForm.java
DrListForm.java:HTMLと連携
package org.drug.store.drlist;
import lombok.Data;
@Data
public class DrListForm {
private int drNo;
private String drName;
private String hpName;
private String kaName;
}
パッケージ:src.main.java.org.drug.store.mapper
DrListMapper.java:ORマップ定義
insert_dr_masterメソッドを追加
※<が全角ですので変更してください
package org.drug.store.mapper;
import java.util.List;
import org.drug.store.drlist.DrList;
import org.drug.store.drregister.DrRegister;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface DrListMapper {
List selectAll();
}
フォルダ作成:src/main/resources/org/drug/store/mapper
DrListMapper.xml:SQL定義ファイル
※<が全角ですので変更してください
※resulttype⇒resultType
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
サービス:src/main/java/org/drug/store/drList/DrListService.java
DrListService.java:ビジネスロジック
※<が全角ですので変更してください
package org.drug.store.drlist;
imimport java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.drug.store.mapper.DrListMapper;
@Transactional
@Service
public class DrListService {
@Autowired
DrListMapper drListMapper;
public List getDrList(){
List drList = drListMapper.selectAll();
return drList;
}
}
コントローラ:src/main/java/org/drug/store/drList/DrListController.java
DrListController.java:リクエストを受け取りマッピングするコントローラ
※<が全角ですので変更してください
package org.drug.store.drlist;
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;
@Controller
public class DrListController {
@Autowired
private DrListService drListService;
@RequestMapping(path="/drlist", method = RequestMethod.GET)
public String index(Model model) {
List list = this.drListService.getDrList();
model.addAttribute("list", list);
return "drug/store/drlist";
}
}
HTML:src/main/resources/templates/drug/store/drlist.html
drlist.html:画面表示するHTML
※コピペする際はDOCTYPE、html、head、bodyの開始タグ<が全角の為、半角に修正お願いします。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
医師一覧
ID
医師名
病院名
診療科
</body>
</html>
機能概要:医師を新規登録する
ファイル構成
ファイル構成(Maven標準ディレクトリ)
drugstore
├── src/main/java # 作成するアプリケーション/ライブラリのソースコード。
│ └── org.drug.store #★
│ └── DtrugstoreApplication # メインクラス
├── src/main/resources #★ 作成するアプリケーション/ライブラリのリソース。
│ ├── static # js/cssファイル格納用
│ ├── templates # テンプレートエンジン。HTMLが格納される
│ └── application.properties # 設定情報:DB接続/ポート番号
├── src/test/java #
│ └── org.drug.store #
│ └── Test20181220ApplicationTests # 検証用クラス
├── JREシステムライブラリ # ライブラリ
├── Maven依存関係 # Maven依存関係
├── target/generated-sources/annotations # ソースコード生成
├── target/generated-test-sources/test-annotations # テスト用ソース生成
├── src # ディレクトリ
│ ├── main #
│ └── test #
├── target # ディレクトリ
│ ├── generated-sources #
│ └── generated-test-sources #
├── mvnw # Maven Warapperラッパースクリプト。バージョン互換性に対応
├── mvnw.cmd #
└── pom.xml # 依存関係
パッケージ作成:org.drug.store.drregister
医師登録(DrList)クラス作成:src/main/java/org/drug/store/drregister/DrRegister.java
DrRegister.java:dr_masterテーブルとマッピング(DBと連携)
package org.drug.store.drregister;
import lombok.Data;
@Data
public class DrRegister {
private int drNo;
private String drName;
private int hpNo;
private int kaNo;
}
DrRegisterFormクラス作成:src/main/java/org/drug/store/drregister/DrRegisterForm.java
DrRegisterForm.java:HTMLと連携
package org.drug.store.drregister;
import lombok.Data;
@Data
public class DrRegisterForm {
private int drNo;
private String drName;
private int hpNo;
private int kaNo;
}
パッケージ:src.main.java.org.drug.store.mapper
DrListMapper.java:ORマップ定義
insert_dr_masterメソッドを追加
※<が全角ですので変更してください
package org.drug.store.mapper;
import java.util.List;
import org.drug.store.drlist.DrList;
import org.drug.store.drregister.DrRegister;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface DrListMapper {
//ここを追加
List selectAll();
void insert_dr_master(@Param("rec") DrRegister rec);
}
フォルダ作成:src/main/resources/org/drug/store/mapper
DrListMapper.xml:SQL定義ファイル
※<が全角ですので変更してください
※resulttype⇒resultType
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
//ここから追加
INSERT INTO
drug_user.dr_master(
dr_no,
dr_name,
hp_no,
ka_no,
del_flg,
register_user_id,
register_date
)
VALUES
(
nextval('dr_no_seq'),
#{rec.drName},
#{rec.hpNo},
#{rec.kaNo},
0,
'test1',
CURRENT_DATE
)
サービス:src/main/java/org/drug/store/drregister/DrRegisterService.java
DrRegisterService.java:ビジネスロジック
※<が全角ですので変更してください
package org.drug.store.drregister;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.drug.store.drlist.DrList;
import org.drug.store.hplist.HpList;
import org.drug.store.kalist.KaList;
import org.drug.store.mapper.DrListMapper;
import org.drug.store.mapper.HpListMapper;
import org.drug.store.mapper.KaListMapper;
@Service
@Transactional
public class DrRegisterService {
@Autowired
private DrListMapper drListMapper;
public List getDrList(){
List list =drListMapper.selectAll();
return list;
}
public void insertToroku(DrRegisterForm toroku) {
DrRegister drToroku=new DrRegister();
drToroku.setDrName(toroku.getDrName());
drToroku.setHpNo(toroku.getHpNo());
drToroku.setKaNo(toroku.getKaNo());
drListMapper.insert_dr_master(drToroku);
}
@Autowired
private HpListMapper hpListMapper;
public List getHpList(){
List list= hpListMapper.selectAll();
return list;
}
@Autowired
private KaListMapper kaListMapper;
public List getKaList(){
List list=kaListMapper.selectAll();
return list;
}
}
コントローラ:src/main/java/org/drug/store/drregister/DrRegisterController.java
DrListController.java:リクエストを受け取りマッピングするコントローラ
※<が全角ですので変更してください
package org.drug.store.drregister;
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 org.drug.store.drlist.DrList;
import org.drug.store.hplist.HpList;
import org.drug.store.kalist.KaList;
@Controller
public class DrRegisterController {
@Autowired
private DrRegisterService drRegisterService;
@RequestMapping(value="/drtoroku", method=RequestMethod.GET)
String index(Model model) {
DrRegisterForm drRegisterForm = new DrRegisterForm();
model.addAttribute("drToroku", drRegisterForm);
List hpList=this.drRegisterService.getHpList();
model.addAttribute("hpList", hpList);
List kaList=this.drRegisterService.getKaList();
model.addAttribute("kaList", kaList);
return "drug/store/drtoroku";
}
//登録処理
@RequestMapping(value="/drtoroku", method = RequestMethod.POST)
String toroku(Model model, DrRegisterForm drRegisterForm) {
this.drRegisterService.insertToroku(drRegisterForm);
List list=this.drRegisterService.getDrList();
model.addAttribute("list", list);
return "/drlist";
}
}
HTML:src/main/resources/templates/drug/store/drtoroku.html
drlist.html:画面表示するHTML
※コピペする際はDOCTYPE、html、head、bodyの開始タグ<が全角の為、半角に修正お願いします。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
drtoroku
</body>
</html>
機能概要:診療科の一覧を取得して一覧表示
ファイル構成
ファイル構成(Maven標準ディレクトリ)
drugstore
├── src/main/java # 作成するアプリケーション/ライブラリのソースコード。
│ └── org.drug.store #★
│ └── DtrugstoreApplication # メインクラス
├── src/main/resources #★ 作成するアプリケーション/ライブラリのリソース。
│ ├── static # js/cssファイル格納用
│ ├── templates # テンプレートエンジン。HTMLが格納される
│ └── application.properties # 設定情報:DB接続/ポート番号
├── src/test/java #
│ └── org.drug.store #
│ └── Test20181220ApplicationTests # 検証用クラス
├── JREシステムライブラリ # ライブラリ
├── Maven依存関係 # Maven依存関係
├── target/generated-sources/annotations # ソースコード生成
├── target/generated-test-sources/test-annotations # テスト用ソース生成
├── src # ディレクトリ
│ ├── main #
│ └── test #
├── target # ディレクトリ
│ ├── generated-sources #
│ └── generated-test-sources #
├── mvnw # Maven Warapperラッパースクリプト。バージョン互換性に対応
├── mvnw.cmd #
└── pom.xml # 依存関係
パッケージ作成:org.drug.store.kaList
診療科リスト(kaList)クラス作成:src/main/java/org/drug/store/kaList/KaList.java
KaList.java:ka_masterテーブルとマッピング(DBと連携)
package org.drug.store.kalist;
import lombok.Data;
@Data
public class KaList {
private int kaNo;
private String kaName;
}
KaListFormクラス作成:src/main/java/org/drug/store/kaList/KaListForm.java
KaListForm.java:HTMLと連携
package org.drug.store.kalist;
import lombok.Data;
@Data
public class KaListForm {
private int kaNo;
private String kaName;
}
パッケージ:src.main.java.org.drug.store.mapper
KaListMapper.java:ORマップ定義
insert_ka_masterメソッドを追加
※<が全角ですので変更してください
package org.drug.store.mapper;
iimport java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.drug.store.kalist.KaList;
import org.drug.store.karegister.KaRegister;
@Mapper
public interface KaListMapper {
List selectAll();
}
フォルダ作成:src/main/resources/org/drug/store/mapper
KaListMapper.xml:SQL定義ファイル
※<が全角ですので変更してください
※resulttype⇒resultType
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
INSERT INTO
drug_user.ka_master(
ka_no,
ka_name,
del_flg,
register_user_id,
register_date
)
VALUES
(
nextval('ka_no_seq'),
#{rec.kaName},
0,
'test1',
CURRENT_DATE
)
サービス:src/main/java/org/drug/store/kaList/KaListService.java
KaListService.java:ビジネスロジック
※<が全角ですので変更してください
package org.drug.store.kalist;
iimport java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.drug.store.mapper.KaListMapper;
@Service
@Transactional
public class KaListService {
@Autowired
KaListMapper kaListMapper;
public List getKaList(){
List kaList=kaListMapper.selectAll();
return kaList;
}
}
コントローラ:src/main/java/org/drug/store/kaList/KaListController.java
KaListController.java:リクエストを受け取りマッピングするコントローラ
※<が全角ですので変更してください
package org.drug.store.kalist;
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;
@Controller
public class KaListController {
@Autowired
private KaListService kaListService;
@RequestMapping(path="/kalist", method=RequestMethod.GET)
public String index(Model model) {
List list=this.kaListService.getKaList();
model.addAttribute("list", list);
return "drug/store/kalist";
}
}
HTML:src/main/resources/templates/drug/store/kalist.html
kalist.html:画面表示するHTML
※コピペする際はDOCTYPE、html、head、bodyの開始タグ<が全角の為、半角に修正お願いします。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
診療科一覧
ID
診療科名
</body>
</html>
機能概要:診療科の新規登録
ファイル構成
ファイル構成(Maven標準ディレクトリ)
drugstore
├── src/main/java # 作成するアプリケーション/ライブラリのソースコード。
│ └── org.drug.store #★
│ └── DtrugstoreApplication # メインクラス
├── src/main/resources #★ 作成するアプリケーション/ライブラリのリソース。
│ ├── static # js/cssファイル格納用
│ ├── templates # テンプレートエンジン。HTMLが格納される
│ └── application.properties # 設定情報:DB接続/ポート番号
├── src/test/java #
│ └── org.drug.store #
│ └── Test20181220ApplicationTests # 検証用クラス
├── JREシステムライブラリ # ライブラリ
├── Maven依存関係 # Maven依存関係
├── target/generated-sources/annotations # ソースコード生成
├── target/generated-test-sources/test-annotations # テスト用ソース生成
├── src # ディレクトリ
│ ├── main #
│ └── test #
├── target # ディレクトリ
│ ├── generated-sources #
│ └── generated-test-sources #
├── mvnw # Maven Warapperラッパースクリプト。バージョン互換性に対応
├── mvnw.cmd #
└── pom.xml # 依存関係
パッケージ作成:org.drug.store.karegister
診療科登録(kaList)クラス作成:src/main/java/org/drug/store/karegister/KaRegister.java
KaRegister.java:ka_masterテーブルとマッピング(DBと連携)
package org.drug.store.karegister;
import lombok.Data;
@Data
public class KaRegister {
private int kaNo;
private String kaName;
}
KaRegisterFormクラス作成:src/main/java/org/drug/store/karegister/KaRegisterForm.java
KaRegisterForm.java:HTMLと連携
package org.drug.store.karegister;
import lombok.Data;
@Data
public class KaRegisterForm {
private int kaNo;
private String kaName;
}
パッケージ:src.main.java.org.drug.store.mapper
KaListMapper.java:ORマップ定義
insert_ka_masterメソッドを追加
※<が全角ですので変更してください
package org.drug.store.mapper;
iimport java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.drug.store.kalist.KaList;
import org.drug.store.karegister.KaRegister;
@Mapper
public interface KaListMapper {
List selectAll();
//ここを追加
void insert_ka_master(@Param("rec") KaRegister rec);
}
フォルダ作成:src/main/resources/org/drug/store/mapper
KaListMapper.xml:SQL定義ファイル
※<が全角ですので変更してください
※resulttype⇒resultType
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
//ここから追加
INSERT INTO
drug_user.ka_master(
ka_no,
ka_name,
del_flg,
register_user_id,
register_date
)
VALUES
(
nextval('ka_no_seq'),
#{rec.kaName},
0,
'test1',
CURRENT_DATE
)
サービス:src/main/java/org/drug/store/karegister/KaRegisterService.java
KaRegisterService.java:ビジネスロジック
※<が全角ですので変更してください
package org.drug.store.karegister;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.drug.store.mapper.KaListMapper;
import org.drug.store.kalist.KaList;
@Service
@Transactional
public class KaRegisterService {
@Autowired
KaListMapper kaListMapper;
public List getKaList(){
List list=kaListMapper.selectAll();
return list;
}
public void insertToroku(KaRegisterForm toroku) {
KaRegister kaToroku = new KaRegister();
kaToroku.setKaName(toroku.getKaName());
kaListMapper.insert_ka_master(kaToroku);
}
}
コントローラ:src/main/java/org/drug/store/karegister/KaRegisterController.java
KaListController.java:リクエストを受け取りマッピングするコントローラ
※<が全角ですので変更してください
package org.drug.store.karegister;
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 org.drug.store.kalist.KaList;
@Controller
public class KaRegisterController {
@Autowired
private KaRegisterService kaRegisterService;
@RequestMapping(value="/katoroku", method=RequestMethod.GET)
String index(Model model) {
KaRegisterForm kaRegisterForm= new KaRegisterForm();
model.addAttribute("kaToroku", kaRegisterForm);
return "drug/store/katoroku";
}
@RequestMapping(value="/katoroku", method=RequestMethod.POST)
String toroku(Model model, KaRegisterForm kaRegisterForm) {
//登録
this.kaRegisterService.insertToroku(kaRegisterForm);
//再検索して一覧表示
List list=this.kaRegisterService.getKaList();
model.addAttribute("list", list);
return "drug/store/kalist";
}
}
HTML:src/main/resources/templates/drug/store/katoroku.html
katoroku.html:画面表示するHTML
※コピペする際はDOCTYPE、html、head、bodyの開始タグ<が全角の為、半角に修正お願いします。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
katoroku
</body>
</html>