maven 工程需要的
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.0.7.1</version> </dependency> <!-- velocity 模板引擎, 默认 --> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-engine-core</artifactId> <version>2.0</version> </dependency>
package com.example.springboottest1.generator; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.generator.AutoGenerator; import com.baomidou.mybatisplus.generator.config.ConstVal; import com.baomidou.mybatisplus.generator.config.DataSourceConfig; import com.baomidou.mybatisplus.generator.config.GlobalConfig; import com.baomidou.mybatisplus.generator.config.PackageConfig; import com.baomidou.mybatisplus.generator.config.StrategyConfig; import com.baomidou.mybatisplus.generator.config.TemplateConfig; import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert; import com.baomidou.mybatisplus.generator.config.rules.DateType; import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; public class MyGenerator { public static void main(String[] args) { AutoGenerator autoGenerator = new AutoGenerator(); // 设置数据库相关配置 DataSourceConfig dataSourceConfig = getDataSourceConfig(); autoGenerator.setDataSource(dataSourceConfig); // 设置全局配置 GlobalConfig globalConfig = getGlobalConfig(); autoGenerator.setGlobalConfig(globalConfig); // 数据库关键字冲突,自动处理 // 跟包相关的配置项 PackageConfig packageConfig = getPackageConfig(); autoGenerator.setPackageInfo(packageConfig); // 策略项配置 StrategyConfig strategyConfig = getStrategyConfig(); autoGenerator.setStrategy(strategyConfig); // 模板配置 TemplateConfig templateConfig = getTemplateConfig(); autoGenerator.execute(); } // 数据库相关配置 private static DataSourceConfig getDataSourceConfig() { DataSourceConfig dataSourceConfig = new DataSourceConfig(); // 数据库类型 dataSourceConfig.setDbType(DbType.MYSQL); // schemaname [public] dataSourceConfig.setSchemaName("public"); // 设置数据库字段类型转换类 dataSourceConfig.setTypeConvert(new MySqlTypeConvert()); // 驱动连接的URL dataSourceConfig.setUrl( "jdbc:mysql://localhost:3306/my_mysql_database?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC"); // 驱动名称 dataSourceConfig.setDriverName("com.mysql.jdbc.Driver"); // 数据库连接用户名 dataSourceConfig.setUsername("root"); // 密码 dataSourceConfig.setPassword("123456"); return dataSourceConfig; } // 全局配置 private static GlobalConfig getGlobalConfig() { GlobalConfig globalConfig = new GlobalConfig(); // 生成文件的输出目录 [默认为D://] globalConfig.setOutputDir("F:\\generators"); // 是否覆盖已有文件 [false] globalConfig.setFileOverride(true); // 是否打开输出目录 [true] globalConfig.setOpen(true); // 是否在xml中添加二级缓存配置 [true] globalConfig.setEnableCache(true); // 设置作者(在生成的注解中显示) [默认为空] globalConfig.setAuthor("Serenity"); // 开启kotlin模式 [false] globalConfig.setKotlin(false); // 开启ActiveRecord模式 [false] globalConfig.setActiveRecord(true); // 开启BaseResultMap [false] globalConfig.setBaseResultMap(true); // 开启baseColumnList [false] globalConfig.setBaseColumnList(true); // mapper命名格式 globalConfig.setMapperName("%sMapper"); // xml命名格式 globalConfig.setXmlName("%sMapper"); // service命名格式 globalConfig.setServiceName("%sService"); // serviceImpl命名格式 globalConfig.setServiceImplName("%sServiceImpl"); // controller命名格式 globalConfig.setControllerName("%sController"); // 主键ID类型 globalConfig.setIdType(IdType.AUTO); // 时间类型 globalConfig.setDateType(DateType.ONLY_DATE); return globalConfig; } // 跟包相关的配置项 private static PackageConfig getPackageConfig() { PackageConfig packageConfig = new PackageConfig(); // 父包名。如果为空,将下面子包名必须写全部, 否则就只需写子包名 packageConfig.setParent("com.qizhi.itfin"); // 父包模块名 packageConfig.setModuleName(""); // Entity包名 packageConfig.setEntity("entity"); // Service包名 packageConfig.setService("service"); // Service Impl包名 packageConfig.setServiceImpl("service.impl"); // mapper包名 packageConfig.setMapper("dao"); // mapper xml包名 packageConfig.setXml("dao.xml"); // controller包名 packageConfig.setController("controller"); return packageConfig; } // 策略配置项 private static StrategyConfig getStrategyConfig() { StrategyConfig strategyConfig = new StrategyConfig(); // 是否大写命名 strategyConfig.setCapitalMode(false); // 数据库表映射到实体的命名策略 [NamingStrategy.nochange] strategyConfig.setNaming(NamingStrategy.underline_to_camel); // 数据库表字段映射到实体的命名策略,未指定按照 naming 执行 strategyConfig.setColumnNaming(NamingStrategy.nochange); // 表前缀 strategyConfig.setTablePrefix(new String[] {}); // 字段前缀 strategyConfig.setFieldPrefix(new String[] {}); // 自定义继承的Entity类全称,带包名 // strategyConfig.setSuperEntityClass(); // 自定义基础的Entity类,公共字段 // strategyConfig.setSuperEntityColumns(); // 自定义继承的Mapper类全称,带包名 strategyConfig.setSuperMapperClass(ConstVal.SUPER_MAPPER_CLASS); // 自定义继承的Service类全称,带包名 strategyConfig.setSuperServiceClass(ConstVal.SUPER_SERVICE_CLASS); // 自定义继承的ServiceImpl类全称,带包名 strategyConfig.setSuperServiceImplClass(ConstVal.SUPER_SERVICE_IMPL_CLASS); // 自定义继承的Controller类全称,带包名 // strategyConfig.setSuperControllerClass(); // 需要包含的表名(与exclude二选一配置) [null] // strategyConfig.setInclude("my_user"); // 需要排除的表名 [null] // strategyConfig.setExclude(); // strategyConfig.setInclude("datasource_config"); // 是否生成字段常量(默认 false) strategyConfig.setEntityColumnConstant(false); // 是否为构建者模式 (默认false) 构建者模式:set方法返回this strategyConfig.setEntityBuilderModel(false); // 是否为lombok模型(默认false0 strategyConfig.setEntityLombokModel(true); // Boolean类型字段是否移除is前缀(默认 false) strategyConfig.setEntityBooleanColumnRemoveIsPrefix(false); // 设置Controller为RestController [false] strategyConfig.setRestControllerStyle(true); // mapping中驼峰转连字符 [false] strategyConfig.setControllerMappingHyphenStyle(false); // 是否生成实体时,生成字段注解 strategyConfig.setEntityTableFieldAnnotationEnable(false); // 乐观锁属性名称 // strategyConfig.setVersionFieldName(); // 逻辑删除属性名称 // strategyConfig.setLogicDeleteFieldName(); // 表填充字段 [null] strategyConfig.setTableFillList(null); return strategyConfig; } // 设置生成模板,如果不设置,则使用mybatisplus默认的模板,默认模板在mybatisplus的resources/templates文件夹下面 private static TemplateConfig getTemplateConfig() { TemplateConfig templateConfig = new TemplateConfig(); templateConfig.setController("templates/controller.java"); templateConfig.setService("templates/service.java"); templateConfig.setServiceImpl("templates/serviceImpl.java"); return templateConfig; } }
在resources 建立templates文件夹 文件夹内是需要的模版
package ${package.Controller}; import com.qizhi.itfin.common.util.PageUtils; import com.qizhi.itfin.common.util.R; import com.qizhi.itfin.entity.${table.entityName}; import com.qizhi.itfin.service.${table.serviceName}; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.plugins.Page; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import javax.validation.Valid; import java.util.HashMap; import java.util.Map; /** * $!{table.comment} 前端控制器 */ @Slf4j @RestController @RequestMapping("#if(${package.ModuleName})/${package.ModuleName}#end/#if(${controllerMappingHyphenStyle})${controllerMappingHyphen}#else${table.entityPath}#end") #if(${kotlin}) class ${table.controllerName}#if(${superControllerClass}) : ${superControllerClass}()#end #else #if(${superControllerClass}) public class ${table.controllerName} extends ${superControllerClass} { #else public class ${table.controllerName} { #end #set ($serviceImplName=$table.serviceName.substring(0,1).toLowerCase()+$table.serviceName.substring(1)) #set ($entityName=$table.entityName.substring(0,1).toLowerCase()+$table.entityName.substring(1)) @Autowired private ${table.serviceName} ${serviceImplName}; /** * 分页显示$!{table.comment} * * @param currentPage 当前页 * @param pageSize 每页大小 * @param sortFields 排序字段 * @param orderTypes asc/desc */ @RequestMapping("/page") public R page(Integer currentPage, Integer pageSize, String sortField, String orderType, ${table.entityName} ${entityName}) { Page<${table.entityName}> page = PageUtils.getPage(currentPage, pageSize, sortField, orderType); PageResult pageResult = odrProductFromService.page(page, ${entityName}); return R.ok().put("page", pageResult); } /** * 新增${table.comment} */ @RequestMapping("/save") public R save(${table.entityName} ${entityName}) { if(${serviceImplName}.save(${entityName})){ return R.ok(); }else { return R.error("添加失败!"); } } /** * 删除${table.comment} */ @RequestMapping("/delete") public R delete(Integer id) { if(${serviceImplName}.removeById(id)){ return R.ok(); }else { return R.error("删除失败!"); } } /** * 修改${table.comment} */ @RequestMapping("/update") public R update(${table.entityName} ${entityName}, BindingResult result) { if(${serviceImplName}.updateById(${entityName})){ return R.ok(); } else { return R.error("修改失败!"); } } /** * 查询${table.comment}信息 * * @param id id */ @RequestMapping("/info") public R info(Integer id) { ${table.entityName} ${entityName} = service.getById(id); return R.ok().put("data", ${entityName}); } }
#end
package ${package.Entity}; #foreach($pkg in ${table.importPackages}) import ${pkg}; #end #if(${entityLombokModel}) import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.activerecord.Model; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; #end /** * $!{table.comment} * * @author ${author} * @since ${date} */ #if(${entityLombokModel}) @Data #if(${superEntityClass}) @EqualsAndHashCode(callSuper = true) #else @EqualsAndHashCode(callSuper = false) #end @Accessors(chain = true) #end #if(${table.convert}) @TableName("${table.name}") #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 private static final long serialVersionUID = 1L; ## ---------- BEGIN 字段循环遍历 ---------- #foreach($field in ${table.fields}) #if(${field.keyFlag}) #set($keyPropertyName=${field.propertyName}) #end #if("$!field.comment" != "") /** * ${field.comment} */ #end #if(${field.keyFlag}) ## 主键 #if(${field.keyIdentityFlag}) @TableId(value = "${field.name}", type = IdType.AUTO) #elseif(!$null.isNull(${idType}) && "$!idType" != "") @TableId(value = "${field.name}", type = IdType.${idType}) #elseif(${field.convert}) @TableId("${field.name}") #end ## 普通字段 #elseif(${field.fill}) ## ----- 存在字段填充设置 ----- #if(${field.convert}) @TableField(value = "${field.name}", fill = FieldFill.${field.fill}) #else @TableField(fill = FieldFill.${field.fill}) #end #elseif(${field.convert}) @TableField("${field.name}") #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(${entityBuilderModel}) 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(${entityBuilderModel}) return this; #end } #end #end #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($!{velocityCount}==1) "${field.propertyName}=" + ${field.propertyName} + #else ", ${field.propertyName}=" + ${field.propertyName} + #end #end "}"; } #end }
package ${package.Entity} #foreach($pkg in ${table.importPackages}) import ${pkg} #end /** * $!{table.comment} * * @author ${author} * @since ${date} */ #if(${table.convert}) @TableName("${table.name}") #end #if(${superEntityClass}) class ${entity} : ${superEntityClass}#if(${activeRecord})<${entity}>#end() { #elseif(${activeRecord}) class ${entity} : Model<${entity}>() { #else class ${entity} : Serializable { #end ## ---------- BEGIN 字段循环遍历 ---------- #foreach($field in ${table.fields}) #if(${field.keyFlag}) #set($keyPropertyName=${field.propertyName}) #end #if("$!field.comment" != "") /** * ${field.comment} */ #end #if(${field.keyFlag}) ## 主键 #if(${field.keyIdentityFlag}) @TableId(value = "${field.name}", type = IdType.AUTO) #elseif(!$null.isNull(${idType}) && "$!idType" != "") @TableId(value = "${field.name}", type = IdType.${idType}) #elseif(${field.convert}) @TableId("${field.name}") #end ## 普通字段 #elseif(${field.fill}) ## ----- 存在字段填充设置 ----- #if(${field.convert}) @TableField(value = "${field.name}", fill = FieldFill.${field.fill}) #else @TableField(fill = FieldFill.${field.fill}) #end #elseif(${field.convert}) @TableField("${field.name}") #end ## 乐观锁注解 #if(${versionFieldName}==${field.name}) @Version #end ## 逻辑删除注解 #if(${logicDeleteFieldName}==${field.name}) @TableLogic #end #if(${field.propertyType}=="Integer") var ${field.propertyName}: Int? = null #else var ${field.propertyName}: ${field.propertyType}? = null #end #end ## ---------- END 字段循环遍历 ---------- #if(${entityColumnConstant}) companion object { #foreach($field in ${table.fields}) const val ${field.name.toUpperCase()} : String = "${field.name}" #end } #end #if(${activeRecord}) override fun pkVal(): Serializable? { #if(${keyPropertyName}) return ${keyPropertyName} #else return null #end } #end override fun toString(): String { return "${entity}{" + #foreach($field in ${table.fields}) #if($!{velocityCount}==1) "${field.propertyName}=" + ${field.propertyName} + #else ", ${field.propertyName}=" + ${field.propertyName} + #end #end "}" } }
#end
package ${package.Mapper}; import ${package.Entity}.${entity}; import ${superMapperClassPackage}; /** * $!{table.comment} Mapper 接口 * * @author ${author} * @since ${date} */ #if(${kotlin}) interface ${table.mapperName} : ${superMapperClass}<${entity}> #else public interface ${table.mapperName} extends ${superMapperClass}<${entity}> { }
#end
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="${package.Mapper}.${table.mapperName}"> #if(${enableCache}) <!-- 开启二级缓存 --> <cache type="org.mybatis.caches.ehcache.LoggingEhcache"/> #end #if(${baseResultMap}) <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="${package.Entity}.${entity}"> #foreach($field in ${table.fields}) #if(${field.keyFlag})##生成主键排在第一位 <id column="${field.name}" property="${field.propertyName}" /> #end #end #foreach($field in ${table.commonFields})##生成公共字段 <result column="${field.name}" property="${field.propertyName}" /> #end #foreach($field in ${table.fields}) #if(!${field.keyFlag})##生成普通字段 <result column="${field.name}" property="${field.propertyName}" /> #end #end </resultMap> #end #if(${baseColumnList}) <!-- 通用查询结果列 --> <sql id="Base_Column_List"> #foreach($field in ${table.commonFields}) ${field.name}, #end ${table.fieldNames} </sql> #end </mapper>
package ${package.Service}; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.qizhi.itfin.common.util.page.PageResult; import ${package.Entity}.${entity}; /** * $!{table.comment} 服务类 */ #set ($entityName=$entity.substring(0,1).toLowerCase()+$entity.substring(1)) #if(${kotlin}) interface ${table.serviceName} : ${superServiceClass}<${entity}> #else public interface ${table.serviceName} extends ${superServiceClass}<${entity}> { PageResult page(Page<${entity}> page, ${entity} ${entityName}); } #end
package ${package.ServiceImpl}; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import ${package.Entity}.${entity}; import ${package.Mapper}.${table.mapperName}; import ${package.Service}.${table.serviceName}; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.qizhi.itfin.common.util.page.PageResult; import com.qizhi.itfin.common.util.page.PageUtils; /** * $!{table.comment} 服务实现类 * * @author ${author} * @since ${date} */ @Service #set ($entityName=$entity.substring(0,1).toLowerCase()+$entity.substring(1)) #set ($mapperName=$table.mapperName.substring(0,1).toLowerCase()+$table.mapperName.substring(1)) #if(${kotlin}) open class ${table.serviceImplName} : ${superServiceImplClass}<${table.mapperName}, ${entity}>(), ${table.serviceName} { } #else public class ${table.serviceImplName} extends ${superServiceImplClass}<${table.mapperName}, ${entity}> implements ${table.serviceName} { @Autowired private ${table.mapperName} ${mapperName}; @Override public PageResult page(Page<${entity}> page, OdrProductFrom ${entityName}) { QueryWrapper<${entity}> queryWrapper = new QueryWrapper<>(${entityName}); PageResult pageResult = PageUtils.getPageResult(${mapperName}.selectPage(page, queryWrapper)); return pageResult; } } #end