User-Profile-Image
hankin
  • 5
  • Java
  • Kotlin
  • Spring
  • Web
  • SQL
  • MegaData
  • More
  • Experience
  • Enamiĝu al vi
  • 分类
    • Zuul
    • Zookeeper
    • XML
    • WebSocket
    • Web Notes
    • Web
    • Vue
    • Thymeleaf
    • SQL Server
    • SQL Notes
    • SQL
    • SpringSecurity
    • SpringMVC
    • SpringJPA
    • SpringCloud
    • SpringBoot
    • Spring Notes
    • Spring
    • Servlet
    • Ribbon
    • Redis
    • RabbitMQ
    • Python
    • PostgreSQL
    • OAuth2
    • NOSQL
    • Netty
    • MySQL
    • MyBatis
    • More
    • MinIO
    • MegaData
    • Maven
    • LoadBalancer
    • Kotlin Notes
    • Kotlin
    • Kafka
    • jQuery
    • JavaScript
    • Java Notes
    • Java
    • Hystrix
    • Git
    • Gateway
    • Freemarker
    • Feign
    • Eureka
    • ElasticSearch
    • Docker
    • Consul
    • Ajax
    • ActiveMQ
  • 页面
    • 归档
    • 摘要
    • 杂图
    • 问题随笔
  • 友链
    • Spring Cloud Alibaba
    • Spring Cloud Alibaba - 指南
    • Spring Cloud
    • Nacos
    • Docker
    • ElasticSearch
    • Kotlin中文版
    • Kotlin易百
    • KotlinWeb3
    • KotlinNhooo
    • 前端开源搜索
    • Ktorm ORM
    • Ktorm-KSP
    • Ebean ORM
    • Maven
    • 江南一点雨
    • 江南国际站
    • 设计模式
    • 熊猫大佬
    • java学习
    • kotlin函数查询
    • Istio 服务网格
    • istio
    • Ktor 异步 Web 框架
    • PostGis
    • kuangstudy
    • 源码地图
    • it教程吧
    • Arthas-JVM调优
    • Electron
    • bugstack虫洞栈
    • github大佬宝典
    • Sa-Token
    • 前端技术胖
    • bennyhuo-Kt大佬
    • Rickiyang博客
    • 李大辉大佬博客
    • KOIN
    • SQLDelight
    • Exposed-Kt-ORM
    • Javalin—Web 框架
    • http4k—HTTP包
    • 爱威尔大佬
    • 小土豆
    • 小胖哥安全框架
    • 负雪明烛刷题
    • Kotlin-FP-Arrow
    • Lua参考手册
    • 美团文章
    • Java 全栈知识体系
    • 尼恩架构师学习
    • 现代 JavaScript 教程
    • GO相关文档
    • Go学习导航
    • GoCN社区
    • GO极客兔兔-案例
    • 讯飞星火GPT
    • Hollis博客
    • PostgreSQL德哥
    • 优质博客推荐
    • 半兽人大佬
    • 系列教程
    • PostgreSQL文章
    • 云原生资料库
    • 并发博客大佬
Help?

Please contact us on our email for need any support

Support
    首页   ›   SQL   ›   MyBatis   ›   正文
MyBatis

Mybatis(Plus)—代码生成器

2020-08-20 14:31:02
1651  0 0
参考目录 隐藏
1) 官网简化版:
2) 封装代码结构:
3) GeneratorExecute (批量生成)
4) GeneratorFactory (代码生成工厂)
5) myController.java.ftl (Controller模板)
6) myEntity.java.ftl (实体类模板)
7) 需要依赖:
8) 连接依赖:(可以更换)
9) 部分的公司依赖:

阅读完需:约 9 分钟

AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。

Mybatis-Plus官网:

https://baomidou.com/guide/generator.html#%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B


官网简化版:

