1、前言

在日常的Spring Boot项目开发中,我们都会建立几个固有的包,分别是Controller、entity(pojo)、dao、service、serviceimpl。

在单个Spring Boot项目中,用手动建立倒是简单,但是在Spring Cloud项目中,会建立许多的Spring Boot项目,如果此时还使用手动建立这几个固有的包,那么就有点耽误时间了。

作为程序猿的我们,怎么可能会手动做这种重复而又浪费时间的事呢!那么Mybatis-plus所提供的逆向生成器就发挥出了我们想要的效果。

2、实现逆向生成器

2.1、导入依赖

<!--Spring Boot的启动依赖-->
<dependency>
	<groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>

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

<!--Mybatis-plus逆向生成器依赖-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.4.1</version>
</dependency>

<!--数据库连接依赖-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

<!--Lombok依赖-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

<!--Mybatis-plus逆向生成器的Freemarker模板引擎-->
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
</dependency>

mybatis-plus-generator这个依赖要使用3.5.0版本以下的,我使用的是3.4.1版本,因为这个依赖在3.5.0以后就进行了修改,需要使用相关类的Builder类来构建对象,然后Builder类所提供的方法又不多,所以我个人觉得使用起来不太方便。
导入数据库的依赖,是因为在逆向生成的过程中,Mybatis-plus会根据指定的表来生成相应的实力类对象以及其他层的配置。

导入模板引擎依赖,可以根据模板引擎来规定初始化生成的包的模式。

2.2、项目结构

项目中只有一个Utils包用来存放相关的工具类,而我也把逆向生成器类放在了这个包里面,如上图所示的MybatisPlusGenerate类。
我习惯了使用Spring Boot项目,所以这里的演示也是使用了Spring Boot项目,对spring Boot不熟悉的猿友可以使用Maven项目。

2.3、MybatisPlusGenerate类

public class MybatisPlusGenerate {

    private static Scanner scanner = new Scanner(System.in);
    // 获得当前项目的路径,如上图就是 F:stady_program/Mybatis_plus逆向工程
    private final static String PROJECT_PATH = System.getProperty("user.dir");
    
}

2.3.1、获取用户在控制台输入的表名

 public static void scannerTableName(String parentPackageName){
        List<String> tableList = new ArrayList<>(); // 使用集合来存储用户输入的多个表的名称
        System.out.println("<=================表名列表===============>");
        while(!scanner.hasNext("end")){ // 当用户输入end后结束输入
            String tableName = scanner.next();
            if(tableName.equals("")){
                throw new RuntimeException("所输入的表名不合法");
            }
            tableList.add(tableName); //将表名添加到集合中。
        }
        // 通过表名和当前项目的目录来生成相应的包和类。
        for(String name : tableList) generateInformationByTableName(parentPackageName,name);
  }

当前项目的目录就是指当前Spring Boot项目中启动类所在的包的名称。也就是上图所示的com.example.mybatis_plus_reverse包。

2.3.2、数据源的配置

 private static DataSourceConfig dataSourceConfig(){
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/mybatis?useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai")
                .setUsername("root")
                .setPassword("123456")
                .setDriverName("com.mysql.cj.jdbc.Driver").setDbType(DbType.MYSQL);

        return dataSourceConfig;
 }

数据源的配置这就不用说了吧,这个配置没什么难度。

2.3.3、全局属性的配置

 private static GlobalConfig globalConfig(){
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setOutputDir(PROJECT_PATH   "/src/main/java")// 输出文件路径
                .setAuthor("Time Travel")// 设置作者名字
                .setOpen(false)// 是否打开资源管理器
                .setFileOverride(true)// 是否覆盖原来生成的
                .setIdType(IdType.AUTO)// 主键策略
                .setBaseResultMap(true)// 生成resultMap
                .setDateType(DateType.ONLY_DATE) // 设置时间格式,采用Date
                .setServiceName("%sService");// 生成的service接口名字首字母是否为I,这样设置就没有I
        //setBaseColumnList(true)  XML中生成基础列
        return globalConfig;
 }

2.3.4、包属性的配置

    private static PackageConfig packageConfig(String fatherPackageName){
        PackageConfig packageConfig = new PackageConfig();
        packageConfig.setParent(fatherPackageName) // 配置指定项目中各层的名称
                .setController("controller") // Controller层
                .setEntity("entity") // 实体层(pojo层)
                .setMapper("dao") // Dao 层
                .setService("service") // service层
                .setServiceImpl("service.serviceImpl"); // ServiceImp层

        return packageConfig;
    }

fatherPackageName就是上图所示的com.example.mybatis_plus_reverse包的名称。

2.3.5、逆向生成类的名称配置

   private static StrategyConfig strategyConfig (String tableName){
        StrategyConfig strategyConfig = new StrategyConfig();
        strategyConfig.setCapitalMode(true)// 开启全局大写命名
               .setInclude(tableName)// 设置要映射的表
               .setNaming(NamingStrategy.underline_to_camel)// 下划线到驼峰的命名方式
               .setColumnNaming(NamingStrategy.underline_to_camel)// 下划线到驼峰的命名方式
               .setEntityLombokModel(true)// 是否使用lombok
               .setRestControllerStyle(true)// 是否开启rest风格
               .setTablePrefix("t_") // 去除前缀
               .setControllerMappingHyphenStyle(true); // localhost:8080/hello_a_2

        return strategyConfig;
   }

