MyBatis Generatorを導入してみた
今回は番外編です。クライアント側であるHTMLやJavaScriptとは直接関係はありませんが サーバー側の処理を実装する手間を軽減すべくSpring BootにMyBatis Generatorを導入してみました。 テーブルを指定すると、そのテーブル定義に基づくマッパーやエンティティを自動生成してくれるツールです。
src/main/resources にgeneratorConfig.xmlを作成します。
generatorConfig.xml
今回はOracleデータベースに接続する前提にしています。
jdbcConnectionのタグでデータベースへの接続情報を設定しています。
javaModelGeneratorとsqlMapGeneratorタグで自動生成するエンティティとマッパーの出力先を設定し、
tableタグでジェネレート対象のDBテーブルを指定しています。(今回はTESTTBLテーブル)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="OracleTables" targetRuntime="MyBatis3">
<!-- JDBC Connection Configuration for Oracle -->
<jdbcConnection driverClass="oracle.jdbc.driver.OracleDriver"
connectionURL="jdbc:oracle:thin:@localhost:1521:XE"
userId="system"
password="test">
</jdbcConnection>
<!-- Java Model Generator Configuration -->
<javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- SQL Mapper Generator Configuration -->
<sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- Java Client Generator Configuration (Java Mapper Interface) -->
<javaClientGenerator type="ANNOTATEDMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- Table Configuration -->
<table tableName="TESTTBL" domainObjectName="TestTbl"/>
</context>
</generatorConfiguration>
build.gradle
dependenciesに以下を追加
// Spring BootのMyBatis依存関係
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.3.0'
// MyBatis Generatorの依存関係
implementation 'org.mybatis.generator:mybatis-generator-core:1.4.0'
// 今回はOracle JDBC Driver
runtimeOnly 'com.oracle.database.jdbc:ojdbc8:19.16.0.0'
下の方に以下を追加
task mybatisGenerator(type: JavaExec) {
main = 'org.mybatis.generator.api.ShellRunner'
classpath = sourceSets.main.runtimeClasspath
args = ['-configfile', 'src/main/resources/generatorConfig.xml', '-overwrite']
}
plugins {
id 'java'
id 'org.springframework.boot' version '3.1.3'
id 'io.spring.dependency-management' version '1.1.3'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '17'
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'org.springframework.boot:spring-boot-starter-security'
// Spring BootのMyBatis依存関係
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.3.0'
// MyBatis Generatorの依存関係
implementation 'org.mybatis.generator:mybatis-generator-core:1.4.0'
// 今回はOracle JDBC Driver
runtimeOnly 'com.oracle.database.jdbc:ojdbc8:19.16.0.0'
}
task mybatisGenerator(type: JavaExec) {
main = 'org.mybatis.generator.api.ShellRunner'
classpath = sourceSets.main.runtimeClasspath
args = ['-configfile', 'src/main/resources/generatorConfig.xml', '-overwrite']
}
tasks.named('test') {
useJUnitPlatform()
}
Windowsの場合はコマンドプロンプトでプロジェクトのルートフォルダに移動し、
gradlew mybatisGenerator でジェネレータを実行できます。
実行に成功すると以下のファイルが自動生成されます。
・TestTblExample.java
・TestTbl.java
・TestTblMapper.java
・TestTblSqlProvider.java
TestService.java
生成されたソースを使って、データを取得するサンプルです。 TESTTBLテーブルにはidとpassのカラムがあります。どちらもVARCHAR2型です。
package com.example.demo;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Service;
import com.example.mapper.TestTblMapper; // 自動生成されたマッパー
import com.example.model.TestTbl;
import com.example.model.TestTblExample;
@Service
public class TestService {
private SqlSession sqlSession;
public TestService(SqlSession sqlSession) {
this.sqlSession = sqlSession;
}
public List getTestTbl(String id, String pass) {
// 自動生成されたマッパーの取得
TestTblMapper testTblMapper = sqlSession.getMapper(TestTblMapper.class);
// TestTblExampleを使用してクエリ条件を設定
TestTblExample example = new TestTblExample();
// WHERE id = 指定したID AND pass = 指定したパスワード
TestTblExample.Criteria criteria = example.createCriteria();
criteria.andIdEqualTo(id);
criteria.andPassEqualTo(pass);
// ORDER BY id ASC(IDで昇順)
example.setOrderByClause("id ASC");
// クエリの実行
List dataList = testTblMapper.selectByExample(example);
return dataList;
}
}
MyBatis Generatorを利用するとマッパーやエンティティなどを製作する手間が省けて便利ですね。 ただ、テーブル単体、かつ単純なSQLしか生成できません。複数のテーブルを結合したSQLや ストアドファンクションなどを利用したSQLなどはマッパーやエンティティを手動で追加しなければならないので 使いどころは限られているかも・・・という印象を受けました。