この記事では、IDEA でデータベースに接続し、対応する POJO、Mapper、Service、Controller を生成するコードの書き方を主に紹介します。
序文
実際の開発では、データベースを設計した後、データベースのテーブルに対応するPOJOを作成することが避けられませんが、データベースのテーブルやフィールドに合わせてPOJOを一つ一つ作成するのは面倒なだけでなく、エラーも発生しやすくなります。
データベース テーブルに対応する POJO を生成するには 2 つの方法があります。
- IDEA : データベース プラグイン。データベースに接続した後、
数据库表右键->tools
いくつかの列操作が実行されて POJO が直接生成されます。 - コード生成: コードジェネレーター、データベースへの接続、パッケージ情報、テンプレート情報、戦略などの構成、コードを実行して POJO を生成するなど。
この記事では主に 2 番目の方法であるコード ジェネレーターについて説明します。
環境構築
以下の図に示すように、controller、mapper、model、service
コードは最終的に生成された結果であり、プロジェクトの全体的なフレームワークは次のとおりです。
pom.xml ファイルには依存関係が導入されています。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>spring-learn</artifactId>
<groupId>org.ym</groupId>
<version>1.0-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>learn-common-generate</artifactId>
<dependencies>
<!-- 日志相关配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
コード開発
基本構成
データベースとポリシーを構成する
package com.ym.learn.generate;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import javax.sql.DataSource;
import java.util.Arrays;
import static com.ym.learn.generate.CodeGenerateConstant.*;
/**
* @Author: Yangmiao
* @Date: 2023/5/29 20:18
* @Desc:
*/
public class CodeConfig {
/**
* 数据库配置
* @param databaseName
* @return
*/
public static DataSourceConfig getDataSource(String databaseName){
DataSourceConfig dsc = new DataSourceConfig();
dsc.setDbType(DbType.MYSQL);
dsc.setUrl("jdbc:mysql://localhost:3306/" + databaseName
+ "?serverTimezone=UTC&useUnicode=true&useSSL=false&characterEncoding=utf8");
dsc.setUsername(DB_USERNAME);
dsc.setPassword(DB_PASSWORD);
dsc.setDriverName(DB_DRIVER_CLASS_NAME);
return dsc;
}
/**
* 策略配置
* @param tableArrays 数据库表集合
* @param pc
* @return
*/
public static StrategyConfig getStrategyConfig(String []tableArrays, PackageConfig pc){
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
strategy.setInclude(tableArrays);
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix(pc.getModuleName() + "_");
// Boolean类型字段是否移除is前缀处理
strategy.setEntityBooleanColumnRemoveIsPrefix(true);
strategy.setRestControllerStyle(true);
// 自动填充字段配置
strategy.setTableFillList(Arrays.asList(
new TableFill("create_date", FieldFill.INSERT),
new TableFill("change_date", FieldFill.INSERT_UPDATE),
new TableFill("modify_date", FieldFill.UPDATE)
));
return strategy;
}
}
一定の情報
package com.ym.learn.generate;
/**
* @Author: Yangmiao
* @Date: 2023/5/29 20:02
* @Desc: 常量信息
*/
public class CodeGenerateConstant {
/**
* 数据库用户名
*/
public static final String DB_USERNAME = "root";
/**
* 数据库密码
*/
public static final String DB_PASSWORD = "123456";
/**
* 数据库驱动名称
*/
public static final String DB_DRIVER_CLASS_NAME = "com.mysql.cj.jdbc.Driver";
}
コード生成
データベースの基本情報、パッケージのパス情報、データベースのテーブル情報、ワンクリック操作、コードの更新、pojoの自動生成などを設定します。
package com.ym.learn.generate;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
/**
* @Author: Yangmiao
* @Date: 2023/5/29 19:59
* @Desc: 模板代码生成器
*/
public class CodeGenerate {
/**
* 数据库表
*/
private static final String[] TABLE_NAMES = new String[]{
"media_files"
};
public static void main(String[] args) {
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
// 选择 freemarker 引擎,默认 Velocity
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
// 全局配置
GlobalConfig gc = new GlobalConfig();
gc.setFileOverride(true);
//生成路径
gc.setOutputDir(System.getProperty("user.dir") + "/learn-common/learn-common-generate/src/main/java");
gc.setAuthor("yangmiao");
gc.setOpen(false);
gc.setSwagger2(false);
gc.setServiceName("%sService");
gc.setBaseResultMap(true);
gc.setBaseColumnList(true);
mpg.setGlobalConfig(gc);
DataSourceConfig dataSource = CodeConfig.getDataSource("learn-spring");
mpg.setDataSource(dataSource);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setModuleName("generate");
pc.setParent("com.ym.learn.generate");
pc.setServiceImpl("service.impl");
pc.setXml("mapper");
pc.setEntity("model.po");
mpg.setPackageInfo(pc);
// 设置模板
TemplateConfig tc = new TemplateConfig();
mpg.setTemplate(tc);
// 设置策略
StrategyConfig strategyConfig = CodeConfig.getStrategyConfig(TABLE_NAMES, pc);
mpg.setStrategy(strategyConfig);
mpg.execute();
}
}