springboot 自动生成Mapper映射,entity实体,server,controller等


前言

完美集成lombok,swagger的代码生成工具,让你不再为繁琐的注释和简单的接口实现而烦恼:entity集成,格式校验,swagger; dao自动加@ mapper,service自动注释和依赖; 控制器实现单表的增副改查,并集成swagger实现api文档。

方法一

1、引入依赖

引入以下依赖

        <!-- mybatis-plus依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.2</version>
        </dependency>

        <!-- mybatis-plus-generator代码生成器依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.2</version>
        </dependency>


        <!-- freemarker,作为代码生成器mapper文件的模板引擎使用,不加生成xml出错 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>

2、 创建代码生成器 MybatisPlusGenerator

package com.hywx.hs.utils;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;
import lombok.extern.slf4j.Slf4j;

import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Scanner;

/**
 * @Description
 * @Author shup
 * @Date 2023/2/8 15:13
 */
@Slf4j
public class MybatisPlusGenerator {

    // 配置数据库信息
    private static final String URL = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "123456";
    // 项目根目录
    private static final String PROJECT_ROOT_PATH = System.getProperty("user.dir");
    private static final String BASE_PATH = PROJECT_ROOT_PATH + "/src/main/java/com/hywx/hs";
    private static final String PARENT_PACKAGE_NAME = "com.hywx.hs";

    // 执行main方法
    public static void main(String[] args) {
        codeGenerator();
    }

