SpringBoot+MybatisPlus代码自动生成,MybatisPlus3.2.0版本代码生成器,mybatis-plus-generator代码生成器

前言

比较简单的代码生成方式(复制粘贴,改点配置即可)
本实例使用在springboot框架
mybatis-plus-generator 3.5.1 以下版本使用

实现

pom.xml引入依赖

数据库依赖根据自己连接数据库引入,这里不写

	<!--freemarker模板-->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-freemarker</artifactId>
	</dependency>
	<!-- mybatis-plus-generator依赖-->
	<dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-generator</artifactId>
        <version>3.2.0</version>
    </dependency>

java文件

package com.common;

import com.baomidou.mybatisplus.core.toolkit.StringPool;
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.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.ArrayList;
import java.util.List;

/**
 * mybatis-plus-generator代码生成器
 * 修改配置后直接运行main方法即可
 */
public class MyGenerator {

    /** 数据源配置*/
    private static final String jdbc = "jdbc:sqlserver://localhost:1433;databaseName=Test";
    private static final String driverName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
    private static final String username = "sa";
    private static final String password = "sa123456";
    /** 包名*/
    private static final String moduleName = "sys";
    /** 表名前缀*/
    private static final String beginName = "sys";
    /** 需要生成代码的表*/
    private static final String [] tables = new String[]{"sys_test"};




    public static void main(String[] args) {

        // 官方网站:https://baomidou.com/pages/d357af/#%E8%87%AA%E5%AE%9A%E4%B9%89%E5%B1%9E%E6%80%A7%E6%B3%A8%E5%85%A5

        // 参考网站:https://blog.csdn.net/kinghmj01/article/details/97748509

        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        // 当前项目路径
        String projectPath = System.getProperty("user.dir");
        // 当前项目的下的路径
        gc.setOutputDir(projectPath + "/src/main/java");
        // 作者
        gc.setAuthor("yyq");
        // 是否打开输出目录 默认为true
        gc.setOpen(false);
        // 实体属性 Swagger2 注解
        gc.setSwagger2(true);

        // 自定义文件命名,注意 %s 会自动填充表实体属性!
        gc.setControllerName("%sController");
        gc.setServiceName("%sService");
        gc.setServiceImplName("%sServiceImpl");
        gc.setMapperName("%sDao");
        gc.setEntityName("%sEntity");
        mpg.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        // dsc.setSchemaName("public");
        dsc.setUrl(jdbc);
        dsc.setDriverName(driverName);
        dsc.setUsername(username);
        dsc.setPassword(password);
        mpg.setDataSource(dsc);

        // 设置包名
        PackageConfig pc = new PackageConfig();
        // 用于包名、表名前缀
        //pc.setModuleName(moduleName);
        // 生成到那些包下 如 com.modules主包下的 controller.sys.TestController
        pc.setParent("com.modules");
        pc.setController("controller."+moduleName);
        pc.setService("service."+moduleName);
        pc.setServiceImpl("service."+moduleName+".impl");
        pc.setMapper("dao."+moduleName);
        pc.setEntity("entity."+moduleName);
        mpg.setPackageInfo(pc);

        // 自定义配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
            }
        };

        // 如果模板引擎是 freemarker
        String templatePath = "/templates/mapper.xml.ftl";
        // 如果模板引擎是 velocity
        // String templatePath = "/templates/mapper.xml.vm";

        // 自定义输出配置
        List<FileOutConfig> focList = new ArrayList<>();
        // 自定义配置会被优先输出
        focList.add(new FileOutConfig(templatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
                return projectPath + "/src/main/resources/mapper/" + moduleName + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });
        /*
        cfg.setFileCreate(new IFileCreate() {
            @Override
            public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {
                // 判断自定义文件夹是否需要创建
                checkDir("调用默认方法创建的目录,自定义目录用");
                if (fileType == FileType.MAPPER) {
                    // 已经生成 mapper 文件判断存在,不想重新生成返回 false
                    return !new File(filePath).exists();
                }
                // 允许生成模板文件
                return true;
            }
        });
        */
        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);

        // 配置模板
        TemplateConfig templateConfig = new TemplateConfig();

        // 配置自定义输出模板
        //指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
        // templateConfig.setEntity("templates/entity2.java");
        // templateConfig.setService();
        // templateConfig.setController();

        templateConfig.setXml(null);
        mpg.setTemplate(templateConfig);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();

        //需要生成的表
        strategy.setInclude(tables);
        strategy.setControllerMappingHyphenStyle(true);
        //类名生成策略:驼峰命名
        strategy.setNaming(NamingStrategy.underline_to_camel);
        //字段名生成方式:驼峰命名
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        // 表前缀
        strategy.setTablePrefix(beginName+"_");

        // 写于父类中的公共字段(在父类中已经有的不需要生成的字段)
        strategy.setSuperEntityColumns("oid", "del_flag", "create_id", "create_date", "update_id", "update_date");
        // 每层的继承(不需要可不设置)
        strategy.setSuperControllerClass("com.common.controller.MyController");
        strategy.setSuperServiceClass("com.baomidou.mybatisplus.extension.service.IService");
        strategy.setSuperServiceImplClass("com.baomidou.mybatisplus.extension.service.impl.ServiceImpl");
        strategy.setSuperMapperClass("com.baomidou.mybatisplus.core.mapper.BaseMapper");
        //继承的属性父类
        strategy.setSuperEntityClass("com.common.entity.MyEntity");
        strategy.setEntityLombokModel(true);
        strategy.setRestControllerStyle(true);

        mpg.setStrategy(strategy);

        mpg.setTemplateEngine(new FreemarkerTemplateEngine());

        mpg.execute();
    }



}

