- 基于springboot的基础上添加以下依赖
com.baomidou mybatis-plus-extension3.4.3 mysql mysql-connector-javacom.baomidou mybatis-plus-generator3.4.1 org.apache.velocity velocity-engine-core2.3 org.springframework.boot spring-boot-starterorg.springframework.boot spring-boot-starter-loggingorg.projectlombok lombokorg.springframework.boot spring-boot-starter-log4j2 - 添加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(); } } - 添加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 - 此时,已经可以运行Generator,实现domain和dao的生成
- 接下来实现创建时间和更新时间的自动填充(在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方法时,创建时间和更新时间会自动写入!!!



