最近接受到一个任务,代码生成器的开发。当时自己有两种思路来实现,第一种:自己写个程序,通过java代码生成,第二种:寻找第三方插件来支持,引用他们的。当时自己开发了一个代码生成器程序,但是不够完善,不能全面满足需求,还是借鉴他人意见,网上查询资料,发现Mybatis-plus插件还是挺不错,分享给大家,不过本人才疏学浅,若有说的不对,还望大家指出来。
- Mybatis-plus官网,有兴趣的可以了解了解,学习学习的。
- 官网配置代码生成器的例子。
废话不多说,看看代码就懂了
@RunWith(SpringRunner.class) @SpringBootTest(classes = Application.class) @Data @Slf4j public class CodeGeneratorTwo { @Autowired private CodeTwoGeneratorConfig codeTwoGeneratorConfig; private final String path = "D:/Project/poi-code-creator"; @Test public void generateCode() throws IOException { String author = codeTwoGeneratorConfig.getAuthor(); String packagePath = codeTwoGeneratorConfig.getPackagePath(); String[] tables = codeTwoGeneratorConfig.getTables().split(","); //获取数据库连接 GlobalConfig config = new GlobalConfig(); String dbUrl = "你的数据库url链接"; DataSourceConfig dataSourceConfig = new DataSourceConfig(); dataSourceConfig.setDbType(DbType.POSTGRE_SQL) .setUrl(dbUrl) .setUsername("你的数据库用户名称") .setPassword("数据库用户账号") .setDriverName("org.postgresql.Driver") .setSchemaName("poit_cloud"); //类型转换 dataSourceConfig.setTypeConvert(new PostgreSqlTypeConvert() { @Override public PropertyInfo processTypeConvert(GlobalConfig globalConfig, String fieldType) { System.out.println("转换类型:" + fieldType); // 注意!!processTypeConvert 存在默认类型转换,如果不是你要的效果请自定义返回、非如下直接返回。 if (fieldType.contains("numeric")) { return DbColumnType.DOUBLE; } else { return super.processTypeConvert(globalConfig, fieldType); } } }); StrategyConfig strategyConfig = new StrategyConfig(); strategyConfig .setCapitalMode(true) .setLogicDeleteFieldName("rec_status") .setEntityLombokModel(false) .setNaming(NamingStrategy.underline_to_camel) // .setTablePrefix("eff_","ent_i_","ent_s_","ent_r_","eqp_i_","eqp_r_","eqp_s_","prod_i_","prod_r_","prod_s_","sys_i_") .setInclude(tables)//修改替换成你需要的表名,多个表名传数组 .setEntityLombokModel(true);//是否使用lombok config.setActiveRecord(true) .setAuthor(author) .setOutputDir("src/main/java") .setEnableCache(false) .setBaseColumnList(false) .setBaseColumnList(false) .setIdType(IdType.UUID)//主键类型 .setFileOverride(true) .setServiceName("%sService") .setSwagger2(true); //是否使用Swagger InjectionConfig ic = new InjectionConfig() { @Override public void initMap() { this.setMap(getMap()); } }; TemplateConfig tc = new TemplateConfig(); tc.setXml(null) .setServiceImpl(null) .setController("template/comtroller.java.vm") .setEntity("template/entity.java.vm") .setService("template/service.java.vm"); //添加add 请求对象 List<FileOutConfig> foc = new ArrayList<>(); foc.add(new FileOutConfig("/template/addVo.java.vm") { @Override public String outputFile(TableInfo tableInfo) { return path + "/src/main/java/com/poi/code/creator/vo/req/" + "Add" + tableInfo.getEntityName() + "Req" + StringPool.DOT_JAVA; } }); //添加update 请求对象 foc.add(new FileOutConfig("/template/updateVo.java.vm") { @Override public String outputFile(TableInfo tableInfo) { return path + "/src/main/java/com/poi/code/creator/vo/req/" + "Update" + tableInfo.getEntityName() + "Req" + StringPool.DOT_JAVA; } }); //添加list请求对象 foc.add(new FileOutConfig("/template/listVo.java.vm") { @Override public String outputFile(TableInfo tableInfo) { return path + "/src/main/java/com/poi/code/creator/vo/req/" + "List" + tableInfo.getEntityName() + "Req" + StringPool.DOT_JAVA; } }); //添加分页请求对象 foc.add(new FileOutConfig("/template/pageVo.java.vm") { @Override public String outputFile(TableInfo tableInfo) { return path + "/src/main/java/com/poi/code/creator/vo/req/" + "Page" + tableInfo.getEntityName() + "Req" + StringPool.DOT_JAVA; } }); ic.setFileOutConfigList(foc); new AutoGenerator() .setGlobalConfig(config) .setDataSource(dataSourceConfig) .setStrategy(strategyConfig) .setTemplate(tc) .setCfg(ic) .setPackageInfo( new PackageConfig() .setParent(packagePath) .setController("controller") .setEntity("entity") ).execute(); } }
controller的模板(controller.java.vm)内容如下:
package ${package.Controller}; import com.poi.code.creator.service.${table.serviceName} ; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RequestBody; import com.poi.code.creator.vo.base.ApiResp;; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import ${package.Service}.${table.serviceName}; import ${package.Entity}.${entity}; import com.poi.code.creator.vo.base.req.BaseReq; import com.poi.code.creator.vo.req.Add${entity}Req; import com.poi.code.creator.vo.req.Update${entity}Req; import com.poi.code.creator.vo.req.List${entity}Req; import com.poi.code.creator.vo.req.Page${entity}Req; /** * @author ${author} * @since ${date} */ @Api(description = "$!{table.comment}" ) @RestController @RequestMapping("/#if(${controllerMappingHyphenStyle})${controllerMappingHyphen}#else${table.entityPath}#end" ) @Slf4j public class ${table.controllerName} { @Autowired private ${table.serviceName} ${table.entityPath}Service; @ApiOperation("列表" ) @GetMapping("/list" ) public ApiResp list(List${entity}Req req) { try { return ${table.entityPath}Service.list(req); } catch (Exception e) { log.error("list error",e); return new ApiResp().code("500").message("系统繁忙,请稍后再试"); } } @ApiOperation("分页" ) @GetMapping("/page" ) public ApiResp page(Page${entity}Req req) { try { return ${table.entityPath}Service.page(req); } catch (Exception e) { log.error("page error",e); return new ApiResp().code("500").message("系统繁忙,请稍后再试"); } } @ApiOperation("获取详情" ) @GetMapping("/get" ) public ApiResp get(BaseReq req,#foreach($field in ${table.fields})#if(${field.keyFlag})@RequestParam("${field.propertyName}")${field.propertyType} ${field.propertyName}#end#end) { try { return ${table.entityPath}Service.get(#foreach($field in ${table.fields})#if(${field.keyFlag}) ${field.propertyName}#end#end); } catch (Exception e) { log.error("get error",e); return new ApiResp().code("500").message("系统繁忙,请稍后再试"); } } @ApiOperation("添加" ) @PostMapping("/add" ) public ApiResp add(@RequestBody Add${entity}Req req) { try { return ${table.entityPath}Service.add(req); } catch (Exception e) { log.error("add error",e); return new ApiResp().code("500").message("系统繁忙,请稍后再试"); } } @ApiOperation("修改" ) @PostMapping("/modify" ) public ApiResp modify(@RequestBody Update${entity}Req req) { try { return ${table.entityPath}Service.modify(req); } catch (Exception e) { log.error("modify error",e); return new ApiResp().code("500").message("系统繁忙,请稍后再试"); } } @ApiOperation("删除" ) @GetMapping("/delete" ) public ApiResp delete(BaseReq req,#foreach($field in ${table.fields})#if(${field.keyFlag})@RequestParam("${field.propertyName}")${field.propertyType} ${field.propertyName}#end#end) { try { return ${table.entityPath}Service.delete(#foreach($field in ${table.fields})#if(${field.keyFlag}) ${field.propertyName}#end#end); } catch (Exception e) { log.error("delete error",e); return new ApiResp().code("500").message("系统繁忙,请稍后再试"); } } }
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; #end import com.baomidou.mybatisplus.annotation.TableName; /** * <p> * ${entity}对象 * </p> * * @author ${author} * @since ${date} */ #if(${entityLombokModel}) @Data #end @TableName("${table.name}") #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 private static final long serialVersionUID = 1L; ## ---------- BEGIN 字段循环遍历 ---------- #foreach($field in ${table.fields}) #if(${field.keyFlag}) #set($keyPropertyName=${field.propertyName}) #end #if("$!field.comment" != "") #if(${swagger2}) @ApiModelProperty(value = "${field.comment}") #end #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(${logicDeleteFieldName}==${field.name}) @TableLogic #end private ${field.propertyType} ${field.propertyName}; #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($!{foreach.index}==0) "${field.propertyName}=" + ${field.propertyName} + #else ", ${field.propertyName}=" + ${field.propertyName} + #end #end "}"; } #end }
service.java.vm
package ${package.Service}; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.poi.code.creator.vo.base.ApiResp; import com.poi.code.creator.vo.base.req.BaseReq; import com.poi.code.creator.vo.req.Add${entity}Req; import com.poi.code.creator.vo.req.Update${entity}Req; import com.poi.code.creator.vo.req.List${entity}Req; import com.poi.code.creator.vo.req.Page${entity}Req; import ${package.Mapper}.${table.mapperName}; import ${package.Service}.${table.serviceName}; import ${package.Entity}.${entity}; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import java.util.List; import java.util.Date; import ${superServiceClassPackage}; /** * <p> * ${entity}服务类 * </p> * * @author ${author} * @since ${date} */ @Service public class ${table.serviceName} extends ${superServiceImplClass}<${table.mapperName}, ${entity}> { public ApiResp list(List${entity}Req req)throws Exception{ String keyword = req.getKeyword(); QueryWrapper<${entity}> queryWrapper = new QueryWrapper<>(); if (!StringUtils.isEmpty(keyword)) { queryWrapper.like("", req.getKeyword()); } return new ApiResp().data(baseMapper.selectList(queryWrapper)); } public ApiResp page(Page${entity}Req req)throws Exception{ String keyword = req.getKeyword(); IPage<${entity}> page = new Page<>(req.getPageNum(), req.getPageSize()); QueryWrapper<${entity}> queryWrapper = new QueryWrapper<>(); if (!StringUtils.isEmpty(keyword)) { queryWrapper.like("", keyword); } return new ApiResp().data(baseMapper.selectPage(page, queryWrapper)); } public ApiResp add(Add${entity}Req req)throws Exception{ ${entity} data = new ${entity}(); BeanUtils.copyProperties(req, data); #foreach($field in ${table.fields}) #if(${field.propertyName.equals("createTime")}) data.set${field.capitalName}(new Date()); #end #end baseMapper.insert(data); return new ApiResp().data(#foreach($field in ${table.fields})#if(${field.keyFlag})data.get${field.capitalName}()#end#end); } public ApiResp modify(Update${entity}Req req)throws Exception{ ${entity} data = new ${entity}(); BeanUtils.copyProperties(req, data); #foreach($field in ${table.fields}) #if(${field.propertyName.equals("updateTime")} || ${field.propertyName.equals("modifyTime")}) data.set${field.capitalName}(new Date()); #end #end baseMapper.updateById(data); return new ApiResp().data(Boolean.TRUE); } public ApiResp delete(#foreach($field in ${table.fields})#if(${field.keyFlag})${field.propertyType} ${field.propertyName}#end#end)throws Exception{ baseMapper.deleteById(#foreach($field in ${table.fields})#if(${field.keyFlag})${field.propertyName}#end#end); return new ApiResp().data(Boolean.TRUE); } public ApiResp get(#foreach($field in ${table.fields})#if(${field.keyFlag})${field.propertyType} ${field.propertyName}#end#end)throws Exception{ return new ApiResp().data(baseMapper.selectById(#foreach($field in ${table.fields})#if(${field.keyFlag})${field.propertyName}#end#end)); } }
接下来VO对象,请求对象,返回对象
package com.poi.code.creator.vo.req; #foreach($pkg in ${table.importPackages}) #end #if(${swagger2}) import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; #end #if(${entityLombokModel}) #end import lombok.Data; import java.io.Serializable; import java.util.Date; import com.poi.code.creator.vo.base.req.BaseReq; import io.swagger.annotations.ApiModel; /** * <p> * Add${entity}Req 请求对象 * </p> * * @author ${author} * @since ${date} */ @Data @ApiModel(value = "${entity}新增请求对象", description = "$!{table.comment}") public class Add${entity}Req extends BaseReq implements Serializable { private static final long serialVersionUID = 1L; #foreach($field in ${table.fields}) #if("$!field.comment" != "") #if(${swagger2} && !${field.propertyName.equals("recStatus")} &&!${field.propertyName.equals("updateTime")} &&!${field.propertyName.equals("createTime")} &&!${field.propertyName.equals("modifyTime")}&&!${field.keyFlag}) @ApiModelProperty(value = "${field.comment}") private ${field.propertyType} ${field.propertyName}; #end #end #end } package com.poi.code.creator.vo.req; #foreach($pkg in ${table.importPackages}) #end #if(${swagger2}) import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; #end #if(${entityLombokModel}) #end import lombok.Data; import java.io.Serializable; import java.util.Date; import com.poi.code.creator.vo.base.req.BaseReq; import io.swagger.annotations.ApiModel; /** * <p> * List${entity}Req对象 * </p> * * @author ${author} * @since ${date} */ @Data @ApiModel(value = "List${entity}列表请求对象", description = "$!{table.comment}") public class List${entity}Req extends BaseReq implements Serializable { @ApiModelProperty(value = "关键字查询", required = false) private String keyword; } package com.poi.code.creator.vo.req; #foreach($pkg in ${table.importPackages}) #end #if(${swagger2}) import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; #end #if(${entityLombokModel}) #end import lombok.Data; import java.io.Serializable; import java.util.Date; import com.poi.code.creator.vo.base.req.BaseReq; import io.swagger.annotations.ApiModel; /** * <p> * Update${entity}Req 请求对象 * </p> * * @author ${author} * @since ${date} */ @Data @ApiModel(value = "${entity}更新请求对象", description = "$!{table.comment}") public class Update${entity}Req extends BaseReq implements Serializable { private static final long serialVersionUID = 1L; #foreach($field in ${table.fields}) #if(${field.keyFlag}) @ApiModelProperty(value = "${field.comment}", required = true) private ${field.propertyType} ${field.propertyName}; #end #if("$!field.comment" != "") #if(${swagger2} && !${field.propertyName.equals("recStatus")} &&!${field.propertyName.equals("updateTime")} &&!${field.propertyName.equals("createTime")} &&!${field.propertyName.equals("modifyTime")}&&!${field.keyFlag}) @ApiModelProperty(value = "${field.comment}") private ${field.propertyType} ${field.propertyName}; #end #end #end } package com.poi.code.creator.vo.req; #foreach($pkg in ${table.importPackages}) #end #if(${swagger2}) import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; #end #if(${entityLombokModel}) #end import lombok.Data; import java.io.Serializable; import java.util.Date; import com.poi.code.creator.vo.base.req.BasePageReq; import io.swagger.annotations.ApiModel; /** * <p> * Page${entity}Req对象 * </p> * * @author ${author} * @since ${date} */ @Data @ApiModel(value = "List${entity}列表请求对象", description = "$!{table.comment}") public class Page${entity}Req extends BasePageReq implements Serializable { @ApiModelProperty(value = "关键字查询", required = false) private String keyword; }