コンテンツにスキップ

コードジェネレータ

新しく生まれ変わった MyBatis-Plus コードジェネレータです。ビルダーパターンを使用して、素早く、かつエレガントに必要なコードを生成できます。以下のコードでその実力を見てみましょう。

CodeGenerator.java
FastAutoGenerator.create("url", "username", "password")
.globalConfig(builder -> builder
.author("Baomidou")
.outputDir(Paths.get(System.getProperty("user.dir")) + "/src/main/java")
.commentDate("yyyy-MM-dd")
)
.packageConfig(builder -> builder
.parent("com.baomidou.mybatisplus")
.entity("entity")
.mapper("mapper")
.service("service")
.serviceImpl("service.impl")
.xml("mapper.xml")
)
.strategyConfig(builder -> builder
.entityBuilder()
.enableLombok()
)
.templateEngine(new FreemarkerTemplateEngine())
.execute();

インストール

<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.14</version>
</dependency>

コードジェネレータはテンプレートエンジンを使用するため、お好みのテンプレートエンジンを各自導入してください。MyBatis-Plus Generator は以下のテンプレートエンジンをサポートしています:

  • VelocityTemplateEngine(デフォルト)
  • FreemarkerTemplateEngine
  • BeetlTemplateEngine
  • EnjoyTemplateEngine

その他のテンプレートエンジンを使用または適合させたい場合は、AbstractTemplateEngine を継承し、他のテンプレートエンジンの実装を参考に独自実装することができます。

生成方式

コードジェネレータは現在、以下の2つの生成方式をサポートしています:

  1. DefaultQuery (メタデータクエリ)

    • 利点: 共通インターフェースに基づいてデータベースのメタデータ関連情報を読み取るため、データベースの互換性が高い。
    • 欠点: データベースベンダーのドライバ実装に依存する。
    • 備考: デフォルトの方式。一部の型処理が理想的でない場合がある。
  2. SQLQuery (SQLクエリ)

    • 利点: データベースに応じて、対応するテーブル、主キー、フィールド取得などのクエリ文を記述する必要がある。
    • 欠点: 互換性が低く、同じデータベースベンダーでもバージョンによって互換性の問題が発生する可能性がある(例:H2データベースは1.Xバージョンのみサポート)。
    • 備考: 将来的なメンテナンスは予定されていない。

既知のデータベース(バージョン互換性の問題がない)の場合、従来のSQLクエリ方式を引き続き使用してください。サンプルコードは以下の通りです:

// MYSQL サンプル SQLクエリ方式に切り替え。生成には dbQuery と typeConvert の指定が必要
FastAutoGenerator.create("url", "username", "password")
.dataSourceConfig(builder ->
builder.databaseQueryClass(SQLQuery.class)
.typeConvert(new MySqlTypeConvert())
.dbQuery(new MySqlQuery())
)
// その他の設定 ...

メタデータクエリには現在、以下の問題があります:

  1. NotLike 方式を使用した逆方向のテーブル生成をサポートしていない。
  2. テーブルコメントを読み取ることができない。解決方法:
    • MySQL接続に remarks=true&useInformationSchema=true プロパティを追加
    • Oracle接続に remarks=true または remarksReporting=true プロパティを追加(一部のドライババージョン)
    • SqlServer:ドライバがサポートしていない
  3. 一部の PostgreSQL 型の処理が不十分(json、jsonb、uuid、xml、money 型など)。解決方法:
    • カスタム型に変換し、カスタム TypeHandler で処理する。
    • typeConvertHandler を拡張して処理する(3.5.3.3 以降で typeName の取得が追加された)。
  4. MySQL の tinyint フィールド変換問題:
    • フィールド長が 1 の場合、Boolean フィールドに変換できない。データベース接続指定時に &tinyInt1isBit=true を追加することを推奨。

    • フィールド長が 1 より大きい場合、デフォルトで Byte に変換される。Integer に変換し続けたい場合は、以下のコードを使用:

      FastAutoGenerator.create("url", "username", "password")
      .dataSourceConfig(builder ->
      builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
      // 旧バージョンとの互換性を保ちIntegerに変換
      if (JdbcType.TINYINT == metaInfo.getJdbcType()) {
      return DbColumnType.INTEGER;
      }
      return typeRegistry.getColumnType(metaInfo);
      })
      );

使用方法

コードジェネレータは以下の2つの形式で使用できます。

クイック生成

CodeGenerator の main メソッドにジェネレータコードを直接追加し、関連設定を行った後、直接実行するだけでコードを生成できます。

CodeGenerator.java
public static void main(String[] args) {
FastAutoGenerator.create("url", "username", "password")
.globalConfig(builder -> {
builder.author("baomidou") // 作者を設定
.enableSwagger() // swagger モードを有効化
.outputDir("D://"); // 出力ディレクトリを指定
})
.dataSourceConfig(builder ->
builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
int typeCode = metaInfo.getJdbcType().TYPE_CODE;
if (typeCode == Types.SMALLINT) {
// カスタム型変換
return DbColumnType.INTEGER;
}
return typeRegistry.getColumnType(metaInfo);
})
)
.packageConfig(builder ->
builder.parent("com.baomidou.mybatisplus.samples.generator") // 親パッケージ名を設定
.moduleName("system") // 親パッケージモジュール名を設定
.pathInfo(Collections.singletonMap(OutputFile.xml, "D://")) // mapperXml生成パスを設定
)
.strategyConfig(builder ->
builder.addInclude("t_simple") // 生成するテーブル名を設定
.addTablePrefix("t_", "c_") // フィルタするテーブルプレフィックスを設定
)
.templateEngine(new FreemarkerTemplateEngine()) // Freemarkerエンジンテンプレートを使用。デフォルトはVelocityエンジンテンプレート
.execute();
}

対話型生成

対話型生成は実行後、対応する内容の入力を促すプロンプトが表示され、設定入力が完了すると自動的に関連コードが生成されます。

CodeGenerator.java
public static void main(String[] args) {
FastAutoGenerator.create("url", "username", "password")
// グローバル設定
.globalConfig((scanner, builder) -> builder.author(scanner.apply("请输入作者名称?")))
// パッケージ設定
.packageConfig((scanner, builder) -> builder.parent(scanner.apply("请输入包名?")))
// ストラテジー設定
.strategyConfig((scanner, builder) -> builder.addInclude(getTables(scanner.apply("请输入表名,多个英文逗号分隔?所有输入 all")))
.entityBuilder()
.enableLombok()
.addTableFills(
new Column("create_time", FieldFill.INSERT)
)
.build())
// Freemarkerエンジンテンプレートを使用。デフォルトはVelocityエンジンテンプレート
.templateEngine(new FreemarkerTemplateEngine())
.execute();
}
// all の場合を処理
protected static List<String> getTables(String tables) {
return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
}

より多くの例が必要な場合は、test パッケージ内の samples を参照してください。

設定

コードジェネレータ設定 に移動してご確認ください。

リソース

Baomidou

© 2016-2025 Baomidou™. All Rights Reserved.

Power by Astro Starlight | Sponsored by JetBrains

渝ICP备2021000141号-1 | 渝公网安备50011302222097