スポンサーリンク

【SpringBoot】Mybatis+MySQLでSQL自動生成。〜 generator-configなど 〜

Java
スポンサーリンク

今回の記事はSpringBootのプロジェクトでMybatisを使ってMySQLのテーブル定義からMapperクラスのSQLを自動生成する方法をご紹介する記事です。SpringBootのプロジェクトの作成方法やgenerator-configの記述などできるだけ丁寧に画像付きで記載していきます。SpringBootやMybatis初心者の方はは是非参考にしてみてください。

スポンサーリンク

SpringBootプロジェクト作成

EclipseとJavaの環境はすでにあるという前提で記事を記載していきます。

まだ環境がない方は下記記事を参考に環境構築を行ってください。

EclipseでSpringBootプロジェクトを作成しHelloWorldするまで

の環境をインストールするところは下記記事を参考にしてみてください。Eclipse.exeをクリックすると下記のような画面が表示されます。

起動を押下。

プロジェクトの作成、もしくは「ファイル」→「新規」→「プロジェクト」→「Spring BootのSpring スタータープロジェクト」をクリックし、プロジェクトを作成していきます。

名前は適当なものでOK。javaのバージョンは11です。「次へ」をクリックします。

プロジェクトに依存関係を追加できますが、プロジェクト作成後にまとめてgradleで追加するのでそのままプロジェクト作成を行ってください。

以上でプロジェクトを作成できたと思います。次にプロジェクトにMybatisなどに依存関係を追加していきます。

プロジェクトの設定

まずは今回のメインのmybatisをインストールします。

mybatisインストール

[ヘルプ]⇒[eclipse マーケットプレイス]からMyBatis Generatorをインストールします。

次にプロジェクトに依存関係を追加します。

依存関係追加

dependencies {
	implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.3.0'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	runtimeOnly 'com.mysql:mysql-connector-j'
	annotationProcessor 'org.projectlombok:lombok'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation  'org.mybatis.generator:mybatis-generator-core:1.4.2'
}

一旦今回は上記を記載していますが、別記事で使用した依存関係も含まれているので、必要なものを取捨選択してみてください。どれが必要かわからない方は全部インストールして私の別記事でMybatisを使って色々しているのでサイト内みていってくれれば嬉しいです。

build.gradleを保存し、ファイルを右クリックしてgradleを更新してください。(ファイル保存のみで更新されるかも)

これでプロジェクトの設定は完了です。

次に今回Mapperを自動生成する元のMySQLを準備します。

MySQLで自動生成元のテーブル作成

MySQLはすでにローカル環境にインストールされている前提で話を進めていきます。

まだの方は下記参照。

MySQLをローカルにインストールする方法。

MySQLを起動して下記Create文でデータベースとテーブルを作成してください。

create database test;
create table test.user1 (id int, name varchar(10), age varchar(10));
insert into user1 (id, name, age) values (1, 'aaa', 9);
insert into user1 (id, name, age) values (1, 'bbb', 10);
insert into user1 (id, name, age) values (1, 'ccc', 11);
insert into user1 (id, name, age) values (1, 'ddd', 12);

これで「test」データベースに「user1」というテーブルが作成されました。

SpringBootからMySQLへの接続情報

このMySQLに接続するための情報を「application.yml」に記載します。

resourceフォルダに新規でファイルを追加し、下記記述してください。

spring:
  datasource:
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:33306/test
    username: [使用するユーザID]
    password: [設定したPS]

generator-configの記述方法

generator-configには下記を記述します。ファイルでxmlの新規追加を行い、generator-config.xmlというファイルを作成します。