public class CodeGeneration {
    public static void main(String[] args){
        AutoGenerator mpg = new AutoGenerator();

        //全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath + "/src/main/java/com/hitotek/htvfactor");
        gc.setFileOverride(true);
        gc.setActiveRecord(true);//不需要ActiveRecord特性的请改为false
        gc.setEnableCache(false);//XML二级缓存
        gc.setBaseResultMap(true);//XML ResultMap
        gc.setBaseColumnList(false);//XML columList
        gc.setAuthor("xjh");//作者

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

        //数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setDbType(DbType.SQL_SERVER);
        dsc.setDriverName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        dsc.setUsername("root");
        dsc.setPassword("root");
        dsc.setUrl("jdbc:sqlserver://127.0.0.1:14332;databaseName=LT_share");
        mpg.setDataSource(dsc);

        //策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setEntityLombokModel(true); // 设置Lombok的使用
        strategy.setRestControllerStyle(true); // 生成RestController控制器
        strategy.setControllerMappingHyphenStyle(true); // url驼峰连接字符
        strategy.setEntityTableFieldAnnotationEnable(true);  // 是否生成实体时,生成字段注解
        strategy.setTableFillList(Arrays.asList(new TableFill("create_time", FieldFill.INSERT),
                new TableFill("update_time", FieldFill.INSERT_UPDATE)));

        strategy.setTablePrefix(new String[]{});//此处可以修改您的表前缀
        strategy.setNaming(NamingStrategy.underline_to_camel);//表名生成策略
        strategy.setInclude(new String[]{"DataAcquisition_DataShare"});//需要生成的表

        strategy.setSuperServiceClass(null);
        strategy.setSuperServiceImplClass(null);
        strategy.setSuperMapperClass(null);

        mpg.setStrategy(strategy);

        //包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent("com.demo");
        pc.setController("controller");
        pc.setService("service");
        pc.setServiceImpl("serviceImpl");
        pc.setMapper("mapper");
        pc.setEntity("entity");
        pc.setXml("xml");
        mpg.setPackageInfo(pc);

        //执行生成
        mpg.execute();
    }
}

这段生成的代码是单表生成的,一次就生成一张表的内容,并且没有用模板的部分,所以有了封装版的。


封装代码结构:


GeneratorExecute (批量生成)

public class GeneratorExecute {

    public static void main(String[] args) {
        // 表名
        new GeneratorFactory()
                .setIncludeTables(new String[]{
                        "MS_HOUR_DATA",
                        "SiteInfo",
                        "ZDJK_EXHAUST_FLOW_DAY_DATA",
                        "ZDJK_EXHAUST_FLOW_HOUR_DATA",
                        "ZDJK_EXHAUST_POLLUTANT_DAY_DATA",
                        "ZDJK_EXHAUST_POLLUTANT_HOUR_DATA",
                        "ZDJK_POLLUTANT_CODING",
                        "ZDJK_WASTEWATER_FLOW_DAY_DATA",
                        "ZDJK_WASTEWATER_FLOW_HOUR_DATA",
                        "ZDJK_WASTEWATER_POLLUTANT_DAY_DATA",
                        "ZDJK_WASTEWATER_POLLUTANT_HOUR_DATA",
//                        "alarm_category",
//                        "vehicle",
//                        "company",
//                        "person",
//                        "terminal",
//                        "building",
//                        "cargo"
                })
                .setExcludeTables(new String[]{})
                .execute();
    }

}

GeneratorFactory (代码生成工厂)

public class GeneratorFactory {

    private final static String BASE_PACKAGE_NAME = "com.hitotek.htvfactor.generator";
    //    private final static String MY_DIR = "/Users/z_true/Documents/IdeaProjects/htvehicle-api/vehicle-generator/src/main/java/";
    private final static String MY_DIR = "E:\\gongsi\\HTV\\htvfactor\\src\\main\\java";
    private final static String MY_AUTHOR = "xjh";

    //    private final static String SQL_DIVER_NAME = "com.mysql.jdbc.Driver";
    private final static String SQL_DIVER_NAME = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
    private final static String SQL_URL = "171.221.172.168:14332;databaseName=LT_share";
    //    private final static String SQL_URL = "ip.51demo.tech:55432";
    private final static String JDBC = "sqlserver";
    private final static String SQL_USERNAME = "userfort";
    private final static String SQL_PASSWORD = "uft_34@8";

    private final static String DATABASE_NAME = "LT_share";
    private final static String DATABASE_SCHEMA = "dbo";
    private final static DbType DB_TYPE = DbType.SQL_SERVER;
//    private final static DbType DB_TYPE = DbType.MYSQL;

    private static String[] includeTables;
    private static String[] excludeTables;

