SpringBootをMyBatisPlusと組み合わせて、コードを自動的に生成します
もともと、この章ではRedis + AOP最適化権限を紹介したかったのですが、それでも最初にMyBatisPlus自動生成コードをいくつか紹介する必要があります。
MyBatisPlusの紹介
MyBatis-Plus(新しいウィンドウを開く)(略してMP)は、MyBatis(新しいウィンドウを開く)の拡張ツールです。MyBatisに基づいて、変更なしで拡張のみが行われます。開発を簡素化し、効率を向上させるために生まれました。
MyBatisPlusの機能
- 侵入なし:変更を加えずに拡張を行うだけで、その導入は既存のプロジェクトに影響を与えず、シルクのように滑らかです
- 低損失:基本的なCURDは起動時に自動的に注入され、パフォーマンスは基本的に損失なし、直接オブジェクト指向の操作
- 強力なCRUD操作:組み込みの一般的なマッパー、一般的なサービス、わずかな構成で単一のテーブルのほとんどのCRUD操作を実現でき、さまざまな使用要件を満たすためのより強力な条件ビルダー
- Lambdaフォーム呼び出しのサポート:Lambda式を使用すると、さまざまなクエリ条件を記述できるので便利です。間違ったフィールドを書き込むことを心配する必要はありません。
- 主キーの自動生成をサポート:最大4つの主キー戦略(分散一意IDジェネレーター-シーケンスを含む)をサポートします。これは、主キーの問題を完全に解決するように自由に構成できます。
- ActiveRecordモードのサポート:ActiveRecordフォーム呼び出しをサポートします。エンティティクラスは、強力なCRUD操作を実行するためにModelクラスを継承するだけで済みます。
- カスタムグローバル一般操作のサポート:グローバル一般メソッドインジェクションのサポート(1回書き込み、どこでも使用)
- 組み込みのコードジェネレーター:コードまたはMavenプラグインを使用して、マッパー、モデル、サービス、コントローラーレイヤーコード、サポートテンプレートエンジン、および使用するその他のカスタム構成をすばやく生成します
- 組み込みのページングプラグイン:MyBatisの物理ページングに基づいているため、開発者は特定の操作を気にする必要がありません。プラグインを構成した後、ページングを作成することは通常のリストクエリと同等です。
- ページングプラグインは複数のデータベースをサポートします:MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServerおよびその他のデータベースをサポートします
- 組み込みのパフォーマンス分析プラグイン:Sqlステートメントとその実行時間を出力できます。開発およびテスト中にこの機能を有効にして、遅いクエリをすばやく検出することをお勧めします。
- 組み込みのグローバルインターセプトプラグイン:完全なテーブルの削除と更新操作のインテリジェントな分析とブロックを提供し、インターセプトルールをカスタマイズして誤操作を防ぐこともできます
MyBatisPlusサポートデータベース
mybatisをcrudに使用でき、標準のsqlをサポートするデータベース
フレームワーク
MyBatisPlusコードジェネレーター
AutoGeneratorは、MyBatis-Plusのコードジェネレーターです。AutoGeneratorを使用すると、エンティティ、マッパー、マッパーXML、サービス、コントローラー、その他のモジュールのコードをすばやく生成でき、開発効率が大幅に向上します。
チュートリアルを使用する
コードジェネレータの依存関係を追加する
<!--lombok依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--集成druid连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<!--Mysql数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.10</version>
</dependency>
<!--MyBatis Plus 依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
<!--MyBatis Plus 代码生成器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.2</version>
</dependency>
<!--Hutool Java工具包-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.5.7</version>
</dependency>
<!--Velocity模板引擎-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.2</version>
</dependency>
<!--Swagger-UI API文档生产工具-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.7.0</version>
</dependency>
テンプレートエンジンの依存関係を追加する
MyBatis-Plusは、Velocity(デフォルト)、Freemarker、Beetlをサポートしており、ユーザーは使い慣れたテンプレートエンジンを選択できます。要件を満たしていない場合は、カスタムテンプレートエンジンを使用できます。この記事ではデフォルトの依存関係を使用しています
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.2</version>
</dependency>
構成の書き込み
MyBatis-Plusコードジェネレーターは、ユーザーが選択できる多数のカスタムパラメーターを提供し、ほとんどの人のニーズを満たすことができます。
GlobalConfigを構成する
グローバルポリシーglobalConfig構成
outputDir
- 生成されたファイルの出力ディレクトリ
- デフォルト値:D
ディスクルートディレクトリfileOverride - 既存のファイルを上書きするかどうか
- デフォルト値:false
open - 出力ディレクトリを開くかどうか
- デフォルト値:true
enableCache - xmlにセカンダリキャッシュ構成を追加するかどうか
- デフォルト値:false作成
者 - 開発者
- デフォルト値:null
kotlin - Kotlinモードをオンにします
- デフォルト値:false
swagger2 - swagger2モードを開く
- デフォルト値:false
activeRecord - ActiveRecordモードを有効にする
- デフォルト値:false
baseResultMap - BaseResultMapを開きます
- デフォルト値:false
baseColumnList - baseColumnListを開きます
- デフォルト値:false
dateType - 時間タイプ対応戦略
- デフォルト値:TIME_PACK
注:
次のように%sをプレースホルダーとして構成します
entityName
- エンティティの命名
- デフォルト値:null例:%sEntityはUserEntitymapperNameを生成し
ます - マッパーの命名方法
- デフォルト値:null例:%sDaoはUserDaoxmlNameを生成し
ます - Mapperxmlの命名方法
- デフォルト値:たとえば、ヌル:%SDAOはUserDao.xml生成
serviceNameをを - サービスの命名方法
- デフォルト値:null例:%sBusinessはUserBusinessserviceImplNameを生成し
ます - serviceimpl命名方法
- デフォルト値:たとえば、ヌル:%sBusinessImplはUserBusinessImpl生成する
コントローラ名を - コントローラの命名方法
- デフォルト値:null例:%sActionはUserActionidTypeを生成し
ます - 生成されたプライマリキーのIDタイプを指定します
- デフォルト値:null
/**
* 全局配置
* @param projectPath
* @return
*/
public static GlobalConfig initGlobal(String projectPath){
GlobalConfig gc = new GlobalConfig();
gc.setOutputDir(projectPath + "/src/main/java");
gc.setAuthor("zbb");
gc.setOpen(false);
gc.setSwagger2(true);
gc.setBaseResultMap(true);
gc.setFileOverride(true);
gc.setDateType(DateType.ONLY_DATE);
gc.setEntityName("%s");
gc.setMapperName("%sMapper");
gc.setXmlName("%sMapper");
gc.setServiceName("%sService");
gc.setServiceImplName("%sServiceImpl");
gc.setControllerName("%sController");
return gc;
}
DataSourceConfigを構成します
dbQuery
- データベース情報クエリ
- デフォルトは、dbTypeのタイプによって決定されます。対応するデータベースの組み込み実装を選択します。IDbQueryインターフェイスを実装します。データベースクエリをカスタマイズします。SQLステートメントをカスタマイズします。必要なコンテンツを返します
。dbType - データベースタイプ
- このクラスには、一般的に使用されるデータベースタイプが組み込まれています[必須]
schemaName - データベーススキーマ名
- たとえば、PostgreSQLはpublictypeConvertとして指定できます
- タイプ変換
- デフォルトはdbTypeタイプによって決定されます。対応するデータベース組み込み実装を選択してITypeConvertインターフェイスを実装します。カスタムデータベースフィールドタイプは必要なjavaタイプに変換されます。組み込み変換タイプはIColumnTypeインターフェイスカスタム
URLの実装を満たすことができません。 - ドライバ接続のURLdriverName
- ドライバー名ユーザー名
- データベース接続ユーザー名パスワード
- データベース接続パスワード
/**
*
* 配置 DataSourceConfig
* @return
*/
public static DataSourceConfig initDataSource(){
Props props = new Props("application.properties");
DataSourceConfig dataSourceConfig = new DataSourceConfig();
dataSourceConfig.setUrl(props.getStr("dataSource.url"));
dataSourceConfig.setDriverName(props.getStr("dataSource.driverName"));
dataSourceConfig.setUsername(props.getStr("dataSource.username"));
dataSourceConfig.setPassword(props.getStr("dataSource.password"));
return dataSourceConfig;
}
パッケージ構成パッケージ名構成
親
- 親パッケージ名。空の場合は、次のサブパッケージ名をすべて書き込む必要があります。それ以外の場合は、サブパッケージ名
moduleNameのみを記述してください。 - 親パッケージモジュール名
エンティティ - エンティティパッケージネーム
サービス - サービスパッケージ名
serviceImpl - ServiceImplパッケージ名
マッパー - マッパーパッケージ名
xml - マッパーXMLパッケージ名
コントローラー - コントローラパッケージ名
pathInfo - パス構成情報
/**
* 包配置
* @param packname
* @return
*/
public static PackageConfig initPackage(String packname){
Props props = new Props("application.properties");
PackageConfig packageConfig = new PackageConfig();
packageConfig.setModuleName(packname);
packageConfig.setParent(props.getStr("package.base"));
packageConfig.setEntity("model");
return packageConfig;
}
テンプレート構成TemplateConfig
エンティティ
- Javaエンティティクラステンプレート
entityKt - Kotinエンティティクラステンプレート
サービス - サービスクラステンプレート
serviceImpl - Serviceimpl実装クラステンプレート
マッパー - マッパーテンプレート
xml - マッパーxmlテンプレート
コントローラー - コントローラーコントローラーテンプレート
/**
* 模板配置
* @return
*/
public static TemplateConfig initTemplate() {
TemplateConfig templateConfig = new TemplateConfig();
//可以对controller、service、entity模板进行配置
templateConfig.setXml(null);
return templateConfig;
}
InjectionConfigへのカスタム属性インジェクション
地図
- カスタムリターン構成マップオブジェクト
- オブジェクトは、cfg.xxx参照
fileOutConfigListによってテンプレートエンジンに渡すことができます。 - カスタム出力ファイル
- カスタムファイル生成の目的を達成するためにテンプレートファイルと出力ファイルを指定するようにFileOutConfigを構成します
fileCreate - ファイルを作成するかどうかをカスタマイズする
- IFileCreateインターフェイスを実装する
この構成は、特定のクラスを上書きして作成する必要があるかどうかを判断するために使用されます。もちろん、差分アルゴリズムのマージファイルを自分で実装することもできます。
initMap
- カスタムMapオブジェクトを挿入します(setMapに配置する必要があることに注意してください)
/**
* 自定义属性注入
*/
public static InjectionConfig initInjection(String projectPath, String moduleName) {
// 自定义配置
InjectionConfig injectionConfig = new InjectionConfig() {
@Override
public void initMap() {
// 可用于自定义属性
}
};
// 模板引擎是Velocity
String templatePath = "/templates/mapper.xml.vm";
// 自定义输出配置
List<FileOutConfig> focList = new ArrayList<>();
// 自定义配置会被优先输出
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
return projectPath + "/src/main/resources/mapper/" + moduleName
+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
});
injectionConfig.setFileOutConfigList(focList);
return injectionConfig;
}
戦略構成StrategyConfig
/**
* 策略配置
*/
public static StrategyConfig initStrategy(String[] tableNames) {
StrategyConfig strategyConfig = new StrategyConfig();
strategyConfig.setNaming(NamingStrategy.underline_to_camel);
strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel);
strategyConfig.setEntityLombokModel(true);
strategyConfig.setRestControllerStyle(true);
//当表名中带*号时可以启用通配符模式
if (tableNames.length == 1 && tableNames[0].contains("*")) {
String[] likeStr = tableNames[0].split("_");
String likePrefix = likeStr[0] + "_";
strategyConfig.setLikeTable(new LikeTable(likePrefix));
} else {
strategyConfig.setInclude(tableNames);
}
return strategyConfig;
}
コードジェネレーター
public static void main(String[] args) {
String projectPath = System.getProperty("user.dir");
String moduleName = scanner("模块名");
String[] tableNames = scanner("表名,多个英文逗号分割").split(",");
// 代码生成器
AutoGenerator autoGenerator = new AutoGenerator();
autoGenerator.setGlobalConfig(initGlobal(projectPath));
autoGenerator.setDataSource(initDataSource());
autoGenerator.setPackageInfo(initPackage(moduleName));
autoGenerator.setCfg(initInjection(projectPath, moduleName));
autoGenerator.setTemplate(initTemplate());
autoGenerator.setStrategy(initStrategy(tableNames));
autoGenerator.setTemplateEngine(new VelocityTemplateEngine());
autoGenerator.execute();
}
コンソールコンテンツを読む
/**
* <p>
* 读取控制台内容
* </p>
*/
public static String scanner(String tip) {
Scanner scanner = new Scanner(System.in);
StringBuilder help = new StringBuilder();
help.append("请输入" + tip + ":");
System.out.println(help.toString());
if (scanner.hasNext()) {
String ipt = scanner.next();
if (StrUtil.isNotEmpty(ipt)) {
return ipt;
}
}
throw new MybatisPlusException("请输入正确的" + tip + "!");
}
application.propertiesを構成します
dataSource.url=jdbc:mysql://db:3306/mymes?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
dataSource.driverName=com.mysql.jdbc.Driver
dataSource.username=reader
dataSource.password=123456
package.base=com.springboot.mymes_demo.modules
コードを実行する
注:
入力時にxx_ *を入力して、接頭辞xxが付いたすべてのテーブルを示します。フルネームを入力すると、対応するテーブルが生成されます。
公共
公式アカウントhttps://mp.weixin.qq.com/s/nfat2WWWUXdmfUGFBAVEuA