<?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>

  <classPathEntry location="C:\Users\[自身のユーザ]\.gradle\caches\modules-2\files-2.1\com.mysql\mysql-connector-j\8.0.31\3fd5850719d7e82d50705d34cc6a0037fab5731f/mysql-connector-j-8.0.31.jar" />

  <context id="DB2Tables" targetRuntime="MyBatis3">
    <jdbcConnection  connectionURL="jdbc:mysql://localhost:3306/test"
            driverClass="com.mysql.jdbc.Driver"
            password="[設定したPS]"
            userId="[使用するユーザID]" />
    <javaTypeResolver>
    	<property name="forceBigDecimals" value="false" />
    </javaTypeResolver>
    <javaModelGenerator targetPackage="com.example.demo.model" targetProject="SampleMybatisPractis1/src/main/java" />
    <sqlMapGenerator targetPackage="com.example.demo.mapper"  targetProject="SampleMybatisPractis1/src/main/resources" />
    <javaClientGenerator targetPackage="com.example.demo.mapper"  targetProject="SampleMybatisPractis1/src/main/java" type="XMLMAPPER" />
    <table schema="javatest" tableName="user1">
    	<generatedKey column="id" sqlStatement="JDBC" identity="true" />
    </table>
  </context>
</generatorConfiguration>

少し解説します。

 <classPathEntry location="C:\Users\[自身のユーザ]\.gradle\caches\modules-2\files-2.1\com.mysql\mysql-connector-j\8.0.31\3fd5850719d7e82d50705d34cc6a0037fab5731f/mysql-connector-j-8.0.31.jar" />

上記はなぜかmysqlコネクターのjarが参照できずパスを追加しました。必要ない人もいるかもです。

<jdbcConnection  connectionURL="jdbc:mysql://localhost:3306/[test(テーブル名)]"
            driverClass="com.mysql.jdbc.Driver"
            password="[パスワード]"
            userId="root(自分の使用したいID)" />

ここはMySQLの認証系の情報です。自身の環境に合わせて設定します。

<javaModelGenerator targetPackage="com.example.demo.model" targetProject="PracticeMybatis(これはプロジェクト名)/src/main/java" />
<sqlMapGenerator targetPackage="com.example.demo.mapper"  targetProject="PracticeMybatis/src/main/resources" />
<javaClientGenerator targetPackage="com.example.demo.mapper"  targetProject="PracticeMybatis/src/main/java" type="XMLMAPPER" />    

この3行でどこにmodel・mapperを保存するかを記載します。

<table schema="test" tableName="user1">

テーブル名とスキーマ名を記載しています。

これで、generator-configファイルを右クリックし、Mybatisジェネレターを実行しましょう。

Mybatis+MySQLで自動生成されたもの

package com.example.demo.mapper;

import com.example.demo.model.User1;
import com.example.demo.model.User1Example;
import java.util.List;
import org.apache.ibatis.annotations.Param;

public interface User1Mapper {
    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table user1
     *
     * @mbggenerated Wed Jul 12 17:01:26 JST 2023
     */
    int countByExample(User1Example example);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table user1
     *
     * @mbggenerated Wed Jul 12 17:01:26 JST 2023
     */
    int deleteByExample(User1Example example);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table user1
     *
     * @mbggenerated Wed Jul 12 17:01:26 JST 2023
     */
    int insert(User1 record);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table user1
     *
     * @mbggenerated Wed Jul 12 17:01:26 JST 2023
     */
    int insertSelective(User1 record);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table user1
     *
     * @mbggenerated Wed Jul 12 17:01:26 JST 2023
     */
    List<User1> selectByExample(User1Example example);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table user1
     *
     * @mbggenerated Wed Jul 12 17:01:26 JST 2023
     */
    int updateByExampleSelective(@Param("record") User1 record, @Param("example") User1Example example);

    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table user1
     *
     * @mbggenerated Wed Jul 12 17:01:26 JST 2023
     */
    int updateByExample(@Param("record") User1 record, @Param("example") User1Example example);
}

例えば「countByExample」はデータの個数を取得、「deleteByExample」はデータの削除などとわかります。こういったよく使うDB処理を自動生成できるので、mapperのインスタンスを作成して、すぐに利用することができます。

この辺りの使い方に関しては別途記事にしていきます。

自動生成したmodelは下記です。

package com.example.demo.model;