    private void domain(String[] includeTables, String[] excludeTables) {
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        gc.setOutputDir(MY_DIR);    //生成文件的输出目录
        gc.setAuthor(MY_AUTHOR);                    //作者
        gc.setFileOverride(true);                //是否覆蓋已有文件 默认值:false
        gc.setOpen(false);                        //是否打开输出目录 默认值:true
        gc.setDateType(DateType.ONLY_DATE);
        gc.setIdType(IdType.AUTO);

//	        gc.setSwagger2(true);					//开启 swagger2 模式 默认false
        gc.setBaseColumnList(true);                //开启 baseColumnList 默认false
        gc.setBaseResultMap(true);                //开启 BaseResultMap 默认false
//        gc.setEntityName("%sEntity");            //实体命名方式  默认值:null 例如:%sEntity 生成 UserEntity
//        gc.setMapperName("%sMapper");            //mapper 命名方式 默认值:null 例如:%sDao 生成 UserDao
//        gc.setXmlName("%sMapper");                //Mapper xml 命名方式   默认值:null 例如:%sDao 生成 UserDao.xml
//        gc.setServiceName("%sService");            //service 命名方式   默认值:null 例如:%sBusiness 生成 UserBusiness
//        gc.setServiceImplName("%sServiceImpl");    //service impl 命名方式  默认值:null 例如:%sBusinessImpl 生成 UserBusinessImpl
//        gc.setControllerName("%sCrudController");    //controller 命名方式    默认值:null 例如:%sAction 生成 UserAction
        mpg.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setDbType(DB_TYPE);        //数据库类型	该类内置了常用的数据库类型【必须】
//        dsc.setUrl("jdbc:" + JDBC + "://" + SQL_URL + "/" + DATABASE_NAME + "?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" );
//        dsc.setUrl("jdbc:" + JDBC + "://" + SQL_URL + "/" + DATABASE_NAME );
        dsc.setUrl("jdbc:" + JDBC + "://" + SQL_URL);
        System.out.println("输出地址");
        System.out.println(dsc.getUrl());
        dsc.setSchemaName(DATABASE_SCHEMA);
        dsc.setDriverName(SQL_DIVER_NAME);
        dsc.setUsername(SQL_USERNAME);
        dsc.setPassword(SQL_PASSWORD);
        mpg.setDataSource(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig();
//	        pc.setModuleName(scanner("模块名"));
        pc.setParent(BASE_PACKAGE_NAME);
        mpg.setPackageInfo(pc);

        // 自定义模板配置
        TemplateConfig tc = new TemplateConfig();
        tc.setController("/templates/myController.java");
        tc.setEntity("/templates/myEntity.java");
        mpg.setTemplate(tc);


        // 策略配置	数据库表配置,通过该配置,可指定需要生成哪些表或者排除哪些表
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.no_change);    //表名生成策略
        strategy.setColumnNaming(NamingStrategy.no_change);//数据库表字段映射到实体的命名策略, 未指定按照 naming 执行
//	        strategy.setCapitalMode(true);			// 全局大写命名 ORACLE 注意
//	        strategy.setTablePrefix("prefix");		//表前缀
//	        strategy.setSuperEntityClass("com.baomidou.ant.common.BaseEntity");	//自定义继承的Entity类全称,带包名
//	        strategy.setSuperEntityColumns(new String[] { "test_id", "age" }); 	//自定义实体,公共字段
        strategy.setEntityLombokModel(true);	//【实体】是否为lombok模型(默认 false
        strategy.setRestControllerStyle(true);    //生成 @RestController 控制器
//        strategy.setSuperControllerClass("com.baomidou.ant.common.BaseController");    //自定义继承的Controller类全称,带包名
//        strategy.setInclude(tableName);        //需要包含的表名,允许正则表达式(与exclude二选一配置)
        strategy.setInclude(includeTables); // 需要生成的表可以多张表
        strategy.setExclude(excludeTables); // 排除生成的表
        strategy.setControllerMappingHyphenStyle(true);    //驼峰转连字符
        strategy.setTablePrefix(pc.getModuleName() + "_");    //是否生成实体时,生成字段注解
        mpg.setStrategy(strategy);
        // 选择 freemarker 引擎,默认 Veloctiy
        mpg.setTemplateEngine(new FreemarkerTemplateEngine());

        mpg.execute();
    }

    public GeneratorFactory setIncludeTables(String[] tableNames) {
        GeneratorFactory.includeTables = tableNames;
        return this;
    }

    public GeneratorFactory setExcludeTables(String[] tableNames) {
        GeneratorFactory.excludeTables = tableNames;
        return this;
    }


    public void execute() {
        if (null == includeTables) {
            includeTables = new String[0];
        }
        if (null == excludeTables) {
            excludeTables = new String[0];
        }
        this.domain(includeTables, excludeTables);
        log.info("Generator Executed Success");
    }
}

myController.java.ftl (Controller模板)

package ${package.Controller};

import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import com.hitotek.support.v1.vo.RestQueryWrapper;
import com.hitotek.support.v1.core.AbstractRestSupport;
import com.hitotek.htvfactor.generator.entity.${entity};
import core.Data;
import com.hitotek.htvfactor.generator.service.I${entity}Service;
import org.springframework.web.bind.annotation.*;

<#if restControllerStyle>
    import org.springframework.web.bind.annotation.RestController;
<#else>
    import org.springframework.stereotype.Controller;
</#if>
<#if superControllerClassPackage??>
    import ${superControllerClassPackage};
