mybatisPlus自动代码生成实例(超级简单使用)

每次新项目的开发,都避免不了建很多的dao层、service等等的文件夹,显得很是麻烦,在此推荐一种可快速生成entity、service、mapper、controller文件,以便节省我们的时间,减少加班。。。。。。

1.pom中导入以下三个包

<!-- 模板 velocity -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>

  

<!-- java工具类 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.5.18</version>
</dependency>

  

<!-- mybatis扩展插件包mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>2.3</version>
</dependency>

 

  

2.新建一个类AutoFile

package com.example.vueservice.controller;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.enums.FieldFill;
import com.baomidou.mybatisplus.generator.AutoGenerator;

import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DbType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.List;

public class AutoFile {

/**
* 测试 run 执行 注意:不生成service接口 注意:不生成service接口 注意:不生成service接口
* <p>
* 配置方法查看 {@link ConfigGenerator}
* </p>
*/
public static void main(String[] args) {
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
gc.setOutputDir("C://");//代码生成存放位置
gc.setFileOverride(true);
gc.setActiveRecord(false);
gc.setEnableCache(false);// XML 二级缓存
gc.setBaseResultMap(true);// XML ResultMap
gc.setBaseColumnList(false);// XML columList
gc.setOpen(true);
gc.setAuthor("小明");//此处填写代码生成人姓名
// 自定义文件命名,注意 %s 会自动填充表实体属性!
// gc.setMapperName("%sDao");
// gc.setXmlName("%sDao");
gc.setServiceImplName("%sService");
// gc.setServiceImplName("%sServiceDiy");
// gc.setControllerName("%sAction");
mpg.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setDbType(DbType.MYSQL);
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername("xxx");//数据库用户名
dsc.setPassword("xxx");//数据库密码
dsc.setUrl("jdbc:mysql://xxx:xxxx/xxx?characterEncoding=utf8&allowMultiQueries=true");//数据库连接地址
/*dsc.setTypeConvert(new SqlServerTypeConvert(){
// 自定义数据库表字段类型转换【可选】
@Override
public DbColumnType processTypeConvert(String fieldType) {
if (fieldType.contains("tinyint") ) {
return DbColumnType.BLOB;
}
// 注意!!processTypeConvert 存在默认类型转换,
//如果不是你要的效果请自定义返回、非如下直接返回。
return super.processTypeConvert(fieldType);
}
});*/
mpg.setDataSource(dsc);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
// strategy.setTablePrefix("sys_");// 此处可以修改为您的表前缀
strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略

/**
* 第一步
* 代码生成需要改动这里,将待生成的表名替换到下面
*
* 2017.11.2
*/
strategy.setInclude(new String[] { "t_user" }); // 需要生成的表
/**
* 第二步
* 去掉表名前缀
*
* 2017.11.2
*/
strategy.setTablePrefix(new String[] { "t_" });// 此处可以修改为您的表前缀
// strategy.setExclude(new String[]{"test"}); // 排除生成的表
// 自定义实体父类
strategy.setSuperEntityClass("com.mayi.test.base.BaseEntity");
// 自定义实体,公共字段
strategy.setSuperEntityColumns(
new String[] {});
// 自定义 mapper 父类
strategy.setSuperMapperClass("com.baomidou.mybatisplus.mapper.BaseMapper");
// 自定义 service 父类
strategy.setSuperServiceImplClass("com.mayi.test.base.BaseService");
// 自定义 controller 父类
strategy.setSuperControllerClass("com.mayi.test.base.BaseController");
//逻辑删除属性名称
strategy.setLogicDeleteFieldName("is_deleted");
List<TableFill> tableFillList= CollUtil.newArrayList();
TableFill fill=new TableFill("update_time", FieldFill.INSERT_UPDATE);
tableFillList.add(fill);

fill=new TableFill("create_time", FieldFill.INSERT);
tableFillList.add(fill);

strategy.setTableFillList(tableFillList);


// 自定义 service 实现类父类
//strategy.setSuperServiceImplClass("org.ibase4j.core.base.BaseService");
// 自定义 controller 父类
//strategy.setSuperControllerClass("org.ibase4j.core.base.AbstractController");
// 【实体】是否生成字段常量(默认 false)
// public static final String ID = "test_id";
// strategy.setEntityColumnConstant(true);
// 【实体】是否为构建者模型(默认 false)
// public User setName(String name) {this.name = name; return this;}
// strategy.setEntityBuliderModel(true);
mpg.setStrategy(strategy);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setParent("com.mayi.test");//此处填写包名
/**
* 第三步
* 按模块调整代码放置目录
*
* 2017.11.2
*/
pc.setEntity("sys.entity");
pc.setMapper("sys.dao");
pc.setXml("sys.dao.mappers");
pc.setServiceImpl("sys.service");
pc.setController("sys.web");
mpg.setPackageInfo(pc);
// 注入自定义配置,可以在 VM 中使用 cfg.abc 设置的值
/*InjectionConfig cfg = new InjectionConfig() {
public void initMap() {
Map<String, Object> map = new HashMap<String, Object>();
map.put("providerClass", "ISysProvider");
map.put("providerClassPackage", "org.ibase4j.provider.ISysProvider");
this.setMap(map);
}
};
mpg.setCfg(cfg);*/
// 自定义模板配置,可以 copy 源码 mybatis-plus/src/main/resources/template 下面内容修改,
// 放置自己项目的 src/main/resources/template 目录下, 默认名称一下可以不配置,也可以自定义模板名称
TemplateConfig tc = new TemplateConfig();
tc.setEntity("templates/entity.java.vm");
tc.setMapper("templates/mapper.java.vm");
tc.setXml("templates/mapper.xml.vm");
tc.setServiceImpl("templates/service.java.vm");
tc.setController("templates/controller.java.vm");
mpg.setTemplate(tc);
// 执行生成
mpg.execute();
System.out.println("代码生成完毕");
}
}

  

