mybatis-plus的代码生成器
MyBatis-Plus (簡稱 MP)是一個 MyBatis 的增強工具,在 MyBatis 的基礎上只做增強不做改變,為簡化開發、提高效率而生。
github地址:https://github.com/baomidou/mybatis-plus
今天主要介紹他的代碼生成功能。其實官方文檔已經寫得很清楚了,這里做了些簡單的封裝。官方代碼生成器文檔:https://mybatis.plus/guide/generator.html。
mybatis-plus-generator:根據數據源中的表,反向生成controller、entity、service和mapper。
項目是作為一個整個maven項目的一個模塊,結構如下:
首先是依賴,我用的是freemarker的模板,所以引入了org.freemarker,依賴如下:
<dependencies><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>${mybatis.plus.version}</version></dependency><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>${freemarker.version}</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency></dependencies>定義一個CodeGeneConfig類,里面是mybatis-plus-generator常用的配置屬性,還有一個CodeGeneProps類,對應屬性文件code.properties里面的key。分別如圖:
@Data public class CodeGeneConfig {private String geneModule;private String genePkgModule;private String genePkgParent;private String geneDsUrl;private String geneDsUsername;private String geneDsPassword;private String geneTableNames;private String geneTablePrefix;private String geneBaseEntity;private String geneBaseEntityFields;private String geneBaseController;private String geneEntityName;private String geneAuthor; } public interface CodeGeneProps {/*** 項目子模塊*/String GENE_MODULE = "gene.module";/*** 所在包*/String GENE_PKG_MODULE = "gene.pkg.module";/*** 所在包的父包*/String GENE_PKG_PARENT = "gene.pkg.parent";/*** 數據源url*/String GENE_DS_URL = "gene.ds.url";/*** 數據源賬號*/String GENE_DS_USERNAME = "gene.ds.username";/*** 數據源密碼*/String GENE_DS_PASSWORD = "gene.ds.password";/*** 全部表名,多個用逗號分隔*/String GENE_TABLE_NAMES = "gene.table.names";/*** 表前綴,生成@TableName注解里的表前綴*/String GENE_TABLE_PREFIX = "gene.table.prefix";/*** entity的父類*/String GENE_BASE_ENTITY = "gene.base.entity";/*** entity父類的字段,多個用逗號分隔*/String GENE_BASE_ENTITY_FIELDS = "gene.base.entity.fields";/*** controller的父類*/String GENE_BASE_CONTROLLER = "gene.base.controller";/*** entity的類名*/String GENE_ENTITY_NAME = "gene.entity.name";/*** 注釋中的author*/String GENE_AUTHOR = "gene.author"; } gene.module=easy-starter-app gene.pkg.module=system gene.pkg.parent=me.heysgene.ds.url=jdbc:mysql://192.168.41.130:3306/trade?useUnicode=true&characterEncoding=utf-8 gene.ds.username=root gene.ds.password=mysqlgene.table.names=t_user gene.table.prefix=t_gene.base.entity=me.heys.core.base.BaseEntity gene.base.entity.fields=id,create_user,create_time,update_time gene.base.controller=gene.entity.name=%sEntity gene.author=heys最后就是CodeGenerator類,基本上是依照官方文檔寫的。CodeGeneConfig配置優先,如果沒有配置,就讀取code.properties里面的配置:
@Slf4j public class CodeGenerator {private CodeGeneConfig config;public CodeGenerator(CodeGeneConfig config) {this.config = mergeProps(config);}private CodeGeneConfig mergeProps(CodeGeneConfig config) {if (null == config) {config = new CodeGeneConfig();}Properties props = new Properties();try {props.load(CodeGenerator.class.getClassLoader().getResourceAsStream("code.properties"));} catch (IOException e) {log.error("CodeGenerator讀取配置失敗", e);}if (StringUtil.isBlank(config.getGeneModule())) {config.setGeneModule(props.getProperty(CodeGeneProps.GENE_MODULE));}if (StringUtil.isBlank(config.getGenePkgModule())) {config.setGenePkgModule(props.getProperty(CodeGeneProps.GENE_PKG_MODULE));}if (StringUtil.isBlank(config.getGenePkgParent())) {config.setGenePkgParent(props.getProperty(CodeGeneProps.GENE_PKG_PARENT));}if (StringUtil.isBlank(config.getGeneDsUrl())) {config.setGeneDsUrl(props.getProperty(CodeGeneProps.GENE_DS_URL));}if (StringUtil.isBlank(config.getGeneDsUsername())) {config.setGeneDsUsername(props.getProperty(CodeGeneProps.GENE_DS_USERNAME));}if (StringUtil.isBlank(config.getGeneDsPassword())) {config.setGeneDsPassword(props.getProperty(CodeGeneProps.GENE_DS_PASSWORD));}if (StringUtil.isBlank(config.getGeneTableNames())) {config.setGeneTableNames(props.getProperty(CodeGeneProps.GENE_TABLE_NAMES));}if (StringUtil.isBlank(config.getGeneTablePrefix())) {config.setGeneTablePrefix(props.getProperty(CodeGeneProps.GENE_TABLE_PREFIX));}if (StringUtil.isBlank(config.getGeneBaseEntity())) {config.setGeneBaseEntity(props.getProperty(CodeGeneProps.GENE_BASE_ENTITY));}if (StringUtil.isBlank(config.getGeneBaseEntityFields())) {config.setGeneBaseEntityFields(props.getProperty(CodeGeneProps.GENE_BASE_ENTITY_FIELDS));}if (StringUtil.isBlank(config.getGeneBaseController())) {config.setGeneBaseController(props.getProperty(CodeGeneProps.GENE_BASE_CONTROLLER));}if (StringUtil.isBlank(config.getGeneEntityName())) {config.setGeneEntityName(props.getProperty(CodeGeneProps.GENE_ENTITY_NAME));}if (StringUtil.isBlank(config.getGeneAuthor())) {config.setGeneAuthor(props.getProperty(CodeGeneProps.GENE_AUTHOR));}return config;}public void execute() {// 代碼生成器AutoGenerator generator = new AutoGenerator();// 全局配置GlobalConfig globalConfig = new GlobalConfig();StringBuilder builder = new StringBuilder(System.getProperty("user.dir"));if (StringUtil.isNotBlank(config.getGeneModule())) {builder.append("/" + config.getGeneModule());}builder.append("/src/main/java");globalConfig.setEntityName(config.getGeneEntityName());globalConfig.setOutputDir(builder.toString());globalConfig.setAuthor(config.getGeneAuthor());globalConfig.setOpen(false);generator.setGlobalConfig(globalConfig);// 數據源配置DataSourceConfig dataSourceConfig = new DataSourceConfig();dataSourceConfig.setUrl(config.getGeneDsUrl());dataSourceConfig.setSchemaName("public");dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");dataSourceConfig.setUsername(config.getGeneDsUsername());dataSourceConfig.setPassword(config.getGeneDsPassword());generator.setDataSource(dataSourceConfig);// 包配置PackageConfig packageConfig = new PackageConfig();packageConfig.setModuleName(config.getGenePkgModule());packageConfig.setParent(config.getGenePkgParent());generator.setPackageInfo(packageConfig);// 模板配置TemplateConfig templateConfig = new TemplateConfig();templateConfig.setXml(null);generator.setTemplate(templateConfig);InjectionConfig injectionConfig = new InjectionConfig() {@Overridepublic void initMap() {Map<String, Object> map = new HashMap<>();// 用來作為類注釋的時間,模板中通過${cfg.datetime}獲取map.put("datetime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));this.setMap(map);}};generator.setCfg(injectionConfig);// 策略配置StrategyConfig strategy = new StrategyConfig();strategy.setNaming(NamingStrategy.underline_to_camel);strategy.setColumnNaming(NamingStrategy.underline_to_camel);if (StringUtil.isNotBlank(config.getGeneBaseEntity())) {strategy.setSuperEntityClass(config.getGeneBaseEntity());}strategy.setEntityLombokModel(true);strategy.setRestControllerStyle(true);if (StringUtil.isNotBlank(config.getGeneBaseController())) {strategy.setSuperControllerClass(config.getGeneBaseController());}strategy.setInclude(config.getGeneTableNames().split(","));String superFields = config.getGeneBaseEntityFields();if(StringUtil.isNotBlank(superFields)) {strategy.setSuperEntityColumns(superFields.split(","));}strategy.setControllerMappingHyphenStyle(true);strategy.setTablePrefix(config.getGeneTablePrefix());generator.setStrategy(strategy);generator.setTemplateEngine(new FreemarkerTemplateEngine());generator.execute();} }使用方式:
public class Generator {public static void main(String[] args) {CodeGeneConfig codeGeneConfig = new CodeGeneConfig();codeGeneConfig.setGeneModule("easy-starter-app");new CodeGenerator(codeGeneConfig).execute();} }mybatis-plus-generator的templates目錄下是模板,稍微修改了一下模板:修改了注釋、加了@Slf4j注解。
只需要把模板復制到自己代碼resources/templates目錄下,會自動讀取。
這個模塊可以打成一個jar包,在不同地方單獨使用。如下效果:
轉載于:https://www.cnblogs.com/ahhyong/p/10511566.html
總結
以上是生活随笔為你收集整理的mybatis-plus的代码生成器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 今日头条加密参数的识别
- 下一篇: 6D姿态估计从0单排——看论文的小鸡篇—