public class User1 {
    /**
     *
     * This field was generated by MyBatis Generator.
     * This field corresponds to the database column user1.id
     *
     * @mbggenerated Wed Jul 12 17:01:26 JST 2023
     */
    private Integer id;

    /**
     *
     * This field was generated by MyBatis Generator.
     * This field corresponds to the database column user1.name
     *
     * @mbggenerated Wed Jul 12 17:01:26 JST 2023
     */
    private String name;

    /**
     *
     * This field was generated by MyBatis Generator.
     * This field corresponds to the database column user1.age
     *
     * @mbggenerated Wed Jul 12 17:01:26 JST 2023
     */
    private String age;

    /**
     * This method was generated by MyBatis Generator.
     * This method returns the value of the database column user1.id
     *
     * @return the value of user1.id
     *
     * @mbggenerated Wed Jul 12 17:01:26 JST 2023
     */
    public Integer getId() {
        return id;
    }

    /**
     * This method was generated by MyBatis Generator.
     * This method sets the value of the database column user1.id
     *
     * @param id the value for user1.id
     *
     * @mbggenerated Wed Jul 12 17:01:26 JST 2023
     */
    public void setId(Integer id) {
        this.id = id;
    }

    /**
     * This method was generated by MyBatis Generator.
     * This method returns the value of the database column user1.name
     *
     * @return the value of user1.name
     *
     * @mbggenerated Wed Jul 12 17:01:26 JST 2023
     */
    public String getName() {
        return name;
    }

    /**
     * This method was generated by MyBatis Generator.
     * This method sets the value of the database column user1.name
     *
     * @param name the value for user1.name
     *
     * @mbggenerated Wed Jul 12 17:01:26 JST 2023
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * This method was generated by MyBatis Generator.
     * This method returns the value of the database column user1.age
     *
     * @return the value of user1.age
     *
     * @mbggenerated Wed Jul 12 17:01:26 JST 2023
     */
    public String getAge() {
        return age;
    }