3.导入模板,模板可根据自己的需求修改,在此只提供基础

controller.java.vm

 

package ${package.Controller};

import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import xxx.entity.RestResultGenerator;//1,2,3,4,5,6导包类在博客文最下边
import xx.beanvalidator.AddGroup;//2
import xx.beanvalidator.EditGroup;//3
import xx.beanvalidator.PageGroup;//4
import xx.BaseQuery;//5
import xx.util.ValidateUtil;//6
import ${package.Entity}.${entity};
#if(${restControllerStyle})
import org.springframework.web.bind.annotation.RestController;
#else
import org.springframework.stereotype.Controller;
#end
#if(${superControllerClassPackage})
import ${superControllerClassPackage};
#end
import ${package.ServiceImpl}.${entity}Service;

import cn.hutool.core.util.StrUtil;

/**
* 
* @ClassName: ${table.controllerName}
* @Description: TODO(这里用一句话描述这个类的作用)
* @author ${author}
* @date ${date} 
*/
#if(${restControllerStyle})
@RestController
#else
@Controller
#end
@RequestMapping(value = "#if(${package.ModuleName})/${package.ModuleName}#end/#if(${controllerMappingHyphenStyle})${controllerMappingHyphen}#else${table.entityPath}#end")
#if(${superControllerClass})
public class ${table.controllerName} extends ${superControllerClass}<${entity}> {
#else
public class ${table.controllerName} {
#end
@Autowired
private ${entity}Service ${table.entityPath}Service;

@RequestMapping(method = RequestMethod.POST, value = "/add")
public void add(${entity} ${table.entityPath}, HttpServletRequest request,
HttpServletResponse response) {
beanValidator(${table.entityPath}, AddGroup.class);
${table.entityPath}Service.insert(${table.entityPath});
renderResult(response);
}

@RequestMapping(method = RequestMethod.POST, value = "/edit")
public void edit(${entity} ${table.entityPath}, HttpServletRequest request,
HttpServletResponse response) {
beanValidator(${table.entityPath}, EditGroup.class);
${table.entityPath}Service.updateById(${table.entityPath});
renderResult(response);
}

@RequestMapping(method = RequestMethod.POST, value = "/delete")
public void delete(HttpServletRequest request, HttpServletResponse response,
String ids) {
//ValidateUtil.isNotBlank(ids, "主键参数非法,操作失败,请检查");
List<String> idList = StrUtil.split(ids, ',');
${table.entityPath}Service.deleteBatchIds(idList);
renderResult(response);
}

@RequestMapping(method = RequestMethod.GET, value = "/detail")
public void detail(HttpServletRequest request, HttpServletResponse response,
String id) {
//ValidateUtil.isNotBlank(id, "主键参数非法,操作失败,请检查");
${entity} ${table.entityPath} = ${table.entityPath}Service.selectById(id);
renderResult(response, RestResultGenerator.success(${table.entityPath}));
}

@RequestMapping(method = RequestMethod.GET, value = "/queryList")
public void queryList(HttpServletRequest request, HttpServletResponse response) {
EntityWrapper<${entity}> wrapper = new EntityWrapper<${entity}>();
List<${entity}> list = ${table.entityPath}Service.selectList(wrapper);
renderResult(response, RestResultGenerator.success(list));
}

@RequestMapping(method = RequestMethod.GET, value = "/queryPageList")
public void queryPageList(HttpServletRequest request, HttpServletResponse response,
BaseQuery query) {
beanValidator(query, PageGroup.class);
EntityWrapper<${entity}> wrapper = new EntityWrapper<${entity}>();
Page<${entity}> pg = new Page<${entity}>(query.getPage(), query.getRows());
Page<${entity}> list = ${table.entityPath}Service.selectPage(pg, wrapper);
renderResult(response, RestResultGenerator.success(list));
}
}

 

  

 

entity.java.vm

 

package ${package.Entity};

import xxx.beanvalidator.EditGroup;//在博客最下边
import java.io.Serializable;
import com.baomidou.mybatisplus.annotations.TableId;
#foreach($pkg in ${table.importPackages})
import ${pkg};
#end
#if(${entityLombokModel})

import com.baomidou.mybatisplus.annotations.Version;

import lombok.Data;
import lombok.experimental.Accessors;
#end
import org.hibernate.validator.constraints.NotBlank;

/**
* 
* @ClassName: ${entity}
* @Description: TODO(这里用一句话描述这个类的作用)
* @author ${author}
* @date ${date} 
*/
#if(${entityLombokModel})
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
#end
#if(${table.convert})
@TableName("${table.name}")
#end
#if(${superEntityClass})
public class ${entity} extends ${superEntityClass} implements Serializable  {
#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.ID_WORKER)
   @NotBlank(message = "主键不能为空", groups={EditGroup.class})
#elseif(${field.convert})
    @TableId("${field.name}")
    @NotBlank(message = "主键不能为空", groups={EditGroup.class})
#else
    @TableId("${field.name}")
    @NotBlank(message = "主键不能为空", groups={EditGroup.class})
#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}")
#else
   @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(!${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
}

 

mapper.java.vm

package ${package.Mapper};

import ${package.Entity}.${entity};
import ${superMapperClassPackage};

public interface ${table.mapperName} extends ${superMapperClass}<${entity}> {

}

mapper.xml.vm

 

<?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})
   #if(${field.name} == ${field.propertyName})${field.name}#else${field.name} AS ${field.propertyName}#end,
#end
        ${table.fieldNames}
    </sql>

#end
</mapper>

 

service.java.vm

 

package ${package.ServiceImpl};

import ${package.Entity}.${entity};
import ${package.Mapper}.${table.mapperName};
import ${superServiceImplClassPackage};
import org.springframework.stereotype.Service;

