mybatis generator (一) 之 builder 的使用

目录

一、简介 简洁的表达意图

1. 业务生成代码浅显易懂
2. 使用build()创建对象直观方便
3. 使用建造者模式降低耦合
4. 建造者互相帮扶,相互帮助

二、对简介中第4条的解释

1. 相互关联
2. builder被代理

三、环境配置

1. 依赖
2. 启动生成器

五、总结


一、简介

  • 每一处使用的地方都是简洁的表达意图, 得当的在该用的地方进行使用, 减少代码的冗余.
    1. 编写业务生成逻辑的代码的位置使用明显
    FastAutoGenerator.create().globalConfig(builder -> builder.....)...
    
    2. 使用build()创建对象直观方便。
    FastAutoGeneratorexecute() 方法, 该创建对象时使用build()直接生成,直观方便
    
    new AutoGenerator(this.dataSourceConfigBuilder.build())
            // 全局配置
            .global(this.globalConfigBuilder.build())
            // 包配置
            .packageInfo(this.packageConfigBuilder.build())
            // 策略配置
            .strategy(this.strategyConfigBuilder.build())
            // 注入配置
            .injection(this.injectionConfigBuilder.build())
            // 模板配置
            .template(this.templateConfigBuilder.build())
            // 执行
            .execute(this.templateEngine);
    
    3. 使用建造者模式 单一职责, 很清楚的结构
      public final class FastAutoGenerator {
          /**
           * 数据源配置 Builder
           */
          private final DataSourceConfig.Builder dataSourceConfigBuilder;
          /**
           * 全局配置 Builder
           */
          private final GlobalConfig.Builder globalConfigBuilder;
          /**
           * 包配置 Builder
           */
          private final PackageConfig.Builder packageConfigBuilder;
      	...
    }
    
    4. 互相帮扶,相互帮助。使用中StrategyConfig.BuilderStrategyConfig身体内的模板实体建造,
         使用entityBuilder构造entity, serviceBuilder构造service等还可以继续使用strategy体内的方法,
         如addInclude,都不耽误
         ★ 这部分内容需要手动模仿进行体会
    .strategyConfig(builder -> {
                      builder.addInclude("sy...on") // 1.★ 对strategy的属性设置
                      			 ...
                              //4.1、Mapper策略配置
                              .mapperBuilder( )
                              .superClass(BaseMapper.class)	// 2.★ 对mapper属性设置
                              ...
                              //4.2、service 策略配置
                              .serviceBuilder( )
                              .superServiceImplClass("com.ms...serviceImpl") // 3.★ 对service属性设置
                              ...
                              //4.3、实体类策略配置
                              .entityBuilder( )
                              .enableLombok( ) // 4.★ 对entity属性设置
                              ...
                              //4.4、Controller策略配置
                              .controllerBuilder( )
                              .formatFileName("%sController") // 5.★ 对controller属性设置
      						...
                  })
    

二、对简介中第4条的解释

  • 相互关联strategy.config中关联 了entityBuilder, serviceBuidler, 于此同时entityBuidler也要引用到strategyConfig, 在构造方法中如 new Entity.Buidler(this) 就能知道
    mybatis generator (一) 之 builder 的使用_第1张图片
  • builder被代理strategyConfig.Builder中使用的 entityBulder等又是通过strategyConfig获取的, 互相引用特别方便mybatis generator (一) 之 builder 的使用_第2张图片

三、环境配置

  • 依赖
    <dependency>
    	<groupId>com.baomidougroupId>
    	<artifactId>mybatis-plus-generatorartifactId>
    	<version>3.5.4.1version>
    dependency>
    <dependency>
      <groupId>com.baomidougroupId>
      <artifactId>mybatis-plus-boot-starterartifactId>
      <version>3.5.4.1version>
    dependency>
    
  • 启动生成器
    FastAutoGenerator.create("jdbc:postgres...e_system?Unicode=true&characterEncoding=utf8&useSSL=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai",
                        "root", "root")
                //2、全局配置
                .globalConfig(builder -> {
                    // 设置作者名
                    builder.author("lib")
                            //设置输出路径:项目的 java 目录下
                            .outputDir(System.getProperty("user.dir") + "/sy...java")
                            //注释日期
                            .commentDate("yyyy-MM-dd hh:mm:ss")
                            //定义生成的实体类中日期的类型 TIME_PACK=LocalDateTime;ONLY_DATE=Date
                            .dateType(DateType.ONLY_DATE)
                            //开启 swagger 模式
                            .enableSwagger( )
                            //禁止打开输出目录,默认打开
                            .disableOpenDir( );
                })
                //3、包配置
                .packageConfig(builder -> {
                    builder.parent("com...emimage") // 设置父包名
                            .moduleName("modules.system")   //设置模块包名
                            .entity("domain")   //pojo 实体类包名
                            .service("service") //Service 包名
                            .serviceImpl("service.impl") // ***ServiceImpl 包名
                            .mapper("mapper")   //Mapper 包名
                            .controller("controller"); //Controller 包名
                })
                //4、策略配置
                .strategyConfig(builder -> {
                    builder.addInclude("sys...ion") // 设置需要生成的数据表名
                            .addTablePrefix("t_", "c_") // 设置过滤表前缀
                            //4.1、Mapper策略配置
                            .mapperBuilder( )
                            .enableFileOverride() // 覆盖已生成文件
                            .superClass(BaseMapper.class)   //设置父类
                            .formatMapperFileName("%sMapper")   //格式化 mapper 文件名称
                            .enableMapperAnnotation( )       //开启 @Mapper 注解
                            //4.2、service 策略配置
                            .serviceBuilder( )
                            .superServiceImplClass("com...serviceImpl")
                            .superServiceClass("com...CommonService")
                            .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)    //数据库表字段映射到实体的命名策略:下划线转驼峰命
                            .enableFileOverride()
                            .addTableFills(
                                    new Column("create_time", FieldFill.INSERT),
                                    new Column("modify_time", FieldFill.INSERT_UPDATE)
                            )   //添加表字段填充,"create_time"字段自动填充为插入时间,"modify_time"字段自动填充为插入修改时间
                            .enableTableFieldAnnotation( )       // 开启生成实体时生成字段注解
                            //4.4、Controller策略配置
                            .controllerBuilder( )
                            .formatFileName("%sController") //格式化 Controller 类文件名称,%s进行匹配表名,如 UserController
                            .enableFileOverride() // 覆盖已生成文件
                            .enableRestStyle( );  //开启生成 @RestController 控制器
                })
                //6、执行
                .execute( );
    

五、总结

  • 建造者类均被设计在了被建造对象的内部类中单一职责建造负责的对象, 但StrategConfig.Buidler例外
  • 建造器重叠使用, 方便循环访问。
  • 对于于一看就懂一做就比较蒙的状态需要动手练习模仿。实践之后会有很多不一样的发现。

你可能感兴趣的:(mybatis,设计模式,java,spring,boot)