</#if>

/**
* <p>
<#--    * ${table.comment!} controller-->
    * controller
    * </p>
*
* @author ${author}
* @since ${date}
*/
<#if restControllerStyle>
    @RestController
<#else>
    @Controller
</#if>
@RequestMapping("<#if package.ModuleName??>/${package.ModuleName}</#if>/<#if controllerMappingHyphenStyle??>${controllerMappingHyphen}<#else>${table.entityPath}</#if>")
<#if kotlin>
class ${table.controllerName}<#if superControllerClass??> : ${superControllerClass}()</#if>
<#else>
<#if superControllerClass??>
    public class ${table.controllerName} extends ${superControllerClass} {
<#else>
    public class ${table.controllerName} extends AbstractRestSupport<${entity}, I${entity}Service> {
</#if>

    @Override
    protected Class<${entity}> clazz() {
    return ${entity}.class;
    }

    @GetMapping
    @Override
    public ResponseEntity<Data> queryByPagination(RestQueryWrapper queryWrapper) {
    return super.queryByPagination(queryWrapper);
    }

    @GetMapping("/{primaryKey}")
    @Override
    public ResponseEntity<Data> queryById(@PathVariable Long primaryKey) {
    return super.queryById(primaryKey);
    }

    @DeleteMapping("/{primaryKey}")
    @Override
    public ResponseEntity<Data> deleteById(@PathVariable Long primaryKey) {
    return super.deleteById(primaryKey);
    }

    @PatchMapping
    @Override
    public ResponseEntity<Data> updateById(@RequestBody ${entity} entity) {
    return super.updateById(entity);
    }

    @PostMapping
    @Override
    public ResponseEntity<Data> create(@RequestBody ${entity} entity, BindingResult bindingResult) {
    return super.create(entity, bindingResult, null);
    }

    }
</#if>

myEntity.java.ftl (实体类模板)

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>
import com.baomidou.mybatisplus.annotation.TableName;

/**
 * ${table.comment!}
 *
 * @author ${author}
 * @since ${date}
 */
<#if entityLombokModel>
@Data
    <#if superEntityClass??>
@EqualsAndHashCode(callSuper = true)
    <#else>
@EqualsAndHashCode(callSuper = false)
    </#if>
@Accessors(chain = true)
</#if>
<#if swagger2>
@ApiModel(value="${entity}对象", description="${table.comment!}")
</#if>
@TableName(value = "${table.name}")
<#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>

<#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 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};
</#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>
}

需要依赖:

<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.2.0</version>
        </dependency>

        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.30</version>
        </dependency>

连接依赖:(可以更换)

        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>mssql-jdbc</artifactId>
            <scope>runtime</scope>
        </dependency>

部分的公司依赖:

<dependency>
            <groupId>com.disware</groupId>
            <artifactId>genius-config</artifactId>
            <version>${genius.version}</version>
        </dependency>

        <dependency>
            <groupId>com.hitotek</groupId>
            <artifactId>support-rest</artifactId>
            <version>1.0.0-20200710.090640-4</version>
        </dependency>

        <dependency>
            <groupId>com.hitotek</groupId>
            <artifactId>logging-core</artifactId>
            <version>${logging.version}</version>
        </dependency>

        <dependency>
            <groupId>com.disware</groupId>
            <artifactId>multipart-core</artifactId>
            <version>${mulitpart.version}</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
        </dependency>


        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

如本文“对您有用”,欢迎随意打赏作者,让我们坚持创作!

0 打赏
Enamiĝu al vi
不要为明天忧虑.因为明天自有明天的忧虑.一天的难处一天当就够了。
543文章 68评论 294点赞 594060浏览

随机文章
Freemarker整合初试入门
5年前
lombok编写优雅的Bean对象
5年前
SpringBoot—JdbcTemplate(数据持久化)
5年前
Springboot常用注解大全
5年前
SpringBoot—文件上传(StandardServletMultipartResolver )
5年前
博客统计
  • 日志总数:543 篇
  • 评论数目:68 条
  • 建站日期:2020-03-06
  • 运行天数:1927 天
  • 标签总数:23 个
  • 最后更新:2024-12-20
Copyright © 2025 网站备案号: 浙ICP备20017730号 身体没有灵魂是死的,信心没有行为也是死的。
主页
页面
  • 归档
  • 摘要
  • 杂图
  • 问题随笔
博主
Enamiĝu al vi
Enamiĝu al vi 管理员
To be, or not to be
543 文章 68 评论 594060 浏览
测试
测试
看板娘
赞赏作者

请通过微信、支付宝 APP 扫一扫

感谢您对作者的支持!

 支付宝 微信支付