赞
踩
此文档所述为mybatis-plus-generator 3.5.2版本,主要讲述Mybatis-Plus代码生成器的配置及使用。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
在项目工程resources/templates路径下新建以下几个模板,注意文件名要一致。
package ${package.Controller}; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.*; import com.github.common.utils.Response; import com.github.common.constant.CommonConstant; import com.github.common.utils.Query; import $!{package.Entity}.$!{entity}; import $!{package.Service}.$!{entity}Service; #if(${restControllerStyle}) import org.springframework.web.bind.annotation.RestController; #else import org.springframework.stereotype.Controller; #end #if(${superControllerClassPackage}) import ${superControllerClassPackage}; #end /** * <p> * $!{table.comment} 前端控制器 * </p> * * @author ${author} * @since ${date} */ #if(${restControllerStyle}) @RestController #else @Controller #end @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 @Autowired private $!{entity}Service $!{table.entityPath}Service; /** * 通过ID查询$!{table.comment} * * @param id ID * @return com.github.common.utils.Response */ @GetMapping("/{id}") public Response get(@PathVariable Long id) { if (id == null){ return Response.errorResponse("ID不能为空"); } return Response.success(this.$!{table.entityPath}Service.getById(id)); } /** * 分页查询$!{table.comment} * * @param params * @return com.github.common.utils.Response */ @RequestMapping("/page") public Response page(@RequestParam Map<String, Object> params, $!{entity} $!{table.entityPath}) { return Response.success(this.$!{table.entityPath}Service.page(new Query<$!{entity}>().getPage(params), new QueryWrapper<$!{entity}>() .eq(CommonConstant.IS_DELETE, CommonConstant.INT_STATUS_NORMAL))); } /** * 添加$!{table.comment} * @param $!{table.entityPath} 实体 * @return com.github.common.utils.Response<$!{entity}> */ @PostMapping("/add") public Response add(@RequestBody $!{entity} $!{table.entityPath}) { //TODO 添加数据校验 boolean res = this.$!{table.entityPath}Service.save($!{table.entityPath}); if (res){ return Response.successResponse("操作成功"); } return Response.errorResponse("操作失败"); } /** * 删除$!{table.comment} * @param id ID * @return com.github.common.utils.Response<$!{entity}> */ @DeleteMapping("/{id}") public Response delete(@PathVariable Long id) { if (id == null){ return Response.errorResponse("ID不能为空"); } $!{entity} $!{table.entityPath} = new $!{entity}(); $!{table.entityPath}.setId(id); $!{table.entityPath}.setUpdateTime(new Date()); $!{table.entityPath}.setIsDelete(CommonConstant.INT_STATUS_DEL); boolean res = this.$!{table.entityPath}Service.updateById($!{table.entityPath}); if (res){ return Response.successResponse("操作成功"); } return Response.errorResponse("操作失败"); } /** * 编辑$!{table.comment} * @param $!{table.entityPath} 实体 * @return com.github.common.utils.Response<$!{entity}> */ @PutMapping("/edit") public Response edit(@RequestBody $!{entity} $!{table.entityPath}) { if ($!{table.entityPath}.getId() == null){ return Response.errorResponse("ID不能为空"); } //TODO 添加数据校验 $!{table.entityPath}.setUpdateTime(new Date()); boolean res = this.$!{table.entityPath}Service.updateById($!{table.entityPath}); if (res){ return Response.successResponse("操作成功"); } return Response.errorResponse("操作失败"); } } #end
package ${package.Service}; import ${package.Entity}.${entity}; import ${superServiceClassPackage}; /** * <p> * $!{table.comment} 服务类 * </p> * * @author ${author} * @since ${date} */ #if(${kotlin}) interface ${table.serviceName} : ${superServiceClass}<${entity}> #else public interface ${table.serviceName} extends ${superServiceClass}<${entity}> { } #end
package ${package.ServiceImpl}; import ${package.Entity}.${entity}; import ${package.Mapper}.${table.mapperName}; import ${package.Service}.${table.serviceName}; import ${superServiceImplClassPackage}; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; /** * <p> * $!{table.comment} 服务实现类 * </p> * * @author ${author} * @since ${date} */ @Slf4j @Service #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} { } #end
package ${package.Entity}; #foreach($pkg in ${table.importPackages}) import ${pkg}; #end #if(${swagger}) import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; #end #if(${entityLombokModel}) import lombok.Data; #if(${chainModel}) import lombok.experimental.Accessors; #end #end /** * <p> * $!{table.comment} * </p> * * @author ${author} * @since ${date} */ #if(${entityLombokModel}) @Data #if(${chainModel}) @Accessors(chain = true) #end #end #if(${table.convert}) @TableName("${schemaName}${table.name}") #end #if(${swagger}) @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}> { #elseif(${entitySerialVersionUID}) public class ${entity} implements Serializable { #else public class ${entity} { #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(${swagger}) @ApiModelProperty("${field.comment}") #else /** * ${field.comment} */ #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(${field.versionField}) @Version #end ## 逻辑删除注解 #if(${field.logicDeleteField}) @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 public 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 }
package ${package.Mapper}; import ${package.Entity}.${entity}; import ${superMapperClassPackage}; #if(${mapperAnnotation}) ##import org.apache.ibatis.annotations.Mapper; #end /** * <p> * $!{table.comment} Mapper 接口 * </p> * * @author ${author} * @since ${date} */ #if(${mapperAnnotation}) ##@Mapper #end #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="${cacheClassName}"/> #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.columnName}, #end ${table.fieldNames} </sql> #end </mapper>
/** * Copyright (c) 2022-2030 XXX公司 All rights reserved. * <p> * 1414798079@qq.com * <p> * 版权所有,侵权必究! */ package com.github.modules.gen; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.generator.FastAutoGenerator; import com.baomidou.mybatisplus.generator.config.OutputFile; import com.baomidou.mybatisplus.generator.config.rules.DateType; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * <p> * Mybatis-Plus代码生成器 * </p> * * @author songfayuan * @date 2022/5/2 10:43 AM */ public class MybatisPlusGenerator { public static void main(String[] args) { //test为自定义的文件生成路径,根据业务进行变更 String path = "test"; //父包名,test为最终生成的包位置,替换成自己的即可 String parentPackage = "com.github.modules." + path; //mapper.xml生成位置,test变更为自己的即可 String mapperXmlPath = "/src/main/resources/mapper/" + path; //作者名字 String author = "songfayuan"; //数据库连接信息 String url = "jdbc:mysql://121.11.22.33:3306/hzt-dev?useUnicode=true&useSSL=false&characterEncoding=utf8"; String username = "demo"; String password = "demo1234..."; //表名集合 List<String> tables = new ArrayList<>(); tables.add("app_rent_seeking_info"); FastAutoGenerator.create(url, username, password) //全局配置 .globalConfig(builder -> { builder .fileOverride() //开启覆盖之前生成的文件 .disableOpenDir() //禁止打开输出目录 .outputDir(System.getProperty("user.dir") + "/src/main/java") //指定输出目录 .author(author) //作者名 // .enableSwagger() //开启 swagger 模式 .dateType(DateType.ONLY_DATE) //时间策略 .commentDate("yyyy-MM-dd HH:mm:ss"); //注释日期 }) //包配置 .packageConfig(builder -> { builder.parent(parentPackage) //父包名 .entity("entity") //Entity 包名 .service("service") //Service 包名 .serviceImpl("service.impl") //Service Impl 包名 .mapper("mapper") //Mapper 包名 .xml("mapper.xml") //Mapper XML 包名 .controller("controller") //Controller 包名 .other("config") //自定义文件包名 输出自定义文件时所用到的包名 .pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty("user.dir") + mapperXmlPath));//指定xml位置 }) //策略配置 .strategyConfig(builder -> { builder.addInclude(tables) // .addTablePrefix("app_")//表名前缀,配置后生成的代码不会有此前缀,建议表名的驼峰格式命名,方便寻找对应的文件资料 .serviceBuilder() .formatServiceFileName("%sService")//服务层接口名后缀 .formatServiceImplFileName("%sServiceImpl")//服务层实现类名后缀 .entityBuilder() .enableLombok()//实体类使用lombok,需要自己引入依赖 //.logicDeleteColumnName("status")//逻辑删除字段,使用delete方法删除数据时会将status设置为1。调用update方法时并不会将该字段放入修改字段中,而是在条件字段中 .enableTableFieldAnnotation()//加上字段注解@TableField .controllerBuilder() .formatFileName("%sController")//控制类名称后缀 .enableRestStyle() .mapperBuilder() .superClass(BaseMapper.class) .formatMapperFileName("%sMapper") .enableMapperAnnotation() .formatXmlFileName("%sMapper"); }) .execute(); } }
此文件为常量,按需取用。
/* * Copyright (c) 2018-2025, songfayuan All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the XX科技 developer nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * Author: songfayuan (1414798079@qq.com) */ package com.github.common.constant; /** * @author songfayuan * @date 2017/10/29 */ public interface CommonConstant { /** * token请求头名称 */ String REQ_HEADER = "Authorization"; /** * token分割符 */ String TOKEN_SPLIT = "Bearer "; /** * jwt签名 */ String SIGN_KEY = "PIG"; /** * 删除 */ String STATUS_DEL = "1"; /** * 删除 */ Integer INT_STATUS_DEL = 1; /** * 正常 */ String STATUS_NORMAL = "0"; /** * 正常 */ Integer INT_STATUS_NORMAL = 0; /** * 锁定 */ String STATUS_LOCK = "9"; /** * 菜单 */ String MENU = "0"; /** * 按钮 */ String BUTTON = "1"; /** * 删除标记 */ String DEL_FLAG = "del_flag"; /** * 是否删除标记(0否 1是) */ String IS_DELETE = "is_delete"; /** * 编码 */ String UTF8 = "UTF-8"; /** * JSON 资源 */ String CONTENT_TYPE = "application/json; charset=utf-8"; /** * 阿里大鱼 */ String ALIYUN_SMS = "aliyun_sms"; /** * 路由信息Redis保存的key */ String ROUTE_KEY = "_ROUTE_KEY"; /** * 数组符号 */ String ARRAY_SYMBOL = "[]"; }
此文件为返回数据统一封装类,按需取用。
/** * Copyright (c) 2022-2030 XXX All rights reserved. * <p> * 1414798079@qq.com * <p> * 版权所有,侵权必究! */ package com.github.common.utils; import lombok.Data; /** * 返回参数封装类 * * @author songfayuan */ @Data public class Response { protected int code; protected String msg; protected Object data; private static final int SUCCESS_CODE = 200; private static final String SUCCESS_MSG = "success"; private static final int ERROR_CODE = 500; private static final String ERROR_MSG = "服务器内部异常,请联系技术人员!"; public static Response success() { Response resp = new Response(); resp.code = (SUCCESS_CODE); resp.msg = (SUCCESS_MSG); return resp; } public static Response successResponse(String msg) { Response resp = new Response(); resp.code = SUCCESS_CODE; resp.msg = msg; return resp; } public static Response error() { Response resp = new Response(); resp.code = (ERROR_CODE); resp.msg = (ERROR_MSG); return resp; } public static Response errorResponse(String msg) { Response resp = new Response(); resp.code = ERROR_CODE; resp.msg = msg; return resp; } public static Response response(int code, String msg) { Response resp = new Response(); resp.code = (code); resp.msg = (msg); return resp; } public static Response response(int code, String msg, Object data) { Response resp = new Response(); resp.code = (code); resp.msg = (msg); resp.data = data; return resp; } public static Response success(Object data) { Response resp = new Response(); resp.code = (SUCCESS_CODE); resp.msg = (SUCCESS_MSG); resp.data = data; return resp; } public static Response error(Object data) { Response resp = new Response(); resp.code = (ERROR_CODE); resp.msg = (ERROR_MSG); resp.data = data; return resp; } }
Query
/** * Copyright (c) 2022-2030 AAAAA All rights reserved. * * 121212@qq.com * * 版权所有,侵权必究! */ package com.github.common.utils; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.common.xss.SQLFilter; import org.apache.commons.lang.StringUtils; import java.util.Map; /** * 查询参数 * * @author songfayuan */ public class Query<T> { public IPage<T> getPage(Map<String, Object> params) { return this.getPage(params, null, false); } public IPage<T> getPage(Map<String, Object> params, String defaultOrderField, boolean isAsc) { //分页参数 long curPage = 1; long limit = 10; if(params.get(Constant.PAGE) != null){ curPage = Long.parseLong((String)params.get(Constant.PAGE)); } if(params.get(Constant.LIMIT) != null){ limit = Long.parseLong((String)params.get(Constant.LIMIT)); } //分页对象 Page<T> page = new Page<>(curPage, limit); //分页参数 params.put(Constant.PAGE, page); //排序字段 //防止SQL注入(因为sidx、order是通过拼接SQL实现排序的,会有SQL注入风险) String orderField = SQLFilter.sqlInject((String)params.get(Constant.ORDER_FIELD)); String order = (String)params.get(Constant.ORDER); //前端字段排序 if(StringUtils.isNotEmpty(orderField) && StringUtils.isNotEmpty(order)){ if(Constant.ASC.equalsIgnoreCase(order)) { return page.addOrder(OrderItem.asc(orderField)); }else { return page.addOrder(OrderItem.desc(orderField)); } } //没有排序字段,则不排序 if(StringUtils.isBlank(defaultOrderField)){ return page; } //默认排序 if(isAsc) { page.addOrder(OrderItem.asc(defaultOrderField)); }else { page.addOrder(OrderItem.desc(defaultOrderField)); } return page; } }
以上配置完成以后,你就可以创建好MySQL数据库表,然后修改MybatisPlusGenerator类中的表名配置为你新建的表名,最后运行MybatisPlusGenerator类的main方法,生成带注释的代码了。
接下来就可以开始写业务逻辑了,THE END…
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。