 /**
* 
* @ClassName: ${entity}Service
* @Description: TODO(这里用一句话描述这个类的作用)
* @author ${author}
* @date ${date} 
*/
@Service
public class ${entity}Service extends ${superServiceImplClass}<${table.mapperName}, ${entity}> {
   
}

 

模板存放位置:

 

 

 

4.最后生成文件目录

 

 

======================================================补充代码=============================================================

/**
 * restful请求统一返回响应体生成工具
 *
 */
public class RestResultGenerator {

    private RestResultGenerator() {
    }

    public static <T> RestResult<T> success() {
        return success(null, "操作成功!");
    }

    public static <T> RestResult<T> success(T data) {
        return success(data, "操作成功!");
    }

    public static <T> RestResult<T> success(T data, String msg, boolean result) {
        return generator(result, data, msg, HttpCodeEnum.OK.value());
    }

    public static <T> RestResult<T> success(T data, String msg) {
        return generator(true, data, msg, HttpCodeEnum.OK.value());
    }

    public static <T> RestResult<T> success(T data, String msg, String ticket) {
        return generator(true, data, msg, ticket, HttpCodeEnum.OK.value());
    }

    public static <T> RestResult<T> success(T data, String msg, Integer httpCode) {
        return generator(true, data, msg, httpCode);
    }

    public static <T> RestResult<T> fail() {
        return fail(null, null);
    }

    public static <T> RestResult<T> fail(String msg) {
        return fail(null, msg);
    }

