Mybatis-plus最新代码生成器(3.5.1+)的使用

Mybatis-plus最新代码生成器(3.5.1+)的使用快速上手

1.引入依赖:

 
    <dependency> <groupId>com.baomidou 
     groupId> <artifactId>mybatis-plus-boot-starter 
      artifactId> <version>3.4.3.4 
       version>  
        dependency>  
        <dependency> <groupId>com.baomidou 
         groupId> <artifactId>mybatis-plus-generator 
          artifactId> <version>3.5.1 
           version>  
            dependency>  
            <dependency> <groupId>org.apache.velocity 
             groupId> <artifactId>velocity-engine-core 
              artifactId> <version>2.3 
               version>  
                dependency>  
                <dependency> <groupId>org.freemarker 
                 groupId> <artifactId>freemarker 
                  artifactId>  
                   dependency>  
                   <dependency> <groupId>mysql 
                    groupId> <artifactId>mysql-connector-java 
                     artifactId> <scope>runtime 
                      scope>  
                       dependency> 

解释一下为什么要引两个模板依赖:

? 因为plus代码生成器需要一个模板引擎,velocity和freemarker任选一个,velocity是生成器中默认使用的,根据你的选择引依赖。

2.写一个构造器类

随便创建一个类:像启动类那样有个psvm能跑就行

public class PracticeApplication { 
    public static void main(String[] args) { 
    代码生成器。。。。; } } 

接下来就是写生成逻辑了,很简单,看官网:plus–代码生成器

image-20211006150757526

这是最新版的,整体的结构就是这样的,下面把我的代码生成器拿出来,并介绍一下分别有什么用(其实官网都有),完整代码放在最后:

1.全局配置(GlobalConfig)

image-20211006152120624

  • create方法需要传入,数据库地址(如果你的MySQL版本为8,必需要在数据库地址后面加上时区, 像serverTimezone=Asia/Shanghai这个)、用户名、密码;它会在后台根据这三个参数自动构建DataSourceConfig,而不需要我们自己写了,如图:

    image-20211006152458545

  • 最新版的生成器使用了lambda表达式,反应式编程,点点点就行了。写起来非常方便
  • author指定作者
  • outputDir,指定生成的文件往哪输出
  • enableSwagger,支持swagge(非常nice,记得引swagger依赖)
  • commentDate 时间格式
  • fileOveride 覆盖之前生成的文件

    globalConfig的效果如图:

    image-20211006153239162

2. 包配置(PackageConfig)

image-20211006153717464

这个就是配置生成哪些包:

注意:配置xml的包的方法,官网是叫mapperXml,而实际代码中的方法叫xml()

image-20211006155444599

3. 策略配置(StrategyConfig)

image-20211006155301030

addInclude()就是指定为哪些表生成代码,有几个重载:

  • ​ 一个String的表名
  • 任意多个表名(可变长参数):“user”, “user1”,…这样
  • 列表list

所谓策略配置,就是配置策略,配置细节

它是将service、mapper、controller、entity都放到了策略配置里面,以前的版本是在全局配置中

还有个注入配置,貌似不常用。。。。。

代码的最后:

.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板 .execute(); 

可以指定模板引擎,

execute()执行代码生成器,生成代码

根据实际情况配置不同选项,按照上面的来就很容易完成。建议还是看官网plus–代码生成器

效果图:

image-20211006161958575

  1. service实现类的路径规范;
  2. 代码生成器3.5.2后,xml的位置配置由OutputFile.mapperXml变为OutputFile.xml,但本文使用的3.5.1,所以下面代码并未改动
  3. 很多同学反映实体类lombok的注解是@Setter和@Getter,而不是@Data。今天更新了,这个需要我们自定义模板。代码生成器的jar下的templates下有不同引擎的模板文件,我们使用的Freemarker引擎模板,所以需要添加.ftl后缀的模板。只需要复制过来,@Setter和@Getter改为@Data即可
    resource目录下的templates目录下创建名为myentity.java.ftl的文件,内容如下:

package ${ 
   package.Entity}; <#list table.importPackages as pkg> import ${ 
   pkg}; </#list> <#if swagger> import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; </#if> <#if entityLombokModel> import lombok.Data; <#if chainModel> import lombok.experimental.Accessors; </#if> </#if> / * 

* ${table.comment!} *

* * @author ${author} * @since ${date} */
<#if entityLombokModel> @Data <#if chainModel> @Accessors(chain = true) </#if> </#if> <#if table.convert> @TableName("${schemaName}${table.name}") </#if> <#if swagger> @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}> { <#elseif entitySerialVersionUID> public class ${ entity} implements Serializable { <#else> public class ${ entity} { </#if> <#if entitySerialVersionUID> private static final long serialVersionUID = 1L; </#if> <#-- ---------- BEGIN 字段循环遍历 ----------> <#list table.fields as field> <#if field.keyFlag> <#assign keyPropertyName="${field.propertyName}"/> </#if> <#if field.comment!?length gt 0> <#if swagger> @ApiModelProperty("${field.comment}") <#else> / * ${field.comment} */ </#if> </#if> <#if field.keyFlag> <#-- 主键 --> <#if field.keyIdentityFlag> @TableId(value = "${field.annotationColumnName}", type = IdType.AUTO) <#elseif idType??> @TableId(value = "${field.annotationColumnName}", type = IdType.${ idType}) <#elseif field.convert> @TableId("${field.annotationColumnName}") </#if> <#-- 普通字段 --> <#elseif field.fill??> <#-- ----- 存在字段填充设置 -----> <#if field.convert> @TableField(value = "${field.annotationColumnName}", fill = FieldFill.${ field.fill}) <#else> @TableField(fill = FieldFill.${ field.fill}) </#if> <#elseif field.convert> @TableField("${field.annotationColumnName}") </#if> <#-- 乐观锁注解 --> <#if field.versionField> @Version </#if> <#-- 逻辑删除注解 --> <#if field.logicDeleteField> @TableLogic </#if> private ${ field.propertyType} ${ field.propertyName}; </#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 chainModel> 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 chainModel> 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 public 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> }

