zoukankan      html  css  js  c++  java
  • MP实战系列(六)之代码生成器讲解

    MP的代码生成器可谓用"简洁"二字,来形容。

    我个人觉得jeesite的代码生成器都不一定比它好用。当然也是由于我个人的习惯。

    只需一键执行main方法,就可以生成对应的项目文件,含entity,dao,service,serviceImpl,Controller及其xml文件。

    当然这里我要提一下,自动生成的entity继承的是一个Model类。

    下面先贴一下代码生成器如何生成代码的步骤:

    1.导入依赖

    
    

    <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>cn.mybatis-plus</groupId>
    <artifactId>mybaits-plus-generator</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencies>
    <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus -->
    <dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus</artifactId>
    <version>2.1.8</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.velocity/velocity -->
    <dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity</artifactId>
    <version>1.6.4</version>
    </dependency>
    <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.19</version>
    </dependency>
    <!-- Mysql -->
    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.38</version>
    </dependency>


    </dependencies>

    
    

    <build>
    <plugins>

    
    

    <!-- 指定编译版本 -->
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
    <source>1.8</source>
    <target>1.8</target>
    </configuration>
    </plugin>

    
    

    </plugins>
    <finalName>${project.artifactId}</finalName>
    </build>

    
    

    </project>

     

    2.创建类

    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import com.baomidou.mybatisplus.enums.FieldFill;
    import com.baomidou.mybatisplus.generator.AutoGenerator;
    import com.baomidou.mybatisplus.generator.InjectionConfig;
    import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
    import com.baomidou.mybatisplus.generator.config.FileOutConfig;
    import com.baomidou.mybatisplus.generator.config.GlobalConfig;
    import com.baomidou.mybatisplus.generator.config.PackageConfig;
    import com.baomidou.mybatisplus.generator.config.StrategyConfig;
    import com.baomidou.mybatisplus.generator.config.TemplateConfig;
    import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
    import com.baomidou.mybatisplus.generator.config.po.TableFill;
    import com.baomidou.mybatisplus.generator.config.po.TableInfo;
    import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
    import com.baomidou.mybatisplus.generator.config.rules.DbType;
    import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
    
    /**
     * Created by ehomeud on 2017/4/26.
     */
    
    public class AutoGeneratorHelper{
           public static void main(String[] args) {
                // 自定义需要填充的字段
                List<TableFill> tableFillList = new ArrayList<>();
                tableFillList.add(new TableFill("ASDD_SS", FieldFill.INSERT_UPDATE));
    
                // 代码生成器
                AutoGenerator mpg = new AutoGenerator().setGlobalConfig(
                        // 全局配置
                        new GlobalConfig()
                                .setOutputDir("D://代码生成器")//输出目录
                                .setFileOverride(true)// 是否覆盖文件
                                .setActiveRecord(true)// 开启 activeRecord 模式
                                .setEnableCache(false)// XML 二级缓存
                                .setBaseResultMap(true)// XML ResultMap
                                .setBaseColumnList(true)// XML columList
                                .setAuthor("youcong")
                        // 自定义文件命名,注意 %s 会自动填充表实体属性!
                         
                         .setMapperName("%sDao")
                         .setXmlName("%sDao")
                         .setServiceName("%sService")
                         .setServiceImplName("%sServiceImpl")
                         .setControllerName("%sController")
                ).setDataSource(
                        // 数据源配置
                        new DataSourceConfig()
                                .setDbType(DbType.MYSQL)// 数据库类型
                                .setTypeConvert(new MySqlTypeConvert() {
                                    // 自定义数据库表字段类型转换【可选】
                                    @Override
                                    public DbColumnType processTypeConvert(String fieldType) {
                                        System.out.println("转换类型:" + fieldType);
                                        // if ( fieldType.toLowerCase().contains( "tinyint" ) ) {
                                        //    return DbColumnType.BOOLEAN;
                                        // }
                                        return super.processTypeConvert(fieldType);
                                    }
                                })
                                .setDriverName("com.mysql.jdbc.Driver")
                                .setUsername("root")
                                .setPassword("1234")
                                .setUrl("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8")
                ).setStrategy(
                        // 策略配置
                        new StrategyConfig()
                                // .setCapitalMode(true)// 全局大写命名
                                // .setDbColumnUnderline(true)//全局下划线命名
                                .setTablePrefix(new String[]{"sys_", "tb_"})// 此处可以修改为您的表前缀
                                .setNaming(NamingStrategy.underline_to_camel)// 表名生成策略
                                
                                // .setInclude(new String[] { "user" }) // 需要生成的表
                                // .setExclude(new String[]{"test"}) // 排除生成的表
                                // 自定义实体父类
                                // .setSuperEntityClass("com.baomidou.demo.TestEntity")
                                // 自定义实体,公共字段
                                
                               // .setSuperEntityColumns(new String[]{"id"})
                                .setTableFillList(tableFillList)
                        // 自定义 mapper 父类
                        // .setSuperMapperClass("com.baomidou.demo.TestMapper")
                        // 自定义 service 父类
                       //  .setSuperServiceClass("com.baomidou.demo.TestService")
                        // 自定义 service 实现类父类
                      //    .setSuperServiceImplClass("com.baomidou.demo.TestServiceImpl")
                        // 自定义 controller 父类
                    //      .setSuperControllerClass("com.baomidou.demo.TestController")
                        // 【实体】是否生成字段常量(默认 false)
                        // public static final String ID = "test_id";
                        // .setEntityColumnConstant(true)
                        // 【实体】是否为构建者模型(默认 false)
                        // public User setName(String name) {this.name = name; return this;}
                        // .setEntityBuilderModel(true)
                        // 【实体】是否为lombok模型(默认 false)<a href="https://projectlombok.org/">document</a>
                        // .setEntityLombokModel(true)
                        // Boolean类型字段是否移除is前缀处理
                        // .setEntityBooleanColumnRemoveIsPrefix(true)
                        // .setRestControllerStyle(true)
                        // .setControllerMappingHyphenStyle(true)
                ).setPackageInfo(
                        // 包配置
                        new PackageConfig()
                        /*        .setModuleName("test")*/
                                .setParent("com.lms")// 自定义包路径
                                .setController("controller")// 这里是控制器包名,默认 web
                ).setCfg(
                        // 注入自定义配置,可以在 VM 中使用 cfg.abc 设置的值
                        new InjectionConfig() {
                            @Override
                            public void initMap() {
                                Map<String, Object> map = new HashMap<>();
                                map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");
                                this.setMap(map);
                            }
                        }.setFileOutConfigList(Collections.<FileOutConfig>singletonList(new FileOutConfig("/templates/mapper.xml.vm") {
                            // 自定义输出文件目录
                            @Override
                            public String outputFile(TableInfo tableInfo) {
                                return "D://代码生成器//xml/" + tableInfo.getEntityName() + ".xml";
                            }
                        }))
                ).setTemplate(
                        // 关闭默认 xml 生成,调整生成 至 根目录
                        new TemplateConfig().setXml(null)
                        // 自定义模板配置,模板可以参考源码 /mybatis-plus/src/main/resources/template 使用 copy
                        // 至您项目 src/main/resources/template 目录下,模板名称也可自定义如下配置:
                        // .setController("...");
                        // .setEntity("...");
                        // .setMapper("...");
                        // .setXml("...");
                        // .setService("...");
                        // .setServiceImpl("...");
                );
    
                // 执行生成
                mpg.execute();
    
                // 打印注入设置,这里演示模板里面怎么获取注入内容【可无】
                System.err.println(mpg.getCfg().getMap().get("abc"));
            }
    
    }

    总而言之,一共两步,导入依赖,创建类,这个类主要是执行main方法,生成一系列代码。

    导入的依赖,简单的说,一个是java连接mysql必须的,另外一个是日志,再另外一个是我们的mybatis plus,还有一个就是我们的velocity。

    volocity模板引擎,同freemarker一样,都可以做一个模板,像entity,dao,service,serviceImpl及其Controller,就那三板斧,直接可通过模板生成。

    生成的代码几乎和自己通过手写基本是一样的,唯一不一样的就是速度。当然还有一个区别就是实体,文章开头我也强调过,实体继承一个model类,这个model类我想里面应该封装不了不少玩意。

  • 相关阅读:
    如何从维护视图(Maintenace view)中取数据-[VIEW_GET_DATA]
    如何使用ref->*,field-symbols创建内表
    预制发票MIR7抬头行项目检查BADi-MRM_HEADER_CHECK
    如何跳转屏幕到MIGO-[MIGO_DIALOG]
    网络编程聊天室------客户端接收
    网络编程聊天室------客户端发送
    网络编程聊天室------客户端
    网络编程聊天室---------服务器线程类
    网络编程聊天室----服务器端
    小明滚出---响应对象HttpServletResponse和请求对象HttpServletRequest实例
  • 原文地址:https://www.cnblogs.com/youcong/p/9043051.html
Copyright © 2011-2022 走看看