    /**
     * This method was generated by MyBatis Generator.
     * This method sets the value of the database column user1.age
     *
     * @param age the value for user1.age
     *
     * @mbggenerated Wed Jul 12 17:01:26 JST 2023
     */
    public void setAge(String age) {
        this.age = age;
    }
}
<?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.mapper.User1Mapper">
  <resultMap id="BaseResultMap" type="com.example.demo.model.User1">
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Wed Jul 12 17:01:26 JST 2023.
    -->
    <result column="id" jdbcType="INTEGER" property="id" />
    <result column="name" jdbcType="VARCHAR" property="name" />
    <result column="age" jdbcType="VARCHAR" property="age" />
  </resultMap>
  <sql id="Example_Where_Clause">
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Wed Jul 12 17:01:26 JST 2023.
    -->
    <where>
      <foreach collection="oredCriteria" item="criteria" separator="or">
        <if test="criteria.valid">
          <trim prefix="(" prefixOverrides="and" suffix=")">
            <foreach collection="criteria.criteria" item="criterion">
              <choose>
                <when test="criterion.noValue">
                  and ${criterion.condition}
                </when>
                <when test="criterion.singleValue">
                  and ${criterion.condition} #{criterion.value}
                </when>
                <when test="criterion.betweenValue">
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                </when>
                <when test="criterion.listValue">
                  and ${criterion.condition}
                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
                    #{listItem}
                  </foreach>
                </when>
              </choose>
            </foreach>
          </trim>
        </if>
      </foreach>
    </where>
  </sql>
  <sql id="Update_By_Example_Where_Clause">
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Wed Jul 12 17:01:26 JST 2023.
    -->
    <where>
      <foreach collection="example.oredCriteria" item="criteria" separator="or">
        <if test="criteria.valid">
          <trim prefix="(" prefixOverrides="and" suffix=")">
            <foreach collection="criteria.criteria" item="criterion">
              <choose>
                <when test="criterion.noValue">
                  and ${criterion.condition}
                </when>
                <when test="criterion.singleValue">
                  and ${criterion.condition} #{criterion.value}
                </when>
                <when test="criterion.betweenValue">
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                </when>
                <when test="criterion.listValue">
                  and ${criterion.condition}
                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
                    #{listItem}
                  </foreach>
                </when>
              </choose>
            </foreach>
          </trim>
        </if>
      </foreach>
    </where>
  </sql>
  <sql id="Base_Column_List">
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Wed Jul 12 17:01:26 JST 2023.
    -->
    id, name, age
  </sql>
  <select id="selectByExample" parameterType="com.example.demo.model.User1Example" resultMap="BaseResultMap">
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Wed Jul 12 17:01:26 JST 2023.
    -->
    select
    <if test="distinct">
      distinct
    </if>
    <include refid="Base_Column_List" />
    from user1
    <if test="_parameter != null">
      <include refid="Example_Where_Clause" />
    </if>
    <if test="orderByClause != null">
      order by ${orderByClause}
    </if>
  </select>
  <delete id="deleteByExample" parameterType="com.example.demo.model.User1Example">
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Wed Jul 12 17:01:26 JST 2023.
    -->
    delete from user1
    <if test="_parameter != null">
      <include refid="Example_Where_Clause" />
    </if>
  </delete>
  <insert id="insert" keyColumn="id" keyProperty="id" parameterType="com.example.demo.model.User1" useGeneratedKeys="true">
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Wed Jul 12 17:01:26 JST 2023.
    -->
    insert into user1 (name, age)
    values (#{name,jdbcType=VARCHAR}, #{age,jdbcType=VARCHAR})
  </insert>
  <insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="com.example.demo.model.User1" useGeneratedKeys="true">
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Wed Jul 12 17:01:26 JST 2023.
    -->
    insert into user1
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="name != null">
        name,
      </if>
      <if test="age != null">
        age,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="name != null">
        #{name,jdbcType=VARCHAR},
      </if>
      <if test="age != null">
        #{age,jdbcType=VARCHAR},
      </if>
    </trim>
  </insert>
  <select id="countByExample" parameterType="com.example.demo.model.User1Example" resultType="java.lang.Integer">
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Wed Jul 12 17:01:26 JST 2023.
    -->
    select count(*) from user1
    <if test="_parameter != null">
      <include refid="Example_Where_Clause" />
    </if>
  </select>
  <update id="updateByExampleSelective" parameterType="map">
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Wed Jul 12 17:01:26 JST 2023.
    -->
    update user1
    <set>
      <if test="record.id != null">
        id = #{record.id,jdbcType=INTEGER},
      </if>
      <if test="record.name != null">
        name = #{record.name,jdbcType=VARCHAR},
      </if>
      <if test="record.age != null">
        age = #{record.age,jdbcType=VARCHAR},
      </if>
    </set>
    <if test="_parameter != null">
      <include refid="Update_By_Example_Where_Clause" />
    </if>
  </update>
  <update id="updateByExample" parameterType="map">
    <!--
      WARNING - @mbggenerated
      This element is automatically generated by MyBatis Generator, do not modify.
      This element was generated on Wed Jul 12 17:01:26 JST 2023.
    -->
    update user1
    set id = #{record.id,jdbcType=INTEGER},
      name = #{record.name,jdbcType=VARCHAR},
      age = #{record.age,jdbcType=VARCHAR}
    <if test="_parameter != null">
      <include refid="Update_By_Example_Where_Clause" />
    </if>
  </update>
</mapper>

DBのテーブル定義が更新されても、Mybatisの自動生成は更新分を反映してSQLを自動生成できるので、いちいちコードの修正をする必要がなく非常に便利です。

戦術しましたが、生成したmapperの使い方や、独自のSQLをmodelに追加することもでき、非常にできることの幅は広いです。そういった点も別記事にまとめているので参考にしてみてください。

他にもJava・SpringBoot関連の記事を多数記載しています。興味があれば是非際都内見ていってください。

コメント

タイトルとURLをコピーしました