# 代码生成器

# 前言

在我们进行软件开发的时候,很多时候都只是单纯的增删查改,没有太大的技术含量但是却非常占据我们开发的时间,而且如果稍微一不注意,出现一个细小的bug就可能耽误一上午的时间,因此HOS就提供了一个代码生成器

# 执行代码生成器

找到hos-generator模块下的MysqlGenerator.java文件,运行main方法即可

img.png

java
    public static void main(String[] args) {
        // 代码生成器
        AutoGenerator generator = new AutoGenerator();
        setDataSource(generator);//数据库配置
        setPackageInfo(generator);//设置代码生成路径、包名(包路径)、模块名等路径信息
        setGlobalConfig(generator);//全局配置
        setStrategy(generator);//策略规则配置,如需要生成的表、排除生成的表、忽略字段、自定义父类等信息
        generator.setTemplateEngine(new FreemarkerTemplateEngine());
        generator.execute();
    }

代码生成器主要配置以下内容:

下面具体讲解每一块的配置方法

# 数据源配置(DataSource)

基础配置

方法 说明 示例
driverName 驱动名称 com.mysql.jdbc.Driver
url jdbc 路径 jdbc:mysql://127.0.0.1:3306/mybatis-plus
username 数据库账号 root
password 数据库密码 123456

可选

方法 说明 示例
schema(String) 数据库 schema(部分数据库适用) mybatis-plus
typeConvert(ITypeConvert) 自定义数据库表字段类型转换器,可以将数据库字段类型转换为自己需要的java 类型
new MySqlTypeConvert()

数据库表字段类型转换器 默认由 dbType 类型决定选择对应数据库内置实现,
可以通过实现 ITypeConvert 接口方式自定义转换器,当内置转换类型无法满足时可实现 IColumnType 接口自定义


    private static void setDataSource(AutoGenerator generator){
        generator.setDataSource(
                // 数据源配置
                new DataSourceConfig()
                        .setDbType(DbType.MYSQL)// 数据库类型
                        .setTypeConvert(new MySqlTypeConvert() {
                            // 自定义数据库表字段类型转换【可选】
                            @Override
                            public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
                                System.out.println("转换类型:" + fieldType);
                                // if ( fieldType.toLowerCase().contains( "tinyint" ) ) {
                                //    return DbColumnType.BOOLEAN;
                                // }
                                return super.processTypeConvert(globalConfig, fieldType);
                            }
                        })
                        .setDriverName("com.mysql.jdbc.Driver")
                        .setUsername("root")
                        .setPassword("xxxx")
                        .setUrl("jdbc:mysql://192.16.18.xxx:xxxxx/demo?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8")
        );
    }
    

# 包配置(PackageConfig)

方法 说明 示例
parent(String) 父包名 默认值:com.mediway.hos
moduleName(String) 父包模块名 默认值:无
entity(String) Entity 包名 默认值:model.entity
service(String) Service 包名 默认值:service
serviceImpl(String) Service Impl 包名 默认值:service.impl
mapper(String) Mapper 包名 默认值:mapper
xml(String) Mapper XML 包名 默认值:mapper
controller(String) Controller 包名 默认值:controller
pathInfo(Map<String, String>) 路径配置信息 ConstVal.ENTITY_PATH,projectPath + modelPath+ "/src/main/java/"
    private static void setPackageInfo(AutoGenerator generator){
        //需要修改的
        String modelPath = "/oa-business-parent/oa-user-model";
        String servicePath = "/oa-business-parent/oa-user-service";
        String webPath = "/oa-business-parent/oa-user-controller";


        String projectPath = System.getProperty("user.dir");
        Map<String, String> pathInfo = new HashMap<>();
        pathInfo.put(ConstVal.ENTITY_PATH,projectPath + modelPath+ "/src/main/java/" );
        pathInfo.put(ConstVal.MAPPER_PATH,projectPath + servicePath +"/src/main/java/");
        pathInfo.put(ConstVal.XML_PATH, projectPath + servicePath +"/src/main/resources/");
        pathInfo.put(ConstVal.SERVICE_PATH,projectPath + servicePath +"/src/main/java/");
        pathInfo.put(ConstVal.SERVICE_IMPL_PATH,projectPath + servicePath +"/src/main/java/" );
        pathInfo.put(ConstVal.CONTROLLER_PATH,projectPath+ webPath+  "/src/main/java/" );

        generator.setPackageInfo(
                new PackageConfig()
                        .setModuleName("user")//模块名
                        .setParent("com.mediway.hos")// 包路径
                        .setPathInfo(pathInfo)//entity、mapper、service、controller的位置信息
        );
    }

