在线问题反馈模块实战(二):封装代码自动生成类文件器

举报
bug菌 发表于 2023/04/27 14:31:48 2023/04/27
【摘要】 我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!

👨‍🎓作者:bug菌
✏️博客:CSDN掘金infoQ51CTO
🎉简介:CSDN/阿里云/51CTO 博客专家,博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者,全网粉丝合计10w+,硬核微信公众号猿圈奇妙屋」,欢迎你的加入!免费领取简历模板/学习资料/大厂面试真题/职业规划等海量资料。
..
✍️温馨提醒:本文字数:1999字, 阅读完需:约 6 分钟

        嗨,家人们,我是bug菌呀,我又来啦。今天我们来聊点什么咧,OK,接着为大家更《springboot零基础入门教学》系列文章吧。希望能帮助更多的初学者们快速入门!

        如果小伙伴们在批阅文章的过程中觉得文章对自己有帮助,请别吝啬手中的赞呀,大胆的把文章点亮👍,相信你点赞了好的文章,平台也会经常给你推荐高质量好文,您的点赞三连(收藏+关注+留言)就是对bug菌写文道路上最好的鼓励与支持😘。时光不弃🏃🏻‍♀️,创作不停💕,加油☘️

一、前言🔥

         接下来,我这里又用到一个超级方便好省的玩意,在对于新增表而言,手动创建那些Entity、Dao、Mapper.xml、Service、Controller等文件是一件非常头疼的体力活,妥妥工具人啊,而且一个完整的业务系统,有着源源不断的需求迭代,这对于一个后端开发者而言,手动创建这些类实体文件就显得特别无力又无奈。

所以对于那些还在手动创建这些类实体的小伙伴们,从此刻开始你们就要摆脱徒手创建的噩梦,教大家如何代码自动替我们做这件事,从此不再苦恼对于新加表而言而又面临徒手加类实体的烦恼。如果有的小伙伴用到了, 那请忽略此步骤,接着看下一章节的内容哈。

        对于代码生成器,我这里推荐的是mybatis-plus所提供的AutoGenerator代码生成器,通过 AutoGenerator你可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升你的开发效率。

        所以接下来,你只需要在你的pom依赖配置中引入如下依赖包即可。

        <!-- 代码自动生成器配置 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.2.0</version>
        </dependency>

        由于MyBatis-Plus 从 3.0.3 版本之后就移除了代码生成器与模板引擎的默认依赖,需要你手动添加模板引擎的依赖。

        而且对于mp添加模板引擎依赖,MyBatis-Plus可支持Velocity(默认)、Freemarker、Beetl等,你完全可以选择自己熟悉的模板引擎,如果都不满足您的要求,你也可以采用自定义模板引擎。

        比如我本地项目开发用的就是Freemarker这套模板引擎,所以只需要在我的配置文件中引入Freemarker模板引擎的依赖即可。

        <!--freemarker模板引擎-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>
        如果你有自己的想法,那么你也可以使用你自己熟悉的模板引擎哈。这里我就不一一演示了,如果你嫌麻烦,你可以暂时先按照我的这套教程走,先使用熟悉起来后,再换模板引擎也是可以的呀。

        接下来就是核心内容了。毕竟涉及通过代码如何实现自动代码生成呢?这你接着往下看。我会写的非常详细。一定会把你教会的。

        如下是执行 main 方法控制台输入模块表名后回车即可自动生成对应文件且存放到项目目录中。

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");
        gc.setAuthor("luoyong");
        gc.setOpen(false);
        gc.setFileOverride(true);// 是否覆盖同名文件,默认是false
        gc.setActiveRecord(true);// 不需要ActiveRecord特性的请改为false
        gc.setEnableCache(false);// XML 二级缓存
        gc.setBaseResultMap(true);// XML ResultMap 生成基本的resultmap
        gc.setBaseColumnList(true);// XML columList 生成基本的sql片段
        //实体属性 Swagger2 注解
        gc.setSwagger2(true);
        mpg.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://ip:3306/review_db?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("123456");
        mpg.setDataSource(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig();
        //pc.setModuleName(scanner("模块名"));
        pc.setParent("com.example.review");
        pc.setEntity("entity");
        pc.setMapper("dao");
        pc.setService("service");
        pc.setServiceImpl("service.impl");
        mpg.setPackageInfo(pc);

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

        // 自定义输出配置
        List<FileOutConfig> focList = new ArrayList<>();
        // 自定义配置会被优先输出
        focList.add(new FileOutConfig("/templates/mapper.xml.ftl") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
                return projectPath + "/src/main/resources/mapper/" + tableInfo.getEntityName() + "Mapper" + ".xml";
            }
        });
        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        strategy.setSuperEntityClass("com.example.review.base.BaseEntity");
        strategy.setEntityLombokModel(false);
        strategy.setRestControllerStyle(true);
        // 公共父类
        strategy.setSuperControllerClass("com.example.review.base.BaseController");
        // 写于父类中的公共字段
//        strategy.setSuperEntityColumns("id");
        strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));
        strategy.setControllerMappingHyphenStyle(true);
        strategy.setTablePrefix(pc.getModuleName() + "_");

        TemplateConfig tc = new TemplateConfig();
        tc.setXml(null);
        mpg.setTemplate(tc);
        mpg.setStrategy(strategy);
        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        mpg.execute();
    }
其中有几块你们是需要手动修改的。比如你们的包路径位置,我的项目根目录为com.example.review.你们的是啥就具体改成啥就行。还有就是数据库连接地址,我这里是直接使用的ip作为演示,这里你们也是要将ip改成你们数据库服务具体ip地址的哈,然后别的啥你们都可以直接套用我上边写的这套代码。

最后就是main主函数调用了。这具体实现代码我也帮大家写好了。目的就是为了像现在我这个需求,可根据新增的表来指定自动生成对应实体类等文件。

    public static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder help = new StringBuilder();
        help.append("请输入" + tip + ":");
        System.out.println(help.toString());
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if (StringUtils.isNotEmpty(ipt)) {
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "!");
    }

        所以小伙伴们以上两段代码写到同一个MyGenerator文件中就好啦。像我这样,如下:

        至于具体如何使用及拓展,请看下一章节啦。 

        ... ...

        好啦,以上就是这期的所有内容啦,你们学废了么?如果对你有所帮助,还请不要忘记给bug菌[三连支持]哟。如果想获得更多的学习资源或者想和更多的技术爱好者一起交流,可以关注我的公众号『猿圈奇妙屋』,后台回复关键词领取学习资料、大厂面经、面试模板等海量资源,就等你来拿。

三、往期热文推荐🔥

        对于问题反馈模块实战开发,我完整的梳理了每一期的教学及链接地址,仅供参考:希望能对你们有所帮助。

        如上是整整二十期内容,每一期都是干货,对于一个模块的开发,如何一点一滴打造并测试部署上线,我再说一遍,这不是演习,是实战!是实战!是实战!

        若你们觉得只是需要了解其中某个知识点或者业务的话,也不反对,你就选择其中的几期进行学习就好,反正都已经完结啦;我只希望你们能有所收获,有所成长,也就不枉我苦心每天下班后给大家总结更新。

四、文末🔥

        如果还想要学习更多,小伙伴们直接订阅bug菌专门为大家创建的零基础入门Spring Boot专栏《滚雪球学Spring Boot》,从无到有,从零到一!以知识点+实例+项目的学习模式由浅入深对Spring Boot框架进行学习&使用。

       我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。