栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

关于MybatisPlus使用Generator自动生成代码的实现(包含创建时间和更新时间的自动填充)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

关于MybatisPlus使用Generator自动生成代码的实现(包含创建时间和更新时间的自动填充)

  1. 基于springboot的基础上添加以下依赖
    
                com.baomidou
                mybatis-plus-extension
                3.4.3
            
    
            
                mysql
                mysql-connector-java
            
    
            
                com.baomidou
                mybatis-plus-generator
                3.4.1
            
    
            
                org.apache.velocity
                velocity-engine-core
                2.3
            
    
            
                org.springframework.boot
                spring-boot-starter
                
                
                    
                        org.springframework.boot
                        spring-boot-starter-logging
                    
                
            
    
            
                org.projectlombok
                lombok
            
    
            
                org.springframework.boot
                spring-boot-starter-log4j2
            
    

  2. 添加Generator代码生成器配置如下(注:需要根据自己的环境完成配置)
    package com.companyname.db.generator;
    
    import com.baomidou.mybatisplus.annotation.FieldFill;
    import com.baomidou.mybatisplus.generator.AutoGenerator;
    import com.baomidou.mybatisplus.generator.InjectionConfig;
    import com.baomidou.mybatisplus.generator.config.*;
    import com.baomidou.mybatisplus.generator.config.po.TableFill;
    import com.baomidou.mybatisplus.generator.config.rules.FileType;
    import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
    
    import java.io.File;
    import java.util.ArrayList;
    import java.util.List;
    
    public class Generator {
    
        public static void main(String[] args) {
            // 代码生成器
            AutoGenerator mpg = new AutoGenerator();
            // 全局配置
            GlobalConfig gc = new GlobalConfig();
            String projectPath = System.getProperty("user.dir");
            gc.setOutputDir(projectPath + "/项目名/src/main/java");
            gc.setOpen(false);
            gc.setAuthor("");
            // gc.setSwagger2(true); 实体属性 Swagger2 注解
            mpg.setGlobalConfig(gc);
    
            // 数据源配置
            DataSourceConfig dsc = new DataSourceConfig();
            dsc.setUrl("jdbc:mysql://192.168.*.*:*
            cfg.setFileCreate((configBuilder, fileType, filePath) -> {
                //如果是Entity则直接返回true表示写文件
                if (fileType == FileType.ENTITY) {
                    return true;
                }
                //否则先判断文件是否存在
                File file = new File(filePath);
                boolean exist = file.exists();
                if (!exist) {
                    file.getParentFile().mkdirs();
                }
                //文件不存在或者全局配置的fileOverride为true才写文件
                return !exist || configBuilder.getGlobalConfig().isFileOverride();
            });
            cfg.setFileOutConfigList(focList);
            mpg.setCfg(cfg);
    
            // 自定义模板配置,可以 copy 源码 mybatis-plus/src/main/resources/templates 下面内容修改,
            // 放置自己项目的 src/main/resources/templates 目录下, 默认名称一下可以不配置,也可以自定义模板名称
            TemplateConfig tc = new TemplateConfig();
            tc.setService(null);
            tc.setServiceImpl(null);
            tc.setEntity("entity.java"); //domain
            tc.setMapper("mapper.java");
            tc.setController(null);
            tc.setXml(null);
    
            // 策略配置
            StrategyConfig strategy = new StrategyConfig();
            //设置命名规则(驼峰式)
            strategy.setNaming(NamingStrategy.underline_to_camel);
            //设置表列命名规则(驼峰式)
            strategy.setColumnNaming(NamingStrategy.underline_to_camel);
            //设置entity父类
    //        strategy.setSuperEntityClass(BaseEntity.class);
            //设置lombok(看个人习惯)
            strategy.setEntityLombokModel(true);
            //是否生成@Resetcontroller
            strategy.setRestControllerStyle(false);
    
            //为create_time和update_time字段添加自动填充注解
            List tableFillList=new ArrayList();
            tableFillList.add(new TableFill("create_time", FieldFill.INSERT));
            tableFillList.add(new TableFill("update_time",FieldFill.INSERT_UPDATE));
            strategy.setTableFillList(tableFillList);
            // 公共父类
            //strategy.setSuperControllerClass("你自己的父类控制器,没有就不用设置!");
            // 写于父类中的公共字段
    //        strategy.setSuperEntityColumns(new String[]{"id", "deleted", "create_time", "update_time"});
            //设置需要生成的表
            strategy.setInclude(new String[]{
                "tb_a",
                "tb_b",
                "tb_c",
                
            });
            strategy.setEntitySerialVersionUID(false);
            strategy.setEntityColumnConstant(false);
            //strategy.setControllerMappingHyphenStyle(true);
            //设置映射时,实体类与真实表名的头部忽略
            strategy.setTablePrefix("tb_");
            //是否生成表中字段的@TableField注解
            strategy.setEntityTableFieldAnnotationEnable(false);
            mpg.setStrategy(strategy);
            // 如上任何一个模块如果设置 空 OR Null 将不生成该模块。
            mpg.setTemplate(tc);
            // 执行生成
            mpg.execute();
        }
    }
    

  3. 添加domain和dao的模板(entity.java.vm和mapper.java.vm)到resources下

     entity.java.vm

    package ${package.Entity};
    
    #foreach($pkg in ${table.importPackages})
    import ${pkg};
    #end
    #if(${swagger2})
    import io.swagger.annotations.ApiModel;
    import io.swagger.annotations.ApiModelProperty;
    #end
    #if(${entityLombokModel})
    import lombok.Data;
    import lombok.EqualsAndHashCode;
        #if(${chainModel})
        import lombok.experimental.Accessors;
        #end
    #end
    
    
    #if(${entityLombokModel})
    @Data
      #if(${superEntityClass})
    @EqualsAndHashCode(callSuper = true)
      #else
    @EqualsAndHashCode(callSuper = false)
      #end
      #if(${chainModel})
    @Accessors(chain = true)
      #end
    #end
    #if(${table.convert})
    @TableName("${table.name}")
    #end
    #if(${swagger2})
    @ApiModel(value="${entity}对象", description="$!{table.comment}")
    #end
    #if(${superEntityClass})
    public class ${entity} extends ${superEntityClass}#if(${activeRecord})<${entity}>#end {
    #elseif(${activeRecord})
    public class ${entity} extends Model<${entity}> {
    #else
    public class ${entity} implements Serializable {
    #end
    
    #if(${entitySerialVersionUID})
        private static final long serialVersionUID = 1L;
    #end
    ## ----------  BEGIN 字段循环遍历  ----------
    #foreach($field in ${table.fields})
    
    #if(${field.keyFlag})
    #set($keyPropertyName=${field.propertyName})
    #end
    #if("$!field.comment" != "")
      #if(${swagger2})
        @ApiModelProperty(value = "${field.comment}")
      #else
        
      #end
    #end
    #if(${field.keyFlag})
    ## 主键
      #if(${field.keyIdentityFlag})
        @TableId(value = "`${field.annotationColumnName}`", type = IdType.AUTO)
      #elseif(!$null.isNull(${idType}) && "$!idType" != "")
        @TableId(value = "`${field.annotationColumnName}`", type = IdType.${idType})
      #elseif(${field.convert})
        @TableId("`${field.annotationColumnName}`")
      #end
    ## 普通字段
    #elseif(${field.fill})
    ## -----   存在字段填充设置   -----
      #if(${field.convert})
        @TableField(value = "`${field.annotationColumnName}`", fill = FieldFill.${field.fill})
      #else
        @TableField(fill = FieldFill.${field.fill})
      #end
    #elseif(${field.convert})
        @TableField("`${field.annotationColumnName}`")
    #end
    ## 乐观锁注解
    #if(${versionFieldName}==${field.name})
        @Version
    #end
    ## 逻辑删除注解
    #if(${logicDeleteFieldName}==${field.name})
        @TableLogic
    #end
        private ${field.propertyType} ${field.propertyName};
    #end
    ## ----------  END 字段循环遍历  ----------
    
    #if(!${entityLombokModel})
    #foreach($field in ${table.fields})
      #if(${field.propertyType.equals("boolean")})
        #set($getprefix="is")
      #else
        #set($getprefix="get")
      #end
    
        public ${field.propertyType} ${getprefix}${field.capitalName}() {
            return ${field.propertyName};
        }
    
      #if(${chainModel})
        public ${entity} set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
      #else
        public void set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
      #end
            this.${field.propertyName} = ${field.propertyName};
      #if(${chainModel})
            return this;
      #end
        }
    #end
    ## --foreach end---
    #end
    ## --end of #if(!${entityLombokModel})--
    
    #if(${entityColumnConstant})
      #foreach($field in ${table.fields})
        public static final String ${field.name.toUpperCase()} = "`${field.name}`";
    
      #end
    #end
    #if(${activeRecord})
        @Override
        protected Serializable pkVal() {
      #if(${keyPropertyName})
            return this.${keyPropertyName};
      #else
            return null;
      #end
        }
    
    #end
    #if(!${entityLombokModel})
        @Override
        public String toString() {
            return "${entity}{" +
      #foreach($field in ${table.fields})
        #if($!{foreach.index}==0)
            "${field.propertyName}=" + ${field.propertyName} +
        #else
            ", ${field.propertyName}=" + ${field.propertyName} +
        #end
      #end
            "}";
        }
    #end
    }
    

    mapper.java.vm

    package ${package.Mapper};
    
    import ${package.Entity}.${entity};
    import ${superMapperClassPackage};
    
    
    #if(${kotlin})
    interface ${table.mapperName} : ${superMapperClass}<${entity}>
    #else
    public interface ${table.mapperName} extends ${superMapperClass}<${entity}> {
    
    }
    #end
    
  4. 此时,已经可以运行Generator,实现domain和dao的生成
  5. 接下来实现创建时间和更新时间的自动填充(在config下创建MyMetaObjectHandler重写MetaObjectHandler中的insertFill和updateFill方法)
    package com.companyName.db.config;
     
    import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
    import org.apache.ibatis.reflection.MetaObject;
    import org.springframework.stereotype.Component;
     
    import java.util.Date;
     
    
    @Component
    public class MyMetaObjectHandler implements MetaObjectHandler {
     
     
        @Override
        public void insertFill(MetaObject metaObject) {
            this.setFieldValByName("createTime", System.currentTimeMillis()/1000, metaObject);
            this.setFieldValByName("updateTime", System.currentTimeMillis()/1000, metaObject);
    //        this.setFieldValByName("gmtModified", new Date(), metaObject);
    //        this.setFieldValByName("creatorId", new Long(111), metaObject);
    //        this.setFieldValByName("gmtCreat",new Date(), metaObject);
    //        this.setFieldValByName("availableFlag",true, metaObject);
          
     
        }
     
        @Override
        public void updateFill(MetaObject metaObject) {
            this.setFieldValByName("createTime", System.currentTimeMillis()/1000, metaObject);
            this.setFieldValByName("updateTime", System.currentTimeMillis()/1000, metaObject);
    //        this.setFieldValByName("gmtModified", new Date(), metaObject);
        }
    }

配置完成!!!接下来使用MybatisPlus的insert和update方法时,创建时间和更新时间会自动写入!!!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/866272.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号