    // 代码生成方法
    @SuppressWarnings("all")
    private static void codeGenerator() {
        // 六个文件的路径
        String entityPath = BASE_PATH + "/entity";
        String mapperPath = BASE_PATH + "/mapper";
        String mapperXmlPath = PROJECT_ROOT_PATH + "/src/main/resources/mapper";
        String servicePath = BASE_PATH + "/service";
        String serviceImplPath = BASE_PATH + "/service/impl";
        String controllerPath = BASE_PATH + "/controller";


        FastAutoGenerator.create(URL, USERNAME, PASSWORD)
                .globalConfig(builder -> builder
                        // 作者名称
                        .author("shup")
                        // 开启覆盖已生成的文件
                        .fileOverride()
                        // 禁止打开输出目录
                        .disableOpenDir()
                        // 指定输出目录
                        // .outputDir(packagePath)
                        // 开启swagger2。注释掉则默认关闭。
                        .enableSwagger()
                        // 时间策略
                        .dateType(DateType.TIME_PACK)
                        // 时间格式
                        .commentDate("yyyy-MM-dd")
                )
                .packageConfig((scanner, builder) -> builder
                        // 阶段1:各个文件的包名设置,用来拼接每个java文件的第一句:package com.XXX.XXX.XXX.xxx;
                        // 父包名配置
                        .parent(PARENT_PACKAGE_NAME)
                        .entity("entity")
                        .mapper("mapper")
                        .service("service")
                        .serviceImpl("service.impl")
                        .controller("controller")
                        .other("other")
                        // 阶段2:所有文件的生成路径配置
                        .pathInfo(
                                new HashMap<OutputFile, String>() {{
                                    // 实体类的保存路径
                                    put(OutputFile.entity, entityPath);
                                    // mapper接口的保存路径
                                    put(OutputFile.mapper, mapperPath);
                                    // mapper.xml文件的保存路径
                                    put(OutputFile.xml, mapperXmlPath);
                                    // service层接口的保存路径
                                    put(OutputFile.service, servicePath);
                                    // service层接口实现类的保存路径
                                    put(OutputFile.serviceImpl, serviceImplPath);
                                    // 控制类的保存路径
                                    put(OutputFile.controller, controllerPath);
                                }}
                        )
                )
                .strategyConfig((scanner, builder) -> builder.addInclude(getTables(scanner.apply("请输入表名,多个英文逗号分隔?生成所有表,请输入[all]:")))
                        // 阶段1:Entity实体类策略配置
                        .entityBuilder()
                        // 设置父类。会在生成的实体类名后:extends BaseEntity
                        // .superClass(BaseEntity.class)
                        // 禁用生成 serialVersionUID。(不推荐禁用)
                        // .disableSerialVersionUID()
                        // 开启生成字段常量。
                        // 会在实体类末尾生成一系列 [public static final String NICKNAME = "nickname";] 的语句。(一般在写wapper时,会用到)
                        // .enableColumnConstant()
                        // 开启链式模型。
                        // 会在实体类前添加 [@Accessors(chain = true)] 注解。用法如 [User user=new User().setAge(31).setName("snzl");](这是Lombok的注解,需要添加Lombok依赖)
                        .enableChainModel()
                        // 开启 lombok 模型。
                        // 会在实体类前添加 [@Getter] 和 [@Setter] 注解。(这是Lombok的注解,需要添加Lombok依赖)
                        .enableLombok()
                        // 开启 Boolean 类型字段移除 is 前缀。
                        // .enableRemoveIsPrefix()
                        // 开启生成实体时生成字段注解。
                        // 会在实体类的属性前,添加[@TableField("nickname")]
                        .enableTableFieldAnnotation()
                        // 逻辑删除字段名(数据库)。
                        .logicDeleteColumnName("is_delete")
                        // 逻辑删除属性名(实体)。
                        // 会在实体类的该字段属性前加注解[@TableLogic]
                        .logicDeletePropertyName("isDelete")
                        // 数据库表映射到实体的命名策略(默认下划线转驼峰)。一般不用设置
                        // .naming(NamingStrategy.underline_to_camel)
                        // 数据库表字段映射到实体的命名策略(默认为 null,未指定按照 naming 执行)。一般不用设置
                        // .columnNaming(NamingStrategy.underline_to_camel)
                        // 添加父类公共字段。
                        // 这些字段不会出现在新增的实体类中。
                        .addSuperEntityColumns("id", "delete_time")
                        // 添加忽略字段。
                        // 这些字段不会出现在新增的实体类中。
                        // .addIgnoreColumns("password")
                        // 添加表字段填充
                        // 会在实体类的该字段上追加注解[@TableField(value = "create_time", fill = FieldFill.INSERT)]
                        .addTableFills(new Column("created_time", FieldFill.INSERT))
                        // 会在实体类的该字段上追加注解[@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)]
                        .addTableFills(new Column("updated_time", FieldFill.INSERT_UPDATE))
                        // 全局主键类型。如果MySQL主键设置为自增,则不需要设置此项。
                        // .idType(IdType.AUTO)
                        // 格式化文件名称。
                        // 如果不设置,如表[sys_user]的实体类名是[SysUser]。设置成下面这样,将是[SysUserEntity]
                        //.formatFileName("%sEntity")

                        // 阶段2:Mapper策略配置
                        .mapperBuilder()
                        // 设置父类
                        // 会在mapper接口方法集成[extends BaseMapper<XXXEntity>]
                        .superClass(BaseMapper.class)
                        // 开启 @Mapper 注解。
                        // 会在mapper接口上添加注解[@Mapper]
                        .enableMapperAnnotation()
                        // 启用 BaseResultMap 生成。
                        // 会在mapper.xml文件生成[通用查询映射结果]配置。
                        .enableBaseResultMap()
                        // 启用 BaseColumnList。
                        // 会在mapper.xml文件生成[通用查询结果列 ]配置
                        .enableBaseColumnList()
                        // 设置缓存实现类
                        // .cache(MyMapperCache.class)
                        // 格式化 mapper 文件名称。
                        // 如果不设置,如表[sys_user],默认的文件名是[SysUserMapper]。写成下面这种形式后,将变成[SysUserDao]。
                        // .formatMapperFileName("%sDao")
                        // 格式化 xml 实现类文件名称。
                        // 如果不设置,如表[sys_user],默认的文件名是[SysUserMapper.xml],写成下面这种形式后,将变成[SysUserXml.xml]。
                        // .formatXmlFileName("%sXml")

                        // 阶段3:Service策略配置
                        // .serviceBuilder()
                        // 设置 service 接口父类
                        // .superServiceClass(BaseService.class)
                        // 设置 service 实现类父类
                        // .superServiceImplClass(BaseServiceImpl.class)
                        // 格式化 service 接口文件名称
                        // 如果不设置,如表[sys_user],默认的是[ISysUserService]。写成下面这种形式后,将变成[SysUserService]。
                        // .formatServiceFileName("%sService")
                        // 格式化 service 实现类文件名称
                        // 如果不设置,如表[sys_user],默认的是[SysUserServiceImpl]。
                        // .formatServiceImplFileName("%sServiceImpl")

                        // 阶段4:Controller策略配置
                        .controllerBuilder()
                        // 设置父类。
                        // 会集成此父类。
                        // .superClass(BaseController.class)
                        // 开启生成 @RestController 控制器
                        // 会在控制类中加[@RestController]注解。
                        .enableRestStyle()
                        // 开启驼峰转连字符
                        .enableHyphenStyle()

                        // 最后:构建
                        .build()
                )

                //模板引擎配置,默认 Velocity 可选模板引擎 Beetl 或 Freemarker
                //.templateEngine(new BeetlTemplateEngine())
                .templateEngine(new FreemarkerTemplateEngine())

                // 执行
                .execute();
    }