改完Java中相关配置后,直接运行main方法即可!

效果图
在这里插入图片描述
自定义说明(附加)

创建 .ftl 后缀文件(根据使用模板操作)
在这里插入图片描述
生成器配置自定义

	focList.add(new FileOutConfig("/templates/ftl/controller.java.ftl") {// templatePath
         @Override
         public String outputFile(TableInfo tableInfo) {
             return projectPath + "/src/main/java/com/modules/controller/" + moduleName + "/" + tableInfo.getControllerName() + StringPool.DOT_JAVA;
         }
     });

自定义提示

	// 自定义配置
    InjectionConfig cfg = new InjectionConfig() {
        @Override
        public void initMap() { // 自定义配置 ${dtoReq}
            Map<String, Object> map = new HashMap<>();
            map.put("dtoReq", pc.getParent()+".dto."+moduleName+".req");
            map.put("dtoResp", pc.getParent()+".dto."+moduleName+".resp");
            map.put("controllerUrl", moduleName);
            map.put("title", "测试管理");// 像这样的提示,根据这个在自定义中使用${cfg.title}
            map.put("entityMin", entityMin);
            this.setMap(map);
        }
    };

controller.java.ftl文件配置(可以参考这个写其他层的自定义)

package ${package.Controller};

import ${package.Entity}.${entity};
import ${package.Service}.${table.serviceName};
import com.common.controller.MyController;// 自定义controller层父级
import com.common.log.LogData; // 自定义日志管理器
import com.common.vo.Result; // 自定义返回json格式的对象

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Arrays;

/**
 * <p>
 * ${cfg.title} 控制器
 * </p>
 *
 * @author ${author}
 * @since ${date}
 */
@RestController
@RequestMapping(value="/${cfg.controllerUrl}/${cfg.entityMin}")
public class ${table.controllerName} extends MyController<${entity}>{

    @Autowired
    private ${table.serviceName} ${cfg.entityMin}Service;


    /**
     * 查询
     * @return
     */
    @GetMapping(value = "/select")
    public Result<?> select(${entity} entity){
        entity.setOid(entity.getOid() == null ? getUser().getLastOid() : entity.getOid());
        LambdaQueryWrapper<${entity}> wrapper = new LambdaQueryWrapper<>();
        wrapper.orderByDesc(${entity}::getCreateDate);
        IPage<${entity}> iPage = ${cfg.entityMin}Service.page(getPage(), wrapper);
        return Result.success(iPage.getRecords(), iPage.getTotal());
    }

    /**
     * 新增
     * @return
     */
    @LogData(module = "${cfg.title}", remarks = "新增")
    @RequestMapping("/add")
    public Result<?> add(${entity} entity){
        entity.setOid(entity.getOid() == null ? getUser().getLastOid() : entity.getOid());
        ${cfg.entityMin}Service.saveOrUpdate(entity);
        return Result.success(Result.ADD_MSG);
    }

    /**
     * 修改
     * @return
     */
    @LogData(module = "${cfg.title}", remarks = "修改")
    @RequestMapping("/edit")
    public Result<?> edit(${entity} entity){
        ${cfg.entityMin}Service.saveOrUpdate(entity);
        return Result.success(Result.UPDATE_MSG);
    }

