MENU
Spring Boot DB連携

インメモリ型のH2DBに接続しMyBatisを利用してみた

データベースが用意されていない段階で、データベースアクセスするプログラムを作成する場合は、インメモリ型のH2DBを利用すると便利である。

今回は、Spring Bootアプリケーションで接続するデータベースをインメモリ型のH2DBに変更してみたので、そのサンプルプログラムを共有する。

前提条件

下記記事の実装が完了していること。

MyBatisのSQL文をXMLファイルに配置してみたMyBatisを利用するプログラムで、これまではMapperクラスに直接SQL文を記載していたが、今回はXMLファイルにSQL文を移動し...



サンプルプログラムの作成

作成したサンプルプログラムの構成は以下の通り。
サンプルプログラムの構成
なお、上記の赤枠は、前提条件のプログラムから追加/変更したプログラムである。

build.gradleの内容は以下の通りで、H2DBに接続するための設定を追加している。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
plugins {
id 'org.springframework.boot' version '2.1.7.RELEASE'
id 'java'
}
apply plugin: 'io.spring.dependency-management'
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
compileOnly 'org.projectlombok:lombok:1.18.10'
annotationProcessor 'org.projectlombok:lombok:1.18.10'
//H2データベースに接続するための設定
runtimeOnly 'com.h2database:h2'
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.1'
}
plugins { id 'org.springframework.boot' version '2.1.7.RELEASE' id 'java' } apply plugin: 'io.spring.dependency-management' group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8' repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' compileOnly 'org.projectlombok:lombok:1.18.10' annotationProcessor 'org.projectlombok:lombok:1.18.10' //H2データベースに接続するための設定 runtimeOnly 'com.h2database:h2' implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.1' }
plugins {
	id 'org.springframework.boot' version '2.1.7.RELEASE'
	id 'java'
}

apply plugin: 'io.spring.dependency-management'

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	compileOnly 'org.projectlombok:lombok:1.18.10'
	annotationProcessor 'org.projectlombok:lombok:1.18.10'
	//H2データベースに接続するための設定
	runtimeOnly 'com.h2database:h2'
	implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.1'
}



application.propertiesの内容は以下の通りで、インメモリ型のH2DBに接続するための設定に変更している。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
server.port = 8084
# DB接続情報
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:test
spring.datasource.username=sa
spring.datasource.password=
# h2コンソールを利用するための設定
spring.h2.console.enabled=true
# SQLSQLログ出力
logging.level.org.springframework=warn
logging.level.com.example.demo.UserDataMapper=debug
server.port = 8084 # DB接続情報 spring.datasource.driverClassName=org.h2.Driver spring.datasource.url=jdbc:h2:mem:test spring.datasource.username=sa spring.datasource.password= # h2コンソールを利用するための設定 spring.h2.console.enabled=true # SQLSQLログ出力 logging.level.org.springframework=warn logging.level.com.example.demo.UserDataMapper=debug
server.port = 8084
# DB接続情報
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:test
spring.datasource.username=sa
spring.datasource.password=
# h2コンソールを利用するための設定
spring.h2.console.enabled=true
# SQLSQLログ出力
logging.level.org.springframework=warn
logging.level.com.example.demo.UserDataMapper=debug



