プログラミング逆引き辞典

~ 多言語対応のプログラミングレシピ ~

MyBatis Generatorの設定方法と実行

①マーケットプレイスから「Mybatis Generator」をインストール

 
 


②build.gradleに依存関係を記述

・記述場所:dependencies
・記述コード:

implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.1'

 
 


③generationConfig.xmlを作成し、resources配下に格納

<?xml version="1.0" encoding="UTF-8"?>

<!--
//データベース名:fuga
//ユーザーID:hoge
//パスワード:passpass
//プロジェクト名:test_mybatis
//schema="fuga"
-->

<!DOCTYPE generatorConfiguration
    PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
    "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
    <!-- <classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" /> -->

    <!-- データベースの接続設定 -->
    <!-- MySQL データベース名:fuga ユーザーID:hoge パスワード:passpassの場合 -->
    <context id="MySQLTables" targetRuntime="MyBatis3">
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                connectionURL="jdbc:mysql://localhost:3306/fuga"
                userId="hoge"
                password="passpass">
        </jdbcConnection>

        <!-- プロジェクト名:test_mybatisの場合 -->
        <!-- SELECT 結果等を格納するドメインモデルを生成する設定 -->
        <javaModelGenerator targetPackage="com.example.domain" targetProject="test_mybatis/src/main/java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>

        <!-- プロジェクト名:test_mybatisの場合 -->
        <!-- SQL 設定が記述された XML を生成する設定 -->
        <sqlMapGenerator targetPackage="com.example.mybatis.mapper"  targetProject="test_mybatis/src/main/resources">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>

        <!-- マッパークラスを生成する設定
        XMLMAPPER:MapperインターフェースクラスとMapperファイルのみ生成
        MIXEDMAPPER:アノテーションを定義したMapperインターフェースクラスとMapperファイルを生成
        -->
        <!-- プロジェクト名:test_mybatisの場合 -->
        <javaClientGenerator type="MIXEDMAPPER" targetPackage="com.example.mybatis.mapper"  targetProject="test_mybatis/src/main/java">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>

        <!-- コードを生成するテーブルを指定 「%」でワイルドカード -->
            <!-- <table schema="fuga" tableName="%" > -->
            <!-- テーブル名を個別に設定する場合(スキーマ名:fuga) -->
            <table schema="fuga" tableName="employee"></table>
            <table schema="fuga" tableName="users"></table>
    </context>
</generatorConfiguration>

 

ポイント

SQL設定が記述されたXMLとMapperクラスのtargetPackageを同じ構造にするとnamespaceの設定が不要なので楽
 
 
※詳細は公式リファレンスを参照
MyBatis公式リファレンス
 
 


④プロジェクトを「右クリック」⇒「実行」⇒「実行構成」⇒「MyBatis Generator」

構成ファイルに先ほどのgeneratorConfig.xmlを選択して実行
generationConfig.xmlで指定したディレクトリに以下のファイルが出来ていることを確認
 
 


⑤作成されたDomain用クラスに「@Entity」を付与する場合はキーとなるフィールドに「@Id」を付与する

※Domain用クラス:テーブル名と同じクラス
 
 


⑥作成されたDomainフォルダ内のExampleクラスにDIコンテナの登録対象にする為に「@Component」を付与する

 
 


⑦作成されたMapperインターフェースに「@Mapper」を付与する

 
 


⑧ServiceクラスやControllerクラスにDIして使用する

 

【使用例】

package com.example.domain;

import javax.persistence.Entity;
import javax.persistence.Id;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Employee {/**
     * This field was generated by MyBatis Generator. This field corresponds to the database column employee.id
     * @mbg.generated  Thu Jan 23 01:40:20 GMT+09:00 2020
     */
    @Id
    private Integer id;

 

package com.example.mybatis.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.ResultMap;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import com.example.domain.Employee;
import com.example.domain.EmployeeExample;

@Mapper
public interface EmployeeMapper {

    /**
     * This method was generated by MyBatis Generator. This method corresponds to the database table employee
     * @mbg.generated  Thu Jan 23 01:40:20 GMT+09:00 2020
     */
    long countByExample(EmployeeExample example);
            .
            .
            .

 

@RestController
public class EmployeeController {
    @Autowired
    EmployeeMapper em;

    @GetMapping
    public String index() {
        Employee employee = new Employee();
        employee.setId(3);
        employee.setName("test");
        em.insert(employee);
        return null;
    }
}