mybatisplus代码生成器_想做时间管理大师?你可以试试Mybatis Plus代码生成器

88d2c422a2bccb0b01f7e4f2d56f2453.png

1. 前言

对于写Crud的老司机来说时间非常宝贵,一些样板代码写不但费时费力,而且枯燥无味。经常有小伙伴问我,胖哥你怎么天天那么有时间去搞新东西,透露一下秘诀呗。

135b38efb604a948fdcbc3cb2e8c8d2f.png

好吧,今天就把Mybatis-plus的代码生成器分享出来,让你也成为一个优秀的时间管理大师。

2. 基本依赖

Spring BootMySQL为例,你需要下面这些依赖:

    org.projectlombok    lombok    compile    com.zaxxer    HikariCP    mysql    mysql-connector-java    com.baomidou    mybatis-plus-boot-starter    com.baomidou    mybatis-plus-generator    compile    true    org.springframework.boot    spring-boot-starter-freemarker    compile    true

然后配置好你的数据库,确保数据库连接通讯畅通。

3. 定制代码生成器

这里我期望生成的目录结构是这样的:

23b633eb965cf32eab8ba2f2a48ba33a.png

于是我花了点时间定制了一些生成器的配置,代码如下,就是这么硬核!

package cn.felord.mybatis.util;​import com.baomidou.mybatisplus.annotation.DbType;import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.core.toolkit.StringPool;import com.baomidou.mybatisplus.generator.AutoGenerator;import com.baomidou.mybatisplus.generator.InjectionConfig;import com.baomidou.mybatisplus.generator.config.*;import com.baomidou.mybatisplus.generator.config.po.TableInfo;import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;​import java.util.ArrayList;import java.util.List;import java.util.Optional;​​/** * 代码生成器配置 * * @author felord * @since 10 :39  2018/9/9 */public class CodeGenerator {    private String dbUrl;    private String userName;    private String password;    private String dir;    private String xmlDir;    private String packageName;​    private CodeGenerator() {    }​    /**     * The type Config builder.     */    public static class ConfigBuilder {​        private String dbUrl;        private String userName;        private String password;        private String dir;        private String xmlDir;        private String packageName;​​        /**         * Db url config builder.         *         * @param dbUrl the db url         * @return the config builder         */        public ConfigBuilder dbUrl(final String dbUrl) {            this.dbUrl = dbUrl;            return this;        }​        /**         * User name config builder.         *         * @param userName the user name         * @return the config builder         */        public ConfigBuilder userName(final String userName) {            this.userName = userName;            return this;        }​        /**         * Password config builder.         *         * @param password the password         * @return the config builder         */        public ConfigBuilder password(final String password) {            this.password = password;            return this;        }​        /**         * Dir config builder.         *         * @param dir the dir         * @return the config builder         */        public ConfigBuilder dir(final String dir) {            this.dir = dir;            return this;        }​        /**         * Dir config builder.         *         * @param xmlDir the dir         * @return the config builder         */        public ConfigBuilder xmlDir(final String xmlDir) {            this.xmlDir = xmlDir;            return this;        }​        /**         * Package name config builder.         *         * @param packageName the package name         * @return the config builder         */        public ConfigBuilder packageName(final String packageName) {            this.packageName = packageName;            return this;        }​        /**         * Build code generator.         *         * @return the code generator         */        public CodeGenerator build() {            CodeGenerator generator = new CodeGenerator();​            generator.dbUrl = Optional.of(this.dbUrl).get();            generator.userName = Optional.of(this.userName).get();            generator.password = Optional.of(this.password).get();            generator.dir = Optional.of(this.dir).get();            generator.xmlDir = Optional.of(this.xmlDir).get();            generator.packageName = Optional.of(this.packageName).get();            return generator;        }    }​​    /**     * Code.     *     * @param tableNames the table names     */    public void code(String... tableNames) {        codingMysql(true, false, true, this.dbUrl, this.userName, this.password, this.dir, this.xmlDir, this.packageName, tableNames);    }​    /**     *     * 生成器核心部分     *     * @param serviceNameStartWithI 是否前缀I     * @param createController      是否生成controller     * @param useLombok             是否使用 lombok     * @param dbUrl                 数据库连接     * @param username              用户名称     * @param password              密码     * @param outDir                输出目录     * @param xmlDir                xml 文件目录     * @param packageName           包路径     * @param tableNames            表名称     */    private static void codingMysql(boolean serviceNameStartWithI,                                    boolean createController,                                    boolean useLombok,                                    String dbUrl,                                    String username,                                    String password,                                    String outDir,                                    String xmlDir,                                    String packageName,                                    String... tableNames) {        GlobalConfig config = new GlobalConfig();        DataSourceConfig dataSourceConfig = new DataSourceConfig();//        数据库类型 这里使用 mysql        dataSourceConfig.setDbType(DbType.MYSQL)                .setUrl(dbUrl)                .setUsername(username)                .setPassword(password)//                驱动名称  这里使用mysql                .setDriverName("com.mysql.jdbc.Driver");​        // 自定义xml输出路径        InjectionConfig cfg = new InjectionConfig() {            @Override            public void initMap() {                // to do nothing            }        };        List focList = new ArrayList<>();//        你也可以定制 xml 的模板        focList.add(new FileOutConfig("/templates/mapper.xml.ftl") {            @Override            public String outputFile(TableInfo tableInfo) {                // 自定义xml文件的路径                return xmlDir + "/mapper/" + tableInfo.getMapperName() + StringPool.DOT_XML;            }        });        cfg.setFileOutConfigList(focList);​​//        策略配置项        StrategyConfig strategyConfig = new StrategyConfig();        strategyConfig                .setCapitalMode(false)//                是否使用 lombok                .setEntityLombokModel(useLombok)//                下划线转驼峰                .setNaming(NamingStrategy.underline_to_camel)                //修改替换成你需要的表名,多个表名传数组                .setInclude(tableNames);//        使用 AR 模式        config.setActiveRecord(true)//                设置头注释的 author                .setAuthor("system")//                项目输出路径                .setOutputDir(outDir)//                是否覆盖已经生成的同名文件                .setFileOverride(true)//                雪花算法生成id                .setIdType(IdType.ASSIGN_ID)//                是否使用缓存                .setEnableCache(false)//                是否生成 xml 中的 基础 resultMap                .setBaseResultMap(true);        if (!serviceNameStartWithI) {//            Service 层的 通用格式后缀            config.setServiceName("%sService");        }//             实体类包名        PackageConfig packageConfig = new PackageConfig().setParent(packageName).setEntity("entity");        TemplateConfig templateConfig = new TemplateConfig().setXml(null);//        这里选择不生成 controller  实际上 生成的大多不符合我们需要  到服务层就行了        if (!createController) {            templateConfig.setController(null);        }//        整合起来运行        new AutoGenerator()                .setGlobalConfig(config)                .setTemplateEngine(new FreemarkerTemplateEngine())                .setDataSource(dataSourceConfig)                .setStrategy(strategyConfig)                .setPackageInfo(packageConfig)                .setCfg(cfg)                .setTemplate(templateConfig)                .execute();    }​}​

如果我生成的目录结构能够满足你的需要,那就巧了,直接拿去用;如果不满足需要,你可以按照注释的说明进行微调。18年搞的用了好几年,没出过什么乱子。

4. 代码生成器的使用

使用起来非常简单,确保数据库能够使用JDBC连接成功,写个main方法,配置一下,跑起来就是了:

/** * @author felord.cn * @since 11:34 **/public class AutoCoding {    public static void main(String[] args) {​//          maven 工程 main 包的全路径        final String mainDir = "C:IdeaProjectsbc-recylingsrcmain";​        CodeGenerator.ConfigBuilder builder = new CodeGenerator.ConfigBuilder();​        CodeGenerator codeGenerator = builder//                数据库连接                .dbUrl("jdbc:mysql://localhost:3306/test")//                账户                .userName("root")//                密码                .password("123456")                // 生成类位置                .dir(mainDir + "java")                // 生成xml 位置                .xmlDir(mainDir + "resources")                // 包引用路径                .packageName("cn.felord.mybatis")                .build();​        //根据表生成后台代码        codeGenerator.code("user_info");​​    }}

然后代码就生成了,是不是非常的好用?恭喜你获得了 时间管理大师 荣誉称号。

切记不要炫耀,否则需求加倍。

5. 总结

虽然好用,但是建议新手不要使用,多手写一下代码。另外复杂的SQL还是建议自己写,多锻炼写SQL的能力。如果你在使用中有什么问题,可以私信我进行沟通。如果你有更加好用的可以通过留言分享给广大条友。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/542565.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++ websocket客户端_websocket使用

websocket使用一、介绍在项目开发过程中&#xff0c;很多时候&#xff0c;我们不可避免的需要实现的一个功能&#xff1a; 服务端实时发送信息给客户端。比如实时公告、实时订单通知、实时报警推送等等&#xff0c;登录后的客户端需要知道与它相关的实时信息&#xff0c;以便进…

在cordova中使用HTML5的多文件上传

2019独角兽企业重金招聘Python工程师标准>>> 我们先看看linkface给开放的接口&#xff1a; 字段类型必需描述api_idstring是API 账户api_secretstring是API 密钥selfie_filefile见下方注释需上传的图片文件 1&#xff0c;上传本地图片进行检测时选取此参数selfie_ur…

linux常用命令和配置

2019独角兽企业重金招聘Python工程师标准>>> 启动php&#xff1a; /etc/init.d/php-fpm restart 查看PHP运行目录&#xff1a; which php /usr/bin/php 查看php-fpm进程数&#xff1a; ps aux | grep -c php-fpm 查看运行内存 /usr/bin/php -i|grep mem iptables如…

centos7时间同步_centos 8.x系统配置chrony时间同步服务

centos 8.x系统配置chrony时间同步服务CentOS 7.x默认使用的时间同步服务为ntp服务&#xff0c;但是CentOS 8开始在官方的仓库中移除了ntp软件&#xff0c;换成默认的chrony进行时间同步的服务&#xff0c;chrony既可以作为客户端向其他时间服务器发送时间同步请求&#xff0c;…

ICWAI和ICWA的完整形式是什么?

ICWAI / ICWA&#xff1a;印度成本与工程会计师协会/印度儿童福利法 (ICWAI / ICWA: Institute of Cost and Works Accountants of India / Indian Child Welfare Act) 1)ICWAI&#xff1a;印度成本与工程会计师协会 (1) ICWAI: Institute of Cost and Works Accountants of In…

crontab 日志_liunx 中定时清理过期日志文件

问题描述经常遇到日志文件过多&#xff0c;占用大量磁盘空间&#xff0c;需要定期删除过期日志。问题涉及方面删除过期日志的脚本。定时任务删除任务脚本先查询到过期的日志文件&#xff0c;然后删除。语法find path -option [ -print ] [ -exec -ok command ] …

将搜索二叉树转换为链表_将给定的二叉树转换为双链表(DLL)

将搜索二叉树转换为链表Given a Binary tree and we have to convert it to a Doubly Linked List (DLL). 给定二叉树&#xff0c;我们必须将其转换为双链表(DLL)。 Algorithm: 算法&#xff1a; To solve the problem we can follow this algorithm: 为了解决这个问题&#…

cuda编程_CUDA刷新器:CUDA编程模型

CUDA刷新器&#xff1a;CUDA编程模型 CUDA Refresher: The CUDA Programming Model CUDA&#xff0c;CUDA刷新器&#xff0c;并行编程 这是CUDA更新系列的第四篇文章&#xff0c;它的目标是刷新CUDA中的关键概念、工具和初级或中级开发人员的优化。 CUDA编程模型提供了GPU体系结…

java 逻辑表达式 布尔_使用基本逻辑门实现布尔表达式

java 逻辑表达式 布尔将布尔表达式转换为逻辑电路 (Converting Boolean Expression to Logic Circuit) The simplest way to convert a Boolean expression into a logical circuit is to follow the reverse approach in which we start from the output of the Boolean expre…

python自然语言处理书籍_精通Python自然语言处理pdf

自然语言处理&#xff08;NLP&#xff09;是有关计算语言学与人工智能的研究领域之一。NLP主要关注人机交互&#xff0c;它提供了计算机和人类之间的无缝交互&#xff0c;使得计算机在机器学习的帮助下理解人类语言。 本书详细介绍如何使用Python执行各种自然语言处理&#xff…

通达oa 2013 php解密,通达OA漏洞学习 - 安全先师的个人空间 - OSCHINA - 中文开源技术交流社区...

说明通达OA漏洞在去年上半年已爆出&#xff0c;这不趁着周末没事做&#xff0c;将源码下载下来进行复现学习。文件包含测试文件包含检测&#xff0c;payload1:ip/ispirit/interface/gateway.php?json{"url":"/general/../../mysql5/my.ini"}利用文件包含访…

公众号 -「前端攻略 开光篇」

作为一枚程序员&#xff0c;每件重要项目的开始都忍不住使用"Hello World"。 这个公众号是不是来晚了&#xff1f;如果你有这个疑问&#xff0c;那么我想说&#xff1a;对于写作和思考&#xff0c;任何时候都不晚。我用四个简单的自问自答&#xff0c;来讲讲这个前端…

matlab中求模最大,matlab求取模极大值时出错

本帖最后由 Nate_ 于 2016-4-17 15:57 编辑points1024 时&#xff0c;有波形输出&#xff0c;但信号有5438个点。改为5438就不行。主程序&#xff1a;%小波模极大值重构是采用的交替投影法close all;points5438; level4; sr360; num_inter6; wfdb4;%所处理数据的…

【分享】linux下u盘使用

2019独角兽企业重金招聘Python工程师标准>>> linux下u盘使用 方案一&#xff1a; Linux不像Windows一样&#xff0c;接上新硬件后可以自动识别&#xff0c;在Linux下无法自动识别新硬件的&#xff0c;需要手动去识别。USB移动存储设备通常被识别为sda1&#xff0c;…

swift 3.0 中使用 xib

文章写于2016年9月底&#xff0c;Xcode 8&#xff0c;swift 3.0真是蛋疼&#xff0c;折腾了很长时间&#xff0c;试了网上很多教程&#xff0c;结果又莫名的可以了&#xff01; 1.方法和OC中一样 将一个xib文件和一个ViewController类进行关联的几步操作&#xff1a; command &…

numpy 归一化_NumPy 数据归一化、可视化

仅使用 NumPy&#xff0c;下载数据&#xff0c;归一化&#xff0c;使用 seaborn 展示数据分布。下载数据import numpy as npurl https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.datawid np.genfromtxt(url, delimiter,, dtypefloat, usecols[1])仅提取…

puppeteer api_使用Node.js和puppeteer API从URL创建PDF文件

puppeteer apiWe will continue using Node.js and puppeteer which is a node library. As we saw in our last article, Puppeteer is a Node library developed by Google and provides a high-level API for developers. 我们将继续使用Node.js和puppeteer(这是一个节点库)…

servlet的由来

2019独角兽企业重金招聘Python工程师标准>>> 动静态网页技术 首先说下访问网页的大概过程&#xff1a; 你在浏览器中输入网址&#xff0c;按下enter键&#xff0c;此时浏览器代你做了很多事&#xff0c;简要说为&#xff1a;将你输入的这个网址作为目的地参数&#…

php header 文件大小,php获取远程文件大小及信息的函数(head_php

php获取远程文件大小及信息的函数(header头信息获取)阿里西西Alixixi.com开发团队在做一个客户系统时&#xff0c;需要做远程下载的功能&#xff0c;并实时显示进度条效果。所以&#xff0c;需要预先读取远程文件的大小信息&#xff0c;然后做为实时下载进度条的参数。功能函数…

第四次作业 孙保平034 李路平029

用C编写一个学生成绩管理系统 1、可以实现以下功能&#xff1a; cout<<"〓〓〓〓〓〓〓〓〓★ ☆ 1.增加学生成绩 ☆ ★〓〓〓〓〓〓〓〓〓"<<endl; 2、用链表存储信息 * 程序头部的注释结束 3、约定的规范&#xff1a; 1界面设计简介&#xff0c;人性化…