また、UserDataMapper.xmlの内容は以下の通りで、findMaxIdのSELECT文をH2DB用に変更している。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?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="com.example.demo.UserDataMapper">
<select id="findAll" resultType="com.example.demo.UserData">
SELECT u.id, u.name, u.birth_year as birthY, u.birth_month as birthM
, u.birth_day as birthD, u.sex as sex, m.sex_value as sex_value
FROM USER_DATA u, M_SEX m WHERE u.sex = m.sex_cd ORDER BY u.id
</select>
<select id="findById" resultType="com.example.demo.UserData">
SELECT id, name, birth_year as birthY
, birth_month as birthM , birth_day as birthD, sex
FROM USER_DATA WHERE id = #{id}
</select>
<delete id="deleteById" parameterType="java.lang.Long">
DELETE FROM USER_DATA WHERE id = #{id}
</delete>
<insert id="create" parameterType="com.example.demo.UserData">
INSERT INTO USER_DATA ( id, name, birth_year, birth_month, birth_day, sex )
VALUES (#{id}, #{name}, #{birthY}, #{birthM}, #{birthD}, #{sex})
</insert>
<update id="update" parameterType="com.example.demo.UserData">
UPDATE USER_DATA SET name = #{name}, birth_year = #{birthY}
, birth_month = #{birthM}, birth_day = #{birthD}, sex = #{sex}
WHERE id = #{id}
</update>
<select id="findMaxId" resultType="long">
SELECT IfNull(MAX(id), 0) FROM USER_DATA
</select>
</mapper>
<?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="com.example.demo.UserDataMapper"> <select id="findAll" resultType="com.example.demo.UserData"> SELECT u.id, u.name, u.birth_year as birthY, u.birth_month as birthM , u.birth_day as birthD, u.sex as sex, m.sex_value as sex_value FROM USER_DATA u, M_SEX m WHERE u.sex = m.sex_cd ORDER BY u.id </select> <select id="findById" resultType="com.example.demo.UserData"> SELECT id, name, birth_year as birthY , birth_month as birthM , birth_day as birthD, sex FROM USER_DATA WHERE id = #{id} </select> <delete id="deleteById" parameterType="java.lang.Long"> DELETE FROM USER_DATA WHERE id = #{id} </delete> <insert id="create" parameterType="com.example.demo.UserData"> INSERT INTO USER_DATA ( id, name, birth_year, birth_month, birth_day, sex ) VALUES (#{id}, #{name}, #{birthY}, #{birthM}, #{birthD}, #{sex}) </insert> <update id="update" parameterType="com.example.demo.UserData"> UPDATE USER_DATA SET name = #{name}, birth_year = #{birthY} , birth_month = #{birthM}, birth_day = #{birthD}, sex = #{sex} WHERE id = #{id} </update> <select id="findMaxId" resultType="long"> SELECT IfNull(MAX(id), 0) FROM USER_DATA </select> </mapper>
<?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="com.example.demo.UserDataMapper">
    <select id="findAll" resultType="com.example.demo.UserData">
        SELECT u.id, u.name, u.birth_year as birthY, u.birth_month as birthM
        , u.birth_day as birthD, u.sex as sex, m.sex_value as sex_value
        FROM USER_DATA u, M_SEX m WHERE u.sex = m.sex_cd ORDER BY u.id
    </select>
    <select id="findById" resultType="com.example.demo.UserData">
        SELECT id, name, birth_year as birthY
        , birth_month as birthM , birth_day as birthD, sex
        FROM USER_DATA WHERE id = #{id}
    </select>
    <delete id="deleteById" parameterType="java.lang.Long">
        DELETE FROM USER_DATA WHERE id = #{id}
    </delete>
    <insert id="create" parameterType="com.example.demo.UserData">
        INSERT INTO USER_DATA ( id, name, birth_year, birth_month, birth_day, sex )
        VALUES (#{id}, #{name}, #{birthY}, #{birthM}, #{birthD}, #{sex})
    </insert>
    <update id="update" parameterType="com.example.demo.UserData">
        UPDATE USER_DATA SET name = #{name}, birth_year = #{birthY}
        , birth_month = #{birthM}, birth_day = #{birthD}, sex = #{sex}
        WHERE id = #{id}
    </update>
    <select id="findMaxId" resultType="long">
        SELECT IfNull(MAX(id), 0) FROM USER_DATA
    </select>
</mapper>



さらに、schema.sqlとdata.sqlの内容は以下の通りで、Spring Bootアプリケーションを起動したタイミングで実行されるSQLを記載している。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
CREATE TABLE user_data
(
id INT NOT NULL,
name VARCHAR(40) NOT NULL,
birth_year INT NOT NULL,
birth_month INT NOT NULL,
birth_day INT NOT NULL,
sex CHAR(1) NOT NULL,
memo VARCHAR(1024),
PRIMARY KEY(id)
);
CREATE TABLE m_sex
(
sex_cd CHAR(1) NOT NULL,
sex_value VARCHAR(4) NOT NULL,
PRIMARY KEY(sex_cd)
);
CREATE TABLE user_data ( id INT NOT NULL, name VARCHAR(40) NOT NULL, birth_year INT NOT NULL, birth_month INT NOT NULL, birth_day INT NOT NULL, sex CHAR(1) NOT NULL, memo VARCHAR(1024), PRIMARY KEY(id) ); CREATE TABLE m_sex ( sex_cd CHAR(1) NOT NULL, sex_value VARCHAR(4) NOT NULL, PRIMARY KEY(sex_cd) );
CREATE TABLE user_data
(
   id INT NOT NULL,
   name VARCHAR(40) NOT NULL,
   birth_year INT NOT NULL,
   birth_month INT NOT NULL,
   birth_day INT NOT NULL,
   sex CHAR(1) NOT NULL,
   memo VARCHAR(1024),
   PRIMARY KEY(id)
);

CREATE TABLE m_sex
(
   sex_cd CHAR(1) NOT NULL,
   sex_value VARCHAR(4) NOT NULL,
   PRIMARY KEY(sex_cd)
);
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
INSERT INTO user_data(id, name, birth_year, birth_month, birth_day, sex, memo)
VALUES (1, 'テスト プリン', 2006, 3, 24, '1', '登録テスト1');
INSERT INTO user_data(id, name, birth_year, birth_month, birth_day, sex, memo)
VALUES (2, 'テスト プリン2', 2010, 11, 30, '2', '登録テスト2');
INSERT INTO m_sex(sex_cd, sex_value) VALUES('1', '男');
INSERT INTO m_sex(sex_cd, sex_value) VALUES('2', '女');
INSERT INTO user_data(id, name, birth_year, birth_month, birth_day, sex, memo) VALUES (1, 'テスト プリン', 2006, 3, 24, '1', '登録テスト1'); INSERT INTO user_data(id, name, birth_year, birth_month, birth_day, sex, memo) VALUES (2, 'テスト プリン2', 2010, 11, 30, '2', '登録テスト2'); INSERT INTO m_sex(sex_cd, sex_value) VALUES('1', '男'); INSERT INTO m_sex(sex_cd, sex_value) VALUES('2', '女');
INSERT INTO user_data(id, name, birth_year, birth_month, birth_day, sex, memo)
VALUES (1, 'テスト プリン', 2006, 3, 24, '1', '登録テスト1');
INSERT INTO user_data(id, name, birth_year, birth_month, birth_day, sex, memo)
VALUES (2, 'テスト プリン2', 2010, 11, 30, '2', '登録テスト2');

INSERT INTO m_sex(sex_cd, sex_value) VALUES('1', '男');
INSERT INTO m_sex(sex_cd, sex_value) VALUES('2', '女');

上記SQLは、schema.sqlに記載のCREATE TABLE文を実行した後で、data.sqlに記載のINSERT文が実行されるようになっている。また、Spring Bootアプリケーションを停止すると、作成したテーブルはクリアされる。

その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/spring-boot-h2dbmem-mybatis/demo



サンプルプログラムの実行結果

Spring Bootアプリケーションを起動し、「http://(サーバー名):(ポート番号)/」とアクセスすると、以下の画面が表示される。
サンプルプログラムの実行結果_1

その他、下記記事と同じように、データの追加・更新・削除を行うことができる。

Spring BootのWEB画面上でCRUDを含むOracleアクセス処理を実装してみた(完成イメージ編)今回は、C(Create)・R(Read)・U(Update)・D(Delete)を一通り含むOracle接続処理をSpring Boo...

また、Spring Bootアプリケーションを起動し、「http://(サーバー名):(ポート番号)/h2-console」とアクセスすると、以下の画面が表示されるため、JDBCドライバのクラス名, JDBCのURL, ユーザー名, パスワードに、application.propertiesに設定した設定名が設定されることを確認し、Connectボタンを押下する。
サンプルプログラムの実行結果_2

Spring Bootアプリケーションを起動した直後のuser_dataテーブル、m_sexテーブルの内容は以下の通りで、schema.sql⇒data.sqlを順に実行した場合のデータが設定されていることが確認できる。
サンプルプログラムの実行結果_3_1

サンプルプログラムの実行結果_3_2

要点まとめ

  • データベースが用意されていない段階で、データベースアクセスするプログラムを作成する場合は、インメモリ型のH2DBを利用すると便利である。
  • Spring Bootでインメモリ型のH2DBに接続するには、build.gradleにH2DBに接続するための設定を追加し、DB接続先設定をH2DB用に変更すればよい。
  • Spring Boot起動時に作成するテーブルのCREATE TABLE文は「schema.sql」に、INSERT文は「data.sql」にそれぞれ記載し、「src/main/resources」フォルダ下に配置すればよい。
  • Spring Bootを停止すると、起動時に作成したテーブルはクリアされる。