在示例中已经根据前文中工程结构将代码的生成路径配置到了相应的目录中,只需将 modelPathservicePathwebPath的路径更改为实际路径即可。

# 全局配置(GlobalConfig)

方法 说明 示例
fileOverride 覆盖已生成文件 默认值:false
author(String) 作者名 默认值:作者
swagger2 开启 swagger 模式 默认值:false
dateType(DateType) 时间策略 默认值: DateType.TIME_PACK
enableCache 是否在xml中添加二级缓存配置 默认值:false
baseResultMap 开启 BaseResultMap 默认值:false
baseColumnList 开启 baseColumnList 默认值:false
    /**
     * 全局配置
     * @param generator
     */
    private static void setGlobalConfig(AutoGenerator generator){
        generator.setGlobalConfig(
                // 全局配置
                new GlobalConfig()
                        .setFileOverride(true)// 是否覆盖文件
                        .setEnableCache(false)// XML 二级缓存
                        .setBaseResultMap(true)// XML ResultMap
                        .setBaseColumnList(true)// XML columList
                        .setAuthor("代码生成器")
                        .setSwagger2(true)
        );
    }

# 策略配置(StrategyConfig)

方法 说明 示例
enableCapitalMode 开启大写命名 默认值:false
enableSkipView 开启跳过视图 默认值:false
setInclude(String...) 增加表匹配(内存过滤) include 与 exclude 只能配置一项
setExclude(String...) 增加表排除匹配(内存过滤) include 与 exclude 只能配置一项
setTablePrefix(String...) 增加过滤表前缀
addFieldPrefix(String...) 增加过滤字段前缀
superEntityClass 自定义继承的Entity类全称,带包名
superMapperClass 自定义继承的Mapper类全称,带包名
superServiceClass 自定义继承的Service类全称,带包名
superServiceImplClass 自定义继承的ServiceImpl类全称,带包名
superControllerClass 自定义继承的Controller类全称,带包名
   /**
     * 策略规则配置
     * 需要生成的表、排除生成的表、忽略字段、自定义父类等信息
     * @param generator
     */
    private static void setStrategy(AutoGenerator generator){


        // 自定义需要填充的字段
//        List<TableFill> tableFillList = new ArrayList<>();
//        tableFillList.add(new TableFill("ASDD_SS", FieldFill.INSERT_UPDATE));

        generator.setStrategy(
                // 策略配置
                new StrategyConfig()
                        // .setCapitalMode(true)// 全局大写命名
                        // .setDbColumnUnderline(true)//全局下划线命名
                        .setTablePrefix(new String[]{"sys_", "mp_"})// 此处可以修改为您的表前缀
                        .setNaming(NamingStrategy.underline_to_camel)// 表名生成策略
//                .setColumnNaming(NamingStrategy.underline_to_camel)
                        .entityTableFieldAnnotationEnable(true)//是否强制带上注解
                        // .setInclude(new String[] { "user" }) // 需要生成的表
                        .setExclude(new String[]{"sys_oper_log","contract"}) // 排除生成的表

//                         公共字段、忽略字段(子实体类不生成)
                        .setSuperEntityColumns(new String[]{"id","create_time","update_time"})
//                        自定义需要填充的字段
//                        .setTableFillList(tableFillList)

                        // 自定义实体父类
                        .setSuperEntityClass("com.mediway.hos.database.model.BaseEntity")
                        // 自定义 service 父类
                        .setSuperServiceClass("com.mediway.hos.database.service.BaseService")
                        // 自定义 service 实现类父类
                        .setSuperServiceImplClass("com.mediway.hos.database.service.impl.BaseServiceImpl")
                        // 自定义 controller 父类
                        .setSuperControllerClass("com.mediway.hos.database.controller.BaseController")
                        //【实体】是否为lombok模型(默认 false)
                        .setEntityLombokModel(true)
                        .setRestControllerStyle(true)
        );
    }

# 自定义模块配置(Template)

 setTemplate(
        // 关闭默认 xml 生成,调整生成 至 根目录
        generator.setTemplate(new TemplateConfig().setXml(null)
        // 自定义模板配置,模板可以参考源码 /mybatis-plus/src/main/resources/template 使用 copy
        // 至您项目 src/main/resources/template 目录下,模板名称也可自定义如下配置:
        // .setController("...");
        // .setEntity("...");
        // .setMapper("...");
        // .setXml("...");
        // .setService("...");
        // .setServiceImpl("...");
        );