实体类生成器

发布时间 2023-06-14 17:41:15作者: 窃窃私语QAQ
public class PlusCodeGenerator {

    public static void main(String[] args) {

        String author = scanner("请输入作者名称?");
        String pkgName = scanner("请输入包名?");
        String tableName = scanner("请输入表名,多个英文逗号分隔?");
        String projectPath = System.getProperty("user.dir") + "/water-project-restful-api";
        //1、配置数据源
        FastAutoGenerator.create("jdbc:mysql://192.168.9.226:3306/water_project_dev?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8", "water_project_dev", "WaterProject@123*")
                //2、全局配置
                .globalConfig((scanner, builder) ->
                        builder.author(author)/*.author(scanner.apply("请输入作者名称?"))*/
                                .outputDir(projectPath +"/src/main/java")   //设置输出路径:项目的 java 目录下
                                .commentDate("yyyy-MM-dd hh:mm:ss")   //注释日期
                                .dateType(DateType.ONLY_DATE)   //定义生成的实体类中日期的类型 TIME_PACK=LocalDateTime;ONLY_DATE=Date;
                                .fileOverride()   //覆盖之前的文件
                                //.enableSwagger()   //开启 swagger 模式
                                .disableOpenDir()   //禁止打开输出目录,默认打开

                )
                //3、包配置
                .packageConfig((scanner, builder) -> builder.parent("com.fourfaith.iot.water")
                        //.moduleName("test")   //设置模块包名
                        .entity("pojo.entity."+ pkgName)   //pojo 实体类包名
                        .service("service."+ pkgName) //Service 包名
                        .serviceImpl("service."+ pkgName + ".impl") // ***ServiceImpl 包名
                        .mapper("mapper."+ pkgName)   //Mapper 包名
                        .controller("controller."+ pkgName) //Controller 包名
                        .other("utils") //自定义文件包名
                        .pathInfo(Collections.singletonMap(OutputFile.xml, projectPath +"/src/main/resources/mapper/"+pkgName))
                )
                //4、策略配置
                .strategyConfig((scanner, builder) -> builder.addInclude(getTables(tableName /*scanner.apply("请输入表名,多个英文逗号分隔?")*/))
                        .addTablePrefix("t_", "c_") // 设置过滤表前缀
                        //4.1、Mapper策略配置
                        .mapperBuilder()
                        .superClass(BaseMapper.class)   //设置父类
                        .formatMapperFileName("%sMapper")   //格式化 mapper 文件名称
                        .enableMapperAnnotation()       //开启 @Mapper 注解
                        .formatXmlFileName("%s") //格式化 Xml 文件名称

                        //4.2、service 策略配置
                        .serviceBuilder()
                        .superServiceClass(IService.class)
                        .superServiceImplClass(ServiceImpl.class)
                        .formatServiceFileName("%sService") //格式化 service 接口文件名称,%s进行匹配表名,如 UserService
                        .formatServiceImplFileName("%sServiceImpl") //格式化 service 实现类文件名称,%s进行匹配表名,如 UserServiceImpl

                        //4.3、实体类策略配置
                        .entityBuilder()
                        .enableLombok() //开启 Lombok
                        .disableSerialVersionUID()  //不实现 Serializable 接口,不生产 SerialVersionUID
                        //.logicDeleteColumnName("deleted")   //逻辑删除字段名
                        .naming(NamingStrategy.underline_to_camel)  //数据库表映射到实体的命名策略:下划线转驼峰命
                        .columnNaming(NamingStrategy.underline_to_camel)    //数据库表字段映射到实体的命名策略:下划线转驼峰命
                        /*.addTableFills(
                                new Column("create_time", FieldFill.INSERT),
                                new Column("modify_time", FieldFill.INSERT_UPDATE)
                        ) */  //添加表字段填充,"create_time"字段自动填充为插入时间,"modify_time"字段自动填充为插入修改时间
                        .enableTableFieldAnnotation()       // 开启生成实体时生成字段注解
                        .formatFileName("%sEntity")


                        //4.4、Controller策略配置
                        .controllerBuilder()
                        .formatFileName("%sController") //格式化 Controller 类文件名称,%s进行匹配表名,如 UserController
                        .enableRestStyle() //开启生成 @RestController 控制器
                        .enableHyphenStyle()//开启驼峰转连字符
                        .build()

                )

                //5、模板
                .templateEngine(new VelocityTemplateEngine())
                /*
                    .templateEngine(new FreemarkerTemplateEngine())
                    .templateEngine(new BeetlTemplateEngine())
                    */
                //6、执行
                .execute();
    }


    // 处理 all 情况
    protected static List<String> getTables(String tables) {
        return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
    }

    protected 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 (StringUtils.isNotBlank(ipt)) {
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "!");
    }
}