    /**
     * 删除
     * @return
     */
    @LogData(module = "${cfg.title}", remarks = "删除单个")
    @RequestMapping("/delete")
    public Result<?> delete(String id){
        ${cfg.entityMin}Service.removeById(id);
        return Result.success();
    }

    /**
     * 批量删除
     * @return
     */
    @LogData(module = "${cfg.title}", remarks = "批量删除")
    @RequestMapping("/deleteBatch")
    public Result<?> deleteBatch(String ids){
        ${cfg.entityMin}Service.removeByIds(Arrays.asList(ids.split(",")));
        return Result.success();
    }
    


}

前端的大概如下,其他不多写了

var layer;
var form;
var table;
var upload;
var laydate;
var interUrl = {
		select: $projectPath+'/${cfg.controllerUrl}/${table.entityPath}/select',
		add: $projectPath+'/${cfg.controllerUrl}/${table.entityPath}/add',
		edit: $projectPath+'/${cfg.controllerUrl}/${table.entityPath}/edit',
		del: $projectPath+'/${cfg.controllerUrl}/${table.entityPath}/delete',
		delBatch: $projectPath+'/${cfg.controllerUrl}/${table.entityPath}/deleteBatch',
}
layui.use([ 'layer',  'form',  'table' ,  'laydate',  'upload' ],  function() {
	layer = layui.layer;
	form = layui.form;
	table = layui.table;
	upload = layui.upload;
	laydate = layui.laydate; 


	// 执行一个 table 实例=============================================================================================
	table.render({
		elem : '#data_table', 
		id : 'data_table', 
		url : interUrl.select, 
		title : '${cfg.title}',
		height:'full-120', 
		//size:"sm", 
		page : true, 
		toolbar : "#toolberLeft", 
		cols : [[ 
			{type : 'checkbox', fixed : 'left'},
			<#list table.fields as field>
				{field : '${field.comment}', title : '${field.propertyName}', width: '150', sort : true, align : 'center', hide: setColumnHide("${field.propertyName}")},
			</#list>
			{fixed : isRight(), align : 'center', width: '180', title : '操作', toolbar : '#toolRow'}
		]]
		,done:function(result,currPage,count){
	    }
	});
	
	// 头部左侧事件=============================================================================================
	table.on('toolbar(data_table)',  function(obj) {
		if (obj.event === 'search') {
			openWindowT('search_form', "条件搜索", '100%', '150px', false, 0, false, false, null, 0.2, true)
		}else if(obj.event === 'add'){
			openWindowRB('data_form', "添加", '700px', '100%', false, 0, false, false, null, 0.2, false);
		}else if(obj.event === 'delete'){
            deleteBatch(table, 'data_table', "id", interUrl.delBatch)
		}
	})
	
	// 行监听事件=============================================================================================
	table.on('tool(data_table)',  function(obj) {
		var data = obj.data;
		if (obj.event === 'del') {
			deleteRow(table, 'data_table', data, interUrl.del);
		} else if (obj.event === 'edit') {
			openWindowRB('data_form', "编辑", '700px', '100%', false, 0, false, false, data, 0.2, false);
		} else if (obj.event === 'detail') {
			openWindowRB('data_form', "查看", '700px', '100%', false, 0, false, false, data, 0.2, false);
		}
	});
	
	// 查询=============================================================================================
	form.on('submit(submitSearch)',  function(data) {
		reloadTable(table, 'data_table', data.field);
		return false;
	})
	
	// 提交=============================================================================================
	form.on('submit(submitForm)',  function(data) {
		saveData(table, 'data_table', data.field, interUrl.add, '#data_form');
		return false;
	})



})


/**
 * -----------------------------------------------------------------------------------------------------------------------------------------
 * 逻辑处理
 */
function operation() {

}


循环字段和判断可参考:https://www.bbsmax.com/A/KE5Qmbx35L/
此处跳转博客主要代码如下:

package ${package.Entity};
<#list table.importPackages as pkg>
import ${pkg};
</#list>
<#if swagger2>
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
</#if>
<#if entityLombokModel>
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
</#if>
/**
 * <p>
 * ${table.comment!}
 * </p>
 *
 * @author ${author}
 * @since ${date}
 */