    /**
     * @Description 处理控制台输入all情况
     * @Params [tables]
     * @Return java.util.List<java.lang.String>
     * @Author Corey
     * @Date 2022/8/8 18:55
     */
    private static List<String> getTables(String tables) {
        return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
    }

    /**
     * @Description 读取控制台内容
     * @Params [tip]
     * @Return java.lang.String
     * @Author Corey
     * @Date 2022/8/8 18:47
     */
    private static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder help = new StringBuilder();
        help.append("请输入").append(tip).append(":");
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if (StringUtils.isNotBlank(ipt)) {
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "!");
    }
}

根据需要修改类中的代码

在这里插入图片描述

3、执行程序,生成对应代码

执行main方法,输入对应数据库表的名称,回车。
即可在对应位置生成代码

在这里插入图片描述
将生成的代码拷贝到指定即可。

方法二

方法二使用大牛的开源工具包,在这里向大牛致敬。附上开源工具地址
https://gitee.com/flying-cattle/mybatis-dsc-generator

1、引入依赖

引入以下依赖

<dependency>
  <groupId>com.gitee.flying-cattle</groupId>
  <artifactId>mybatis-dsc-generator</artifactId>
  <version>3.0.7.RELEASE</version>
</dependency>

2、 创建代码生成器 MyGenerator

代码如下:

public class MyGenerator {
    // 基础信息:项目名、作者、版本
    public static final String PROJECT = "HS";
    public static final String AUTHOR = "shup";
    public static final String VERSION = "V1.0";
    // 数据库连接信息:连接URL、用户名、秘密、数据库名
    public static final String URL = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false&useSSL=true&serverTimezone=UTC";
    public static final String NAME = "root";
    public static final String PASS = "123456";
    public static final String DATABASE = "test";
    // 类信息:类名、对象名(一般是【类名】的首字母小些)、类说明、时间
    public static final String CLASSNAME = "CollectionRoute";
    public static final String TABLE = "sys_test";
    public static final String CLASSCOMMENT = "HS";
    public static final String TIME = new Date().getTime() + "";
    public static final String AGILE = new Date().getTime() + "";
    // 路径信息,分开路径方便聚合工程项目,微服务项目
    public static final String ENTITY_URL = "com.hywx.hs.entity";
    public static final String DAO_URL = "com.hywx.hs.mapper";
    public static final String XML_URL = "com.hywx.hs.mapper.xml";
    public static final String SERVICE_URL = "com.hywx.hs.service";
    public static final String SERVICE_IMPL_URL = "com.hywx.hs.service.impl";
    public static final String CONTROLLER_URL = "com.hywx.hs.controller";
    //是否是Swagger配置
    public static final String IS_SWAGGER = "true";

