• Spring Boot整合MybatisPlus逆向工程(MySQL/PostgreSQL)


      MyBatis-Plus是MyBatis的增强工具,Generator通过MyBatis-Plus快速生成Entity、Mapper、Mapper XML、Service、Controller等模块的代码,方便快捷。

      一、创建表

      我们先创建数据库表:sys_log、sys_user

    CREATE TABLE `sys_log` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `username` varchar(50) DEFAULT NULL COMMENT '用户名',
      `operation` varchar(50) DEFAULT NULL COMMENT '用户操作',
      `method` varchar(200) DEFAULT NULL COMMENT '请求方法',
      `params` varchar(5000) DEFAULT NULL COMMENT '请求参数',
      `time` bigint(20) NOT NULL COMMENT '执行时长(毫秒)',
      `ip` varchar(64) DEFAULT NULL COMMENT 'IP地址',
      `create_date` datetime DEFAULT NULL COMMENT '创建时间',
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE=InnoDB AUTO_INCREMENT=66720 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
    
    CREATE TABLE `sys_user` (
      `id` varchar(255) NOT NULL,
      `company_id` varchar(64) NOT NULL COMMENT '归属公司',
      `office_id` varchar(64) NOT NULL COMMENT '归属部门',
      `login_name` varchar(30) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '唯一登录名',
      `password` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '密码',
      `no` varchar(100) DEFAULT NULL COMMENT '工号',
      `name` varchar(100) NOT NULL COMMENT '姓名',
      `email` varchar(200) DEFAULT NULL COMMENT '邮箱',
      `phone` varchar(200) DEFAULT NULL COMMENT '电话',
      `mobile` varchar(200) DEFAULT NULL COMMENT '手机',
      `user_type` char(1) DEFAULT NULL COMMENT '用户类型',
      `photo` varchar(1000) DEFAULT NULL COMMENT '用户头像',
      `login_ip` varchar(100) DEFAULT NULL COMMENT '最后登陆IP',
      `login_date` datetime DEFAULT NULL COMMENT '最后登陆时间',
      `login_flag` varchar(64) DEFAULT NULL COMMENT '是否可登录',
      `create_by` varchar(64) NOT NULL COMMENT '创建者',
      `create_time` datetime NOT NULL COMMENT '创建时间',
      `update_by` varchar(64) NOT NULL COMMENT '更新者',
      `update_date` datetime NOT NULL COMMENT '更新时间',
      `remarks` varchar(255) DEFAULT NULL COMMENT '备注信息',
      `del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '删除标记',
      `device_alias` varchar(255) DEFAULT NULL,
      `device_type` varchar(255) DEFAULT NULL,
      `token` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`id`) USING BTREE,
      KEY `sys_user_office_id` (`office_id`) USING BTREE,
      KEY `sys_user_login_name` (`login_name`) USING BTREE,
      KEY `sys_user_company_id` (`company_id`) USING BTREE,
      KEY `sys_user_update_date` (`update_date`) USING BTREE,
      KEY `sys_user_del_flag` (`del_flag`) USING BTREE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='用户表';

      二、创建Spring Boot工程

      创建SpringBoot项目,网上很多教程,这里不再赘述,小伙伴也可以点击这里查看。

      三、引入逆向工程依赖

      MyBatis-Plus本来是集成了代码生成器的,但是在3.0.3以后的版本移除了对应的依赖,需要我们手动添加相关的依赖:

            <!--就不需要手动引入mybatis -->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus</artifactId>
                <version>3.3.2</version>
            </dependency>
            <!--mybatisplus 代码生成器-->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-generator</artifactId>
                <version>3.3.2</version>
            </dependency>    

      添加模板引擎:

            <!-- 模板引擎 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>5.1.5.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>5.1.5.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>5.1.5.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.apache.velocity</groupId>
                <artifactId>velocity</artifactId>
                <version>1.7</version>
            </dependency>    

      全部依赖如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.gaspipn.app</groupId>
        <artifactId>Generator</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <!--<name>GeneratorCommon</name>
        <description>GeneratorCommon</description>-->
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.0.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
            <mybatisplus.spring.boot.version>1.0.5</mybatisplus.spring.boot.version>
            <mybatisplus.version>2.2.0</mybatisplus.version>
            <mysql.version>8.0.11</mysql.version>
            <mssql.version>4.0</mssql.version>
            <oracle.version>11.2.0.3</oracle.version>
            <druid.version>1.1.10</druid.version>
            <quartz.version>2.3.0</quartz.version>
            <commons.lang.version>2.6</commons.lang.version>
            <commons.fileupload.version>1.2.2</commons.fileupload.version>
            <commons.io.version>2.5</commons.io.version>
            <commons.codec.version>1.10</commons.codec.version>
            <commons.configuration.version>1.10</commons.configuration.version>
            <shiro.version>1.4.0</shiro.version>
            <jwt.version>0.7.0</jwt.version>
            <kaptcha.version>0.0.9</kaptcha.version>
            <qiniu.version>[7.2.0, 7.2.99]</qiniu.version>
            <aliyun.oss.version>2.8.3</aliyun.oss.version>
            <qcloud.cos.version>4.4</qcloud.cos.version>
            <swagger.version>2.7.0</swagger.version>
            <joda.time.version>2.9.9</joda.time.version>
            <fastjson.version>1.2.47</fastjson.version>
            <hutool.version>4.1.1</hutool.version>
    
            <!--wagon plugin 配置-->
            <service-path>/work/renren</service-path>
            <pack-name>${project.artifactId}-${project.version}.jar</pack-name>
            <remote-addr>localhost:22</remote-addr>
            <remote-username>root</remote-username>
            <remote-passwd>123456</remote-passwd>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>2.1.14.RELEASE</version>
            </dependency>
            <!-- 模板引擎 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>5.1.5.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-jdbc</artifactId>
                <version>5.1.5.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>5.1.5.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.apache.velocity</groupId>
                <artifactId>velocity</artifactId>
                <version>1.7</version>
            </dependency>
            <!--就不需要手动引入mybatis -->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus</artifactId>
                <version>3.3.2</version>
            </dependency>
            <!--mybatisplus 代码生成器-->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-generator</artifactId>
                <version>3.3.2</version>
            </dependency>
            <!-- mysql依赖 -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.45</version>
            </dependency>
            <!-- 连接池和fastjson -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.0.31</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.51</version>
            </dependency>
            <!-- lombok模型 -->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.16.20</version>
            </dependency>
            <!--slf4j-->
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
                <version>1.6.1</version>
            </dependency>
            <!-- swagger -->
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger2</artifactId>
                <version>2.10.5</version>
            </dependency>
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger-ui</artifactId>
                <version>2.10.5</version>
            </dependency>
            <dependency>
                <groupId>io.swagger</groupId>
                <artifactId>swagger-annotations</artifactId>
                <version>1.5.24</version>
            </dependency>
            <dependency>
                <groupId>io.swagger</groupId>
                <artifactId>swagger-models</artifactId>
                <version>1.5.24</version>
            </dependency>
    
            <!--postgresql数据库-->
            <dependency>
                <groupId>org.postgresql</groupId>
                <artifactId>postgresql</artifactId>
            </dependency>
        </dependencies>
    
    </project>

      四、代码中完成逆向工程配置

      代码里面的注释已经很全面,就不再进行代码的详细解析了,如下:

    package com.johan.generator;
    
    import com.baomidou.mybatisplus.annotation.DbType;
    import com.baomidou.mybatisplus.generator.AutoGenerator;
    import com.baomidou.mybatisplus.generator.InjectionConfig;
    import com.baomidou.mybatisplus.generator.config.*;
    import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
    import com.baomidou.mybatisplus.generator.config.po.TableInfo;
    import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
    import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
    import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
    
    import java.io.File;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * @author JohanChan
     * @ProjectName Generator
     * @Description MySQL/PostGre 生成演示
     * @time 2021/7/7 16:49
     */
    public class GeneratorCommon {
        /**
         * <p> Mr.Chen
         * MySQL/PostGre 生成演示
         * </p>
         */
    
        //获取 项目绝对路径
        private static String canonicalPath = "";
    
        public static void main(String[] args) {
    
            //获取项目路径
            try {
                canonicalPath = new File("").getCanonicalPath();
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println("canonicalPath=" + canonicalPath);
    //        String filePath = canonicalPath+"\mybatisPlusGer\src\main\";
            String filePath = canonicalPath + "\src\main\";
    
            AutoGenerator mpg = new AutoGenerator();
            // 选择 freemarker 引擎,默认 Veloctiy
            //mpg.setTemplateEngine(new FreemarkerTemplateEngine());
    
            // 全局配置
            GlobalConfig gc = new GlobalConfig();
            gc.setAuthor("Johan");//作者名
            gc.setSwagger2(true); //实体属性 Swagger2 注解
            gc.setOutputDir(filePath + "java");//代码生成路径
            gc.setFileOverride(true);// 是否覆盖同名文件,默认是false
            gc.setActiveRecord(true);// 不需要ActiveRecord特性的请改为false
            gc.setEnableCache(false);// XML 二级缓存
            gc.setBaseResultMap(true);// XML ResultMap
            gc.setBaseColumnList(false);// XML columList
            gc.setOpen(false);//生成后打开文件夹
            /* 自定义文件命名,注意 %s 会自动填充表实体属性! */
            gc.setControllerName("%sController");
            gc.setServiceName("%sService");
            gc.setServiceImplName("%sServiceImpl");
            gc.setMapperName("%sMapper");
            gc.setXmlName("%sMapper");
            mpg.setGlobalConfig(gc);
    
            // 数据源配置
            DataSourceConfig dsc = new DataSourceConfig();
            //指定数据库类型,DbType中有对应的枚举类型,pom文件中要添加对应的数据库引用
            dsc.setDbType(DbType.MYSQL);//MySQL数据库
    //        dsc.setDbType(DbType.POSTGRE_SQL);//PostGre数据库
            dsc.setTypeConvert(new MySqlTypeConvert() {
                // 自定义数据库表字段类型转换【可选】
                @Override
                public IColumnType processTypeConvert(GlobalConfig gc, String fieldType) {
                    System.out.println("转换类型:" + fieldType);
                    // 注意!!processTypeConvert 存在默认类型转换,如果不是你要的效果请自定义返回、非如下直接返回。
                    //默认会把日期类型 转为LocalDateTime ,在查询的时候会报错,这里改为Date
                    String t = fieldType.toLowerCase();
                    if (t.contains("date") || t.contains("time") || t.contains("year")) {
                        return DbColumnType.DATE;
                    } else {
                        return super.processTypeConvert(gc, fieldType);
                    }
                }
            });
            //数据库连接配置
            dsc.setDriverName("com.mysql.jdbc.Driver");
    //      dsc.setDriverName("com.mysql.cj.jdbc.Driver"); //mysql8.0使用
            dsc.setUsername("root");
            dsc.setPassword("123456");
            dsc.setUrl("jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8");
    
            //PostGre数据库连接
            /*dsc.setDriverName("org.postgresql.Driver");
            dsc.setUsername("postgres");
            dsc.setPassword("123456");
            dsc.setUrl("jdbc:postgresql://127.0.0.1:5432/sjz_db?characterEncoding=utf8");*/
    
            mpg.setDataSource(dsc);
    
            // 策略配置
            StrategyConfig strategy = new StrategyConfig();
            //strategy.setCapitalMode(true);// 全局大写命名 ORACLE 注意
            //strategy.setTablePrefix("tb_");// 此处可以修改为您的表前缀
            strategy.setNaming(NamingStrategy.underline_to_camel);// 表名生成策略
            strategy.setColumnNaming(NamingStrategy.underline_to_camel);//采用驼峰映射
            strategy.setEntityLombokModel(true);//【实体】是否为lombok模型(默认 false)
            strategy.setInclude(new String[]{"node","zy"}); // 需要生成的表.如果需要生成所有的, 注释掉此行就可以
            // strategy.setExclude(new String[]{"test"}); // 排除生成的表
    
            // 自定义实体父类
            // strategy.setSuperEntityClass("com.baomidou.demo.TestEntity");
            // 自定义实体,公共字段
            // strategy.setSuperEntityColumns(new String[] { "test_id", "age" });
            // 自定义 mapper 父类
            // strategy.setSuperMapperClass("com.baomidou.demo.TestMapper");
            // 自定义 service 父类
            // strategy.setSuperServiceClass("com.baomidou.demo.TestService");
            // 自定义 service 实现类父类
            // strategy.setSuperServiceImplClass("com.baomidou.demo.TestServiceImpl");
            // 自定义 controller 父类
            // strategy.setSuperControllerClass("com.baomidou.demo.TestController");
            // 【实体】是否生成字段常量(默认 false)
            // public static final String ID = "test_id";
            // strategy.setEntityColumnConstant(true);
            // 【实体】是否为构建者模型(默认 false)
            // public User setName(String name) {this.name = name; return this;}
            // strategy.setEntityBuilderModel(true);
            mpg.setStrategy(strategy);
    
            // 包配置
            PackageConfig pc = new PackageConfig();
            pc.setParent("com.johan.generator.manage.modules");// 自定义包路径
            pc.setController("controller");// 这里是控制器包名,默认 web
            pc.setMapper("mapper");// 设置Mapper包名,默认mapper
            pc.setService("service");// 设置Service包名,默认service
            pc.setEntity("model.entity");// 设置Entity包名,默认entity,继承的父类  已序列化
            pc.setXml("mapper.xml");// 设置Mapper XML包名,默认mapper.xml
            mpg.setPackageInfo(pc);
    
            // 注入自定义配置,可以在 VM 中使用 cfg.abc 设置的值
            InjectionConfig cfg = new InjectionConfig() {
                @Override
                public void initMap() {
                    Map<String, Object> map = new HashMap<String, Object>();
                    map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");
                    this.setMap(map);
                }
            };
            // 调整 xml 生成目录演示
            List<FileOutConfig> focList = new ArrayList<>();
    
            focList.add(new FileOutConfig("/templates/mapper.xml.vm") {
                @Override
                public String outputFile(TableInfo tableInfo) {
    
                    return filePath + "\resources\mapper\xml\" + tableInfo.getEntityName() + "Mapper.xml";
                }
            });
            cfg.setFileOutConfigList(focList);
            mpg.setCfg(cfg);
    
            // 注入自定义配置,可以在 VM 中使用 cfg.abc 【可无】
    //        InjectionConfig cfg = new InjectionConfig() {
    //            @Override
    //            public void initMap() {
    //                Map<String, Object> map = new HashMap<String, Object>();
    //                map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");
    //                this.setMap(map);
    //            }
    //        };
    //
    //        // 自定义 xxList.jsp 生成
    //        List<FileOutConfig> focList = new ArrayList<>();
    //        focList.add(new FileOutConfig("/template/list.jsp.vm") {
    //            @Override
    //            public String outputFile(TableInfo tableInfo) {
    //                // 自定义输入文件名称
    //                return "D://my_" + tableInfo.getEntityName() + ".jsp";
    //            }
    //        });
    //        cfg.setFileOutConfigList(focList);
    //        mpg.setCfg(cfg);
    //
    //        // 调整 xml 生成目录演示
    //        focList.add(new FileOutConfig("/templates/mapper.xml.vm") {
    //            @Override
    //            public String outputFile(TableInfo tableInfo) {
    //                return "/develop/code/xml/" + tableInfo.getEntityName() + ".xml";
    //            }
    //        });
    //        cfg.setFileOutConfigList(focList);
    //        mpg.setCfg(cfg);
    //
    //        // 关闭默认 xml 生成,调整生成 至 根目录
    //        TemplateConfig tc = new TemplateConfig();
    //        tc.setXml(null);
    //        mpg.setTemplate(tc);
    
            // 自定义模板配置,可以 copy 源码 mybatis-plus/src/main/resources/templates 下面内容修改,
            // 放置自己项目的 src/main/resources/templates 目录下, 默认名称一下可以不配置,也可以自定义模板名称
            // TemplateConfig tc = new TemplateConfig();
            // tc.setController("...");
            // tc.setEntity("...");
            // tc.setMapper("...");
            // tc.setXml("...");
            // tc.setService("...");
            // tc.setServiceImpl("...");
            // 如上任何一个模块如果设置 空 OR Null 将不生成该模块。
            // mpg.setTemplate(tc);
    
            // 执行生成
            mpg.execute();
        }
    }

      五、测试

      直接启动系统运行,运行结束后发现相关代码已经生成,如图:

       PS:在dsc.setDbType(DbType.MYSQL)这里需要指定数据库类型,对应的数据库配置要与类型向对应,否则会出现什么后果小伙伴们可以自行预测

  • 相关阅读:
    CodeIgniter(3.1.4)框架中成功/错误跳转
    CodeIgniter(3.1.4)框架-url重写,去除index.php
    CodeIgniter(3.1.4)框架中-使用多个公共控制器
    CodeIgniter(3.1.4)框架使用静态文件(js,css)
    PHP无限极分类
    PHP无限极分类
    spring中定时任务quartz2.2.3
    eclipse中git更新操作
    java中日期的换算处理
    使用spring-rabbit测试RabbitMQ消息确认(发送确认,接收确认)
  • 原文地址:https://www.cnblogs.com/JohanChan/p/14982870.html
Copyright © 2020-2023  润新知