使用 MyBatisGenerator 进行 Model 和 Mapper 的创建

1. 目标

在创建SpringBoot的API时,使用MyBatis从数据库中获取数据时,需要创建Model和Mapper,这是一种常见的方法。然而,我会介绍一种使用MyBatisGenerator自动生成代码的方法。

環境:环境

Eclipse(版本:2022-12(4.26.0))
Java(版本:17)
Spring Boot 3.1.1
Gradle – Groovy
MySQL(版本:8.0.33)

事前准备

(1) 准备数据库。

※本次需要事先安装Mysql(mysql Ver 8.0.33 for macos10.15 on x86_64 Homebrew)并且使用它。

Last login: Sun Aug  6 12:02:12 on ttys000
xxxxx> mysql --version
mysql  Ver 8.0.33 for macos10.15 on x86_64 (Homebrew)

(2)在数据库内创建模式并准备表格。

只需有定义即可,不关心表的具体内容。(在MySQL中创建后,通过数据库操作工具访问,表已创建完成)

スクリーンショット 2023-08-06 13.40.20.png

创建一个Spring Boot项目。

スクリーンショット 2023-08-06 13.50.08.png
スクリーンショット 2023-08-06 13.54.12.png
スクリーンショット 2023-08-06 13.55.35.png
スクリーンショット 2023-08-06 12.59.21.png

设定”build.gradle”文件的内容。
(以下是本次预先验证成功的内容)

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.1.2'
	id 'io.spring.dependency-management' version '1.1.2'
}

group = 'com'
version = '0.0.1-SNAPSHOT'

java {
	sourceCompatibility = '17'
}

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}
repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	// 依存性を追加
	implementation 'org.openapitools:jackson-databind-nullable:0.2.1'
	implementation 'org.springframework.boot:spring-boot-starter-validation'
	implementation group: 'org.springdoc', name: 'springdoc-openapi-ui', version: '1.6.9'
	implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.3.0'
	runtimeOnly 'com.mysql:mysql-connector-j'
}

tasks.named('test') {
	useJUnitPlatform()
}

4. 制作时

只需要一个选项
① 添加”mybatis-generator-config.xml”。
(※可以直接使用,之后根据需要进行编辑。)

<!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="demoTables" targetRuntime="MyBatis3">
    <!-- DB接続設定 -->
     <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
      connectionURL="jdbc:mysql://localhost/【スキーマ名】"
      userId="【スキーマのユーザID】"
      password="【スキーマのパスワード】"
      <property name="nullCatalogMeansCurrent" value="true" />
    </jdbcConnection>

 
    <!-- Select結果がマッピングされるJavaモデルの出力設定 -->
    <javaModelGenerator targetPackage="【作成する任意パス】1" targetProject="mybatisTest/src/main/java">
      <property name="enableSubPackages" value="true" />
      <property name="trimStrings" value="true" />
    </javaModelGenerator>
      

    <!-- SQLを定義したXMLファイルの出力設定 -->
    <sqlMapGenerator targetPackage="【作成する任意パス】2" targetProject="mybatisTest/src/main/resources">
      <property name="enableSubPackages" value="true" />
    </sqlMapGenerator>
    
    <!-- Mapperインターフェースの出力設定 -->
    <javaClientGenerator type="XMLMAPPER" targetPackage="【作成する任意パス】3" targetProject="mybatisTest/src/main/java"> 
      <property name="enableSubPackages" value="true" />
    </javaClientGenerator>
    
    <!-- 自動生成するテーブルの設定 -->
    <!-- ここを設定することでCRUDのつくりを操作できる -->
    <table tableName="%"
      enableInsert="true"
      enableSelectByPrimaryKey="true"
      enableUpdateByPrimaryKey="true"
      enableDeleteByPrimaryKey="true"
      enableSelectByExample="true"
      enableUpdateByExample="true"
      enableDeleteByExample="true"
      enableCountByExample="true"
      selectByPrimaryKeyQueryId="true"
      selectByExampleQueryId="true"
      modelType="flat">
    </table>
  </context>
</generatorConfiguration>

通过与数据库建立连接,设置以获取的数据内容可以创建Model和Mapper。

スクリーンショット 2023-08-06 14.28.37.png
スクリーンショット 2023-08-06 14.30.28.png

如果在执行之后在控制台上显示如下内容,则表示MyBatisGenerator执行成功。

MyBatis Generator Started...
  ビルドファイル: /Users/xxxxx/Documents/GitHub/.metadata/.plugins/org.mybatis.generator.eclipse.ui/.generatedAntScripts/mybatisTest-mybatis-generator-config.xml.xml
  ビルド成功
MyBatis Generator Finished

4. 执行结果

确认刚刚生成的层次结构。

确认 Mapper

スクリーンショット 2023-08-06 14.39.21.png
スクリーンショット 2023-08-06 14.43.28.png

确认模型

スクリーンショット 2023-08-06 14.44.27.png

5. 概括一下

可以通过继承在这里实现的内容来轻松地进行使用MyBatis开发。
这里不详细讨论使用方法,但是你可以通过更改层次结构或稍作修改,成功地将从MyBatis获取的结果存储到模型中。
在这个过程中,我们使用了MapStruct,所以下次将写一篇关于MapStruct的文章。

广告
将在 10 秒后关闭
bannerAds