MyBatis Generatorを導入してみた

今回は番外編です。クライアント側であるHTMLやJavaScriptとは直接関係はありませんが サーバー側の処理を実装する手間を軽減すべくSpring BootにMyBatis Generatorを導入してみました。 テーブルを指定すると、そのテーブル定義に基づくマッパーやエンティティを自動生成してくれるツールです。

※この記事は2024/10/20時点の情報です。

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

MyBatis Generatorの自動生成を実行

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などはマッパーやエンティティを手動で追加しなければならないので 使いどころは限られているかも・・・という印象を受けました。

管理人情報