コードジェネレータ
新しく生まれ変わった MyBatis-Plus コードジェネレータです。ビルダーパターンを使用して、素早く、かつエレガントに必要なコードを生成できます。以下のコードでその実力を見てみましょう。
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>
implementation 'com.baomidou:mybatis-plus-generator:3.5.14'
コードジェネレータはテンプレートエンジンを使用するため、お好みのテンプレートエンジンを各自導入してください。MyBatis-Plus Generator は以下のテンプレートエンジンをサポートしています:
- VelocityTemplateEngine(デフォルト)
- FreemarkerTemplateEngine
- BeetlTemplateEngine
- EnjoyTemplateEngine
その他のテンプレートエンジンを使用または適合させたい場合は、AbstractTemplateEngine
を継承し、他のテンプレートエンジンの実装を参考に独自実装することができます。
生成方式
コードジェネレータは現在、以下の2つの生成方式をサポートしています:
-
DefaultQuery (メタデータクエリ)
- 利点: 共通インターフェースに基づいてデータベースのメタデータ関連情報を読み取るため、データベースの互換性が高い。
- 欠点: データベースベンダーのドライバ実装に依存する。
- 備考: デフォルトの方式。一部の型処理が理想的でない場合がある。
-
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()) ) // その他の設定 ...
メタデータクエリには現在、以下の問題があります:
- NotLike 方式を使用した逆方向のテーブル生成をサポートしていない。
- テーブルコメントを読み取ることができない。解決方法:
- MySQL接続に
remarks=true&useInformationSchema=true
プロパティを追加 - Oracle接続に
remarks=true
またはremarksReporting=true
プロパティを追加(一部のドライババージョン) - SqlServer:ドライバがサポートしていない
- MySQL接続に
- 一部の PostgreSQL 型の処理が不十分(json、jsonb、uuid、xml、money 型など)。解決方法:
- カスタム型に変換し、カスタム TypeHandler で処理する。
- typeConvertHandler を拡張して処理する(3.5.3.3 以降で typeName の取得が追加された)。
- 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 メソッドにジェネレータコードを直接追加し、関連設定を行った後、直接実行するだけでコードを生成できます。
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();}
対話型生成
対話型生成は実行後、対応する内容の入力を促すプロンプトが表示され、設定入力が完了すると自動的に関連コードが生成されます。
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 を参照してください。
設定
コードジェネレータ設定 に移動してご確認ください。
リソース
- 👉 ソースコード:ソースコードの閲覧とコントリビューションを歓迎します。
- 👉 ビデオチュートリアル詳細:フォロー、いいね、コイン投げ、コメントをお待ちしています。