代码生成完整代码:

package com.xp.practice.generator; 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.engine.FreemarkerTemplateEngine; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class UserGenerator { 
    public static void main(String[] args) { 
    List<String> tables = new ArrayList<>(); tables.add("p_user"); tables.add("p_question"); tables.add("p_answer"); tables.add("p_correct"); FastAutoGenerator.create("jdbc:mysql://localhost:3306/xpa","root","") .globalConfig(builder -> { 
    builder.author("向培") //作者 .outputDir(System.getProperty("user.dir")+"\\src\\main\\java") //输出路径(写到java目录) .enableSwagger() //开启swagger .commentDate("yyyy-MM-dd") .fileOverride(); //开启覆盖之前生成的文件 }) .packageConfig(builder -> { 
    builder.parent("com.xp") .moduleName("practice") .entity("entity") .service("service") .serviceImpl("service.impl") .controller("controller") .mapper("mapper") .xml("mapper") .pathInfo(Collections.singletonMap(OutputFile.mapperXml,System.getProperty("user.dir")+"\\src\\main\\resources\\mapper")); }) .strategyConfig(builder -> { 
    builder.addInclude(tables) .addTablePrefix("p_") .serviceBuilder() .formatServiceFileName("%sService") .formatServiceImplFileName("%sServiceImpl") .entityBuilder() .enableLombok() .logicDeleteColumnName("deleted") .enableTableFieldAnnotation() .controllerBuilder() // 映射路径使用连字符格式,而不是驼峰 .enableHyphenStyle() .formatFileName("%sController") .enableRestStyle() .mapperBuilder() //生成通用的resultMap .enableBaseResultMap() .superClass(BaseMapper.class) .formatMapperFileName("%sMapper") .enableMapperAnnotation() .formatXmlFileName("%sMapper"); }) .templateConfig(new Consumer<TemplateConfig.Builder>() { 
    @Override public void accept(TemplateConfig.Builder builder) { 
    // 实体类使用我们自定义模板 builder.entity("templates/myentity.java"); } }) .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板 .execute(); } } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/211450.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午10:24
下一篇 2026年3月18日 下午10:24


相关推荐

  • 双飞翼布局详解

    双飞翼布局详解作用 圣杯布局和双飞翼布局解决的问题是相同的 就是两边顶宽 中间自适应的三栏布局 中间栏要在放在文档流前面以优先渲染 原理 双飞翼布局为了让中间 div 内容不被遮挡 直接在中间 div 内部创建子 div 用于放置内容 在该 div 里用 margin left 和 margin right 为左右两栏 div 留出位置 css 代码 header footer height 200px width 100 background color 0000FF

    2026年3月19日
    2
  • 电平转换电路_光耦电平转换电路图

    电平转换电路_光耦电平转换电路图一、概述​在硬件设计中有时候经常会遇到,主芯片引脚使用的1.8V、3.3V、5V等,连接外部接口芯片使用的3.3V、5V等,由于电平不匹配就必须进行电平转换。两个设备如果供电电压不一样,比如一个是3.3V,另一个是5V,那么在电平不匹配的情况下工作,会造成信号传输出错;如果二者电压相差较大,严重的可能会损坏芯片。二、设计1、晶体管构成的电平转换方法​

    2022年8月10日
    8
  • phpstrom2021.9激活码【2021最新】[通俗易懂]

    (phpstrom2021.9激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlS3…

    2022年3月26日
    49
  • layer 刷新某个页面

    layer 刷新某个页面

    2021年7月4日
    138
  • 各大公司的大数据质量监控平台

    各大公司的大数据质量监控平台转自:https://zhuanlan.zhihu.com/p/41679658在这个信息化时代,你用手机打开微信聊天、打开京东app浏览商品、访问百度搜索、甚至某些app给你推送的信息流等等,数据无时无刻不在产生。数据,已经成为互联网企业非常依赖的新型重要资产。数据质量的好坏直接关系到信息的精准度,也影响到企业的生存和竞争力。MichaelHammer(《Reengineeringt…

    2022年5月1日
    200
  • 递归函数实例大全 1

    递归函数实例大全 1常见的递归大全一 递归函数二 常见的递归 1 2 三 总结一 递归函数二 常见的递归 1 代码如下 示例 importnumpya pyplotasplti filterwarnin ignore importsslssl create default https context ssl

    2026年3月20日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号