    public static <T> RestResult<T> fail(T data, String msg) {
        return generator(false, data, msg, HttpCodeEnum.SERVER_ERROR.value());
    }

    public static <T> RestResult<T> generator(boolean result, T data, String msg, Integer httpCode) {
        return generator(result, data, msg, null, httpCode);
    }

    public static <T> RestResult<T> generator(boolean result, T data, String msg, String ticket, Integer httpCode) {
        RestResult<T> restResult = new RestResult<T>();
        restResult.setResult(result);
        restResult.setData(data);
        restResult.setMsg(msg);
        restResult.setTicket(ticket);
        restResult.setHttpCode(httpCode);
        return restResult;
    }
}

  

public class RestResult<T> implements Serializable
{

    private static final long serialVersionUID = 5363887016344037411L;

    private boolean result;

    private T data;

    private Integer httpCode;

    private String msg;

    private String ticket;

    public RestResult()
    {

    }

    public RestResult(boolean result)
    {
        this.result = result;
    }

    public RestResult(String msg)
    {
        this.msg = msg;
    }

    public RestResult(String msg, boolean result)
    {
        this.msg = msg;
        this.result = result;
    }

    public String toJSONString()
    {
        return toJSONString("yyyy-MM-dd HH:mm:ss");
    }

    public String toJSONString(String dateFormat)
    {
        return JsonUtil.toJSONString(this, dateFormat);
    }

    public boolean isResult()
    {
        return result;
    }

    public void setResult(boolean result)
    {
        this.result = result;
    }

    public T getData()
    {
        return data;
    }

    public void setData(T data)
    {
        this.data = data;
    }

    public Integer getHttpCode()
    {
        return httpCode;
    }

    public void setHttpCode(Integer httpCode)
    {
        this.httpCode = httpCode;
    }

    public String getMsg()
    {
        return msg;
    }

    public void setMsg(String msg)
    {
        this.msg = msg;
    }

    public String getTicket()
    {
        return ticket;
    }

    public void setTicket(String ticket)
    {
        this.ticket = ticket;
    }

}

  

public enum HttpCodeEnum {
    /**
     * 200请求成功
     */
    OK(200, "请求成功"),
 
    /**
     * 500控制器出错
     */
    SERVER_ERROR(500, "服务器内部抛出错误"),


    private final Integer value;

    private final String desc;

    private HttpCodeEnum(Integer value, String desc) {
        this.value = value;
        this.desc = desc;
    }

    /**
     * Return the integer value of this status code.
     */
    public Integer value() {
        return this.value;
    }

    public String msg() {
        //return Resources.getMessage("HTTPCODE_" + this.value);
        return this.desc;
    }

    public String toString() {
        return this.value.toString();
    }
}

  

public interface AddGroup {

}

  

public interface EditGroup {

}

  

public interface PageGroup {

}

  

public class BaseQuery implements Serializable {
    private static final long serialVersionUID = -6893838165058397865L;

    private String fromDate;

    private String toDate;

    @Min(value = 1, message = "分页记录数不能为空" , groups = {PageGroup.class})
    private int rows;

    @Min(value = 1, message = "分页页码不能为空" , groups = {PageGroup.class})
    private int page;

   

    public String getFromDate() {
        return fromDate;
    }

    public void setFromDate(String fromDate) {
        this.fromDate = fromDate;
    }

    public String getToDate() {
        return toDate;
    }

    public void setToDate(String toDate) {
        this.toDate = toDate;
    }

    public int getRows() {
        return rows;
    }

    public void setRows(int rows) {
        this.rows = rows;
    }

    public int getPage() {
        return page;
    }

    public void setPage(int page) {
        this.page = page;
    }

    public void convertToLongTime() {
        if (StrUtil.isNotBlank(fromDate) && StrUtil.isNotBlank(toDate)) {
            this.fromDate = DateUtil.parse(fromDate, ConfigConsts.NORM_DATE_PATTERN).toDateStr() + " 00:00:00";
            this.toDate = DateUtil.parse(toDate, ConfigConsts.NORM_DATE_PATTERN).toDateStr() + " 23:59:59";
            ;
        }
    }
}

  

public interface ConfigConsts {
static final String NORM_DATE_PATTERN = "yyyy-MM-dd";
}

  

  

 

posted @ 2019-12-13 10:52  蚂蚁搬代码  阅读(13352)  评论(4编辑  收藏  举报