Mybatis-Plus的使用(二)—— 代码生成器

原文链接:橙子&栗子&世界——Mybatis-Plus的使用(二)—— 代码生成器

代码生成器的介绍

对于我来说,开发时最难受的时候除了有bug没有解决之外,就是做复制粘贴了。每次创建一个新的模块,都要重复的不断复制实体类的属性,然后在写上一次注释,再把代码中该继承的继承。用Mybatis-Plus的代码生成器AutoGenerator就可以省去这一部分的烦恼。它帮我直接把Entity、Mapper、Mapper XML、Service、Controller等文件预先生成好,也帮我把Entity对应的表做好了映射,也写好的注释,还有Service以及Mapper文件,也帮我把Mybatis-Plus需要用的父类继承好了。这样就省去我这一部分的开发工作。

代码生成器的依赖

除了一章节的Mybatis-Plus的核心依赖以外,还需要添加两个重要的依赖:

	<!--mybatisplus的代码生成器依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.1.2</version>
        </dependency>

以及

	<!--freemarker模板引擎-->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.28</version>
        </dependency>
  •  

代码生成工具类

AutoGenerator

代码生成器的主类,之后的各种配置都会添加到这个类里面,例如:

  • GlobalConfig(全局配置);
  • DataSourceConfig(数据源配置);
  • PackageConfig(包配置);
  • TemplateConfig(模板配置)
  • InjectionConfig(自定义配置);
  • StrategyConfig(策略配置(数据库表配置));
	AutoGenerator mpg = new AutoGenerator();// 代码生成器主类
  •  

GlobalConfig

全局配置,定义文件的输出目录,设置文件的@author信息等

        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");// 获取用户程序当前路径(项目根的路径)
        gc.setOutputDir(projectPath + "/src/main/java");// 生成文件的输出目录(默认值:D 盘根目录)
        gc.setAuthor("ck");// 开发人员(默认值:null)
        gc.setOpen(false);// 是否打开输出目录(默认值:null)
        gc.setFileOverride(true);// 是否覆盖已有文件(默认值:false)
        mpg.setGlobalConfig(gc);//把全局配置添加到代码生成器主类

DataSourceConfig

数据源配置,这个比较清晰了,数据库表映射实体类时需要配置数据库的连接信息。

        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://47.103.17.3:3306/lm_dev?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8");
        dsc.setSchemaName("public");// 数据库 schema name(例如 PostgreSQL 可指定为 public)
        dsc.setDbType(DbType.MYSQL);// 数据库类型
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");// 驱动名称
        dsc.setUsername("chenkang"); // 用户名
        dsc.setPassword("258963"); // 密码

类型转换 默认由 dbType 类型决定选择对应数据库内置实现。
实现 ITypeConvert 接口自定义数据库 字段类型 转换为自己需要的 java 类型,也可以直接重写自带的MySqlTypeConvert类的processTypeConvert方法,是一个道理

	dsc.setTypeConvert(new MySqlTypeConvert() {
            @Override
            public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
                return super.processTypeConvert(globalConfig, fieldType);
            }
        });
	mpg.setDataSource(dsc);//把数据源配置添加到代码生成器主类

PackageConfig

包配置,就是每个类最上面的package,比如:package com.ck.mybatisplus.foundation.service;这里包配置可以分别配置service、entity、controller等等

	PackageConfig pc = new PackageConfig();
        pc.setModuleName("foundation");// 父包模块名
        pc.setParent("com.ck.mybatisplus");// 父包名。如果为空,将下面子包名必须写全部, 否则就只需写子包名
        pc.setService("service");// Service包名
        pc.setEntity("entity");// Entity包名
        pc.setServiceImpl("service.impl");// ServiceImpl包名
        pc.setMapper("mapper");// Mapper包名
        pc.setController("controller");// Contoller包名
        // pc.setXml("mapper.xml");// Mapper.xml包名
        mpg.setPackageInfo(pc);// 把包配置添加到代码生成器主类

TemplateConfig