    public static void main(String[] args) {
        BasisInfo bi = new BasisInfo(PROJECT, AUTHOR, VERSION, URL, NAME, PASS, DATABASE, TIME, AGILE, ENTITY_URL,
                DAO_URL, XML_URL, SERVICE_URL, SERVICE_IMPL_URL, CONTROLLER_URL,IS_SWAGGER);
        bi.setTable(TABLE);
        bi.setEntityName(MySqlToJavaUtil.getClassName(TABLE));
        bi.setObjectName(MySqlToJavaUtil.changeToJavaFiled(TABLE));
        bi.setEntityComment(CLASSCOMMENT);
        try {
            bi = EntityInfoUtil.getInfo(bi);
            String fileUrl = "D:\\test\\java\\";// 生成文件存放位置
            //开始生成文件
            String aa1 = Generator.createEntity(fileUrl, bi).toString();
            String aa2 = Generator.createDao(fileUrl, bi).toString();
            String aa3 = Generator.createDaoImpl(fileUrl, bi).toString();
            String aa4 = Generator.createService(fileUrl, bi).toString();
            String aa5 = Generator.createServiceImpl(fileUrl, bi).toString();
            String aa6 = Generator.createController(fileUrl, bi).toString();

            System.out.println(aa1);
            System.out.println(aa2); System.out.println(aa3); System.out.println(aa4);
            System.out.println(aa5); System.out.println(aa6);

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

修改类中的对应配置。

3、执行程序,生成对应代码

执行main方法,即可在对应位置生成代码

代码结构
大功告成!

总结

方法一借助了mybatis-plus-generator工具包,代码框架相对复杂;方法二使用的是开源的工具包,相对来说,方法二内置了通用的模板文件,可定制性更强,源码阅读及修改也更为方便,并且方法二集成了swagger的功能,所以我更推荐方法二中的实现方式。

  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Java代码生成器是一种工具,可以根据指定的模板和配置信息自动生成Java代码。在这里,我们将聚焦于生成Entity、Dao、Mapper、Service和Controller这几个常见的组件。 首先,生成Entity实体类)是为了将数据库中的表映射Java中的对象,包括表字段对应的成员变量和相应的getter/setter方法。代码生成器可以根据数据库结构自动生成这些代码,使得开发人员能够更快速地创建实体类。 其次,生成Dao(数据访问对象)是为了实现数据的持久化操作。Dao层提供了数据库的基本CRUD操作,通常包括插入、更新、删除和查询等功能。生成的Dao类实现了这些操作的具体逻辑,使得开发人员无需手动编写这些重复的代码。 接下来,生成Mapper(数据映射器)是为了实现数据库和实体类之间的映射关系。Mapper层使用注解或XML配置文件来定义数据库表和实体类之间的映射规则,使得开发人员能够方便地进行数据库操作。 再次,生成Service(业务逻辑层)是为了实现业务处理的逻辑。Service层提供了对外的接口,封装了具体的数据操作和业务处理。生成的Service类中包含了可能需要的一些方法,例如创建、更新、删除和查询等,使得开发人员可以直接使用这些方法来进行业务功能的开发。 最后,生成Controller(控制层)是为了处理请求和响应。Controller层接收来自前端的请求,并将请求转发给相应的Service层进行业务处理,最后将结果返回给前端。生成的Controller类中包含了一些常用的请求处理方法,例如增删改查等操作,使得开发人员可以快速编写接口代码。 总而言之,Java代码生成器可以帮助开发人员自动生成Entity、Dao、Mapper、Service和Controller等代码,提高开发效率,减少重复劳动。但需要注意的是,代码生成器不是万能的,只能生成基础的代码框架,具体的业务逻辑和细节仍需要开发人员进行手动编写和优化。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值