2.3.6、在resource目录下生成Mapper文件的配置

 private static InjectionConfig injectionConfig(){
        InjectionConfig injectionConfig = new InjectionConfig() {
            @Override
            public void initMap() {
                this.setMap(new HashMap<>()); // 实现InjectionConfig抽象类就需要初始化一个Map集合
            }
        };
        List<FileOutConfig> fileOutConfigList = new ArrayList<>();
        // 根据/templates/mapper.xml.ftl规则在指定的位置生成Mapper文件,可以在多个地方生成。
        fileOutConfigList.add(new FileOutConfig("/templates/mapper.xml.ftl") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 返回Mapper文件的绝对路径
                String path = PROJECT_PATH   "/src/main/resources/mapper/"  
                        tableInfo.getEntityName()   "Mapper"   StringPool.DOT_XML;
                return path;
            }
        });
        // 将对Mapper文件的配置添加到文件输出对象中
        injectionConfig.setFileOutConfigList(fileOutConfigList);
        return injectionConfig;
   }

2.3.7、配置生成器的生成模板

	// 最简单的配置
   private static TemplateConfig templateConfig() {
        TemplateConfig templateConfig = new TemplateConfig();

        return templateConfig.setXml(null);
   }
	// 复杂点的配置
	  private static TemplateConfig templateConfig() {
        TemplateConfig templateConfig = new TemplateConfig();
        templateConfig.setController("templates/controller.java")
                .setEntity("templates/entity.java")
                .setService("templates/service.java")
                .setServiceImpl("templates/serviceImpl.java")
                .setMapper("templates/mapper.java")
                .setXml(null);
        return templateConfig;
   }

使用第二个配置方式的前提需要在mybatis-plus-generator-3.4.1.jar这个包的templates目录中将上述的五个类的 .ftl 的文件复制到当前项目的resource目录下的templates包下。
如:controller.java.ftl

2.3.8、判断用户输入的项目包名是否存在

  // 判断输入的父项目是否存在
   private static boolean parentPackageExits(String project, String parentPackageName){
        StringBuilder path = new StringBuilder(PROJECT_PATH);
        if(!"".equals(project) && project != null){
            path.append("/"   project);
        }
        path.append(("/src/main/java/"   parentPackageName).replace(".","/"));
        File file = new File(path.toString());
        return file.exists();
   }

2.3.9、测试

// 执行、测试
    public static void main(String[] args) {
        System.out.print("父包名称: ");
        String input = scanner.next();
        if(!parentPackageExits(null,input)){
            throw new RuntimeException("输入的父包名不存在或者输入错误,请重新输入父包名");
        }
        scannerTableName(input);
    }

输入

输出上图内容则表示配置成功。

实现效果

执行完毕后就会在项目中自动生成相应的包和类,因为我们在GlobleConfig中配置的setFileOverride属性,所以会覆盖掉相同的包。

3、总结

在日常的开发中,对于重复、费时、费力的操作,作为程序猿的我们,应该都能利用程序来简化这些操作,做到事倍功半的效果。

到此这篇关于MyBatis-plus实现逆向生成器的文章就介绍到这了,更多相关MyBatis-plus实现逆向生成器内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

MyBatis-plus实现逆向生成器的更多相关文章

  1. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  2. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. MyBatis-Plus乐观锁插件的用法小结

    乐观锁很乐观,对任何事情都保持着一个乐观的态度,认为别人不会修改数据,所以不会上锁,只是在更新数据的时候,去判断这条数据有没有被别人修改过,这篇文章主要介绍了MyBatis-Plus乐观锁插件的用法,需要的朋友可以参考下

  4. Mybatis-Plus主键生成策略的方法

    本文主要介绍了Mybatis-Plus主键生成策略的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  5. mybatis-plus自带QueryWrapper自定义sql实现复杂查询实例详解

    MyBatis-Plus是一个MyBatis(opens new window)的增强工具,在 MyBatis的基础上只做增强不做改变,MyBatis可以无损升级为MyBatis-Plus,这篇文章主要给大家介绍了关于mybatis-plus自带QueryWrapper自定义sql实现复杂查询的相关资料,需要的朋友可以参考下

  6. Mybatis-plus:${ew.sqlselect}用法说明

    这篇文章主要介绍了Mybatis-plus:${ew.sqlselect}用法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. 一文详解Mybatis-plus的介绍与使用

    Mybatis-Plus 是 MyBatis 的一个增强工具,专门针对于传统MyBatis开发中sql需要手动进行映射配置繁琐缺点的一款框架技术。本文将为大家详细讲讲Mybatis-plus的介绍与使用,感兴趣的可以了解一下

  8. MyBatis-Plus找不到Mapper.xml文件的几种解决方法

    mybatis-plus今天遇到一个问题,就是mybatis 没有读取到mapper.xml 文件,所以下面这篇文章主要给大家介绍了关于MyBatis-Plus找不到Mapper.xml文件的几种解决方法,需要的朋友可以参考下

  9. Mybatis-Plus字段策略FieldStrategy的使用

    本文主要介绍了Mybatis-Plus字段策略FieldStrategy的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  10. mybatis-plus 新增/修改如何实现自动填充指定字段

    这篇文章主要介绍了mybatis-plus 新增/修改实现自动填充指定字段方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部