模板配置,配置模板,此模板配置默认生成mybatisplus自带模板的controller.java、service.java、serviceImpl.java、mapper.java、.xml、entity类的文件
若不想用默认的模板生成的文件,有两种方法:

  1. 一种是直接set自定义的模板路径,如下面的templateConfig.setController("/templates/MyController.java.ftl")
  2. 第二种是使用自定义配置(下面有讲解),前提是要先把默认值设为null,如templateConfig.setXml(null)。两种方法的共同点是都需要先有自定义的模板文件,

不同是第一种的文件生成路径是在前面的包配置固定了的,第二种是连文件生成的路径都是可以自定义的!

	TemplateConfig templateConfig = new TemplateConfig();
        templateConfig.setXml(null);
//        templateConfig.setController("/templates/MyController.java.ftl");
        mpg.setTemplate(templateConfig);// 把模板配置添加到代码生成器主类

InjectionConfig

自定义配置,前面也说了,只要有相应的模板文件,基本上能满足在项目中任何位置生成你想要的文件,比如.java、.xml、.jsp文件等,首先new出自定义配置的对象,如下

	InjectionConfig cfg = new InjectionConfig() {
            /**
             * 使用initMap是抽象方法,所以必须被重写,
             * 注入自定义 Map 对象(注意需要setMap放进去),该对象可以传递到模板引擎通过 cfg.xxx 引用
             */
            @Override
            public void initMap() {
                Map<String, Object> map = new HashMap<>();
                map.put("mapperId", "testMapperId");
                this.setMap(map);
            }
        };

然后配置模板的路径

.ftl表示是模板引擎是 freemarker,还有.vm表示模板引擎是 velocity等等

String templatePath = "/templates/mapper.xml.ftl";
  •  

再自定义输出配置,配置 FileOutConfig 指定模板文件、输出文件达到自定义文件生成目的,如果同时自定义两个或多个以上,可以直接focList.add多个new FileOutConfig(templatePath) {}配置

自定义配置会被优先输出

	List<FileOutConfig> focList = new ArrayList<>();
        focList.add(new FileOutConfig(templatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
                return projectPath + "/src/main/resources/mapper/" + pc.getModuleName()
                        + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });

自定义判断是否创建文件,该配置用于判断某个类是否需要覆盖创建,如果想覆盖之前已生成的文件,isCreate方法直接返回true,默认是false

一般情况可以不用配置这个,直接使用默认的不覆盖

	cfg.setFileCreate(new IFileCreate() {
            @Override
            public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {
                // 判断自定义文件夹是否需要创建,
//                checkDir("调用默认方法创建的目录");
                // 当然也可以自定义哪些文件可以被覆盖哪些不可以被覆盖,更新判断逻辑返回true或者false
                return false;
            }
        });
	cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);

StrategyConfig

数据库表配置,通过该配置,可指定需要生成哪些表或者排除哪些表等信息,

	StrategyConfig strategy = new StrategyConfig();
        // 数据库表映射到实体的命名策略:下划线转驼峰
        strategy.setNaming(NamingStrategy.underline_to_camel);
        // 数据库表字段映射到实体的命名策略, 未指定按照 naming 执行
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        // 自定义继承类全称,带包名 (以下为示例)
        strategy.setSuperEntityClass("com.baomidou.ant.common.BaseEntity");
        strategy.setSuperControllerClass("com.baomidou.ant.common.BaseController");
        strategy.setEntityLombokModel(true);// 【实体】是否为lombok模型(默认 false)
        strategy.setRestControllerStyle(true);// 生成 @RestController 控制器
        strategy.setSuperEntityColumns("id");// 写于父类中的公共字段
        strategy.setInclude("fnd_user");// 需要包含的表名,允许正则表达式(与exclude二选一配置)
        strategy.setExclude("m_fnd_user1");// 需要排除的表名,允许正则表达式
        strategy.setControllerMappingHyphenStyle(true);// 驼峰转连字符
        strategy.setEntityTableFieldAnnotationEnable(true);// 是否生成实体时,生成字段注解 默认false;
        strategy.setTablePrefix(pc.getModuleName() + "_");// 表前缀
        mpg.setStrategy(strategy);// 把策略配置添加到代码生成器主类

模板引擎

向代码生成器主类上配置模板引擎,这是是freemarker,mpg.execute()方法就是执行生成代码类。

	mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        mpg.execute();

以上内容来源于

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值