<#if entityLombokModel>
@Data
    <#if superEntityClass??>
@EqualsAndHashCode(callSuper = true)
    <#else>
@EqualsAndHashCode(callSuper = false)
    </#if>
@Accessors(chain = true)
</#if>
<#if table.convert>
@TableName("${table.name}")
</#if>
<#if swagger2>
@ApiModel(value="${entity}对象", description="${table.comment!}")
</#if>
<#if superEntityClass??>
public class ${entity} extends ${superEntityClass}<#if activeRecord><${entity}></#if> {
<#elseif activeRecord>
public class ${entity} extends Model<${entity}> {
<#else>
public class ${entity} implements Serializable {
</#if>
    private static final long serialVersionUID = 1L;
<#-- ----------  BEGIN 字段循环遍历  ---------->
<#list table.fields as field>
    <#if field.keyFlag>
        <#assign keyPropertyName="${field.propertyName}"/>
    </#if>
    <#if field.comment!?length gt 0>
    <#if swagger2>
    @ApiModelProperty(value = "${field.comment}")
    <#else>
    /**
     * ${field.comment}
     */
    </#if>
    </#if>
    <#if field.keyFlag>
    <#-- 主键 -->
        <#if field.keyIdentityFlag>
    @TableId(value = "${field.name}", type = IdType.AUTO)
        <#elseif idType??>
    @TableId(value = "${field.name}", type = IdType.${idType})
        <#elseif field.convert>
    @TableId("${field.name}")
        </#if>
    <#-- 普通字段 -->
    <#elseif field.fill??>
    <#-- -----   存在字段填充设置   ----->
        <#if field.convert>
    @TableField(value = "${field.name}", fill = FieldFill.${field.fill})
        <#else>
    @TableField(fill = FieldFill.${field.fill})
        </#if>
    <#elseif field.convert>
    @TableField("${field.name}")
    </#if>
<#-- 乐观锁注解 -->
    <#if (versionFieldName!"") == field.name>
    @Version
    </#if>
<#-- 逻辑删除注解 -->
    <#if (logicDeleteFieldName!"") == field.name>
    @TableLogic
    </#if>
    private ${field.propertyType} ${field.propertyName};
<#-- 注释的枚举常量生成,例如字段内容为:`name_type` int(1) DEFAULT NULL COMMENT '名字类型{Girl:0,女孩;boy:1,男孩;other:2,其它}' -->
    <#if field.comment!?length gt 0>
        <#if field.comment?contains("{") && field.comment?contains("}") && field.comment?contains(";") && field.comment?contains(",") >
            <#assign object_str = field.comment?substring(field.comment?index_of("{")+1, field.comment?index_of("}"))/>
            <#list object_str?split(";") as comment_element>
                <#assign firstName = comment_element?substring(0, comment_element?index_of(":"))/>
                <#assign lastName = comment_element?substring(comment_element?index_of(":")+1, comment_element?index_of(","))/>
                <#assign meanName = comment_element?keep_after(",")/>
                <#assign fname = field.propertyName/>
    /**
    * ${field.propertyName}:${meanName}
    */
    public final static ${field.propertyType} ${(field.name)?upper_case}_${firstName?upper_case} = ${lastName};
            </#list>
        </#if>
    </#if>
</#list>
<#------------  END 字段循环遍历  ---------->
<#if !entityLombokModel>
    <#list table.fields as field>
        <#if field.propertyType == "boolean">
            <#assign getprefix="is"/>
        <#else>
            <#assign getprefix="get"/>
        </#if>
    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}) {
        </#if>
        this.${field.propertyName} = ${field.propertyName};
        <#if entityBuilderModel>
        return this;
        </#if>
    }
    </#list>
</#if>
<#if entityColumnConstant>
    <#list table.fields as field>
    public static final String ${field.name?upper_case} = "${field.name}";
    </#list>
</#if>
<#if activeRecord>
    @Override
    protected Serializable pkVal() {
    <#if keyPropertyName??>
        return this.${keyPropertyName};
    <#else>
        return null;
    </#if>
    }
</#if>
<#if !entityLombokModel>
    @Override
    public String toString() {
        return "${entity}{" +
    <#list table.fields as field>
        <#if field_index==0>
        "${field.propertyName}=" + ${field.propertyName} +
        <#else>
        ", ${field.propertyName}=" + ${field.propertyName} +
        </#if>
    </#list>
        "}";
    }
</#if>
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值