文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

mybatis plus自动生成器的示例分析

2023-06-29 11:30

关注

这篇文章将为大家详细讲解有关mybatis plus自动生成器的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

mybatis plus自动生成器解析

使用这个可以超快速生成entity service controller层

1.加入依赖

模板引擎的依赖也要导入,不然运行会报错的

<dependency>        <groupId>com.baomidou</groupId>        <artifactId>mybatis-plus-generator</artifactId>        <version>3.3.1.tmp</version>    </dependency>    <dependency>        <groupId>org.freemarker</groupId>        <artifactId>freemarker</artifactId>        <version>2.3.30</version>    </dependency>

2.写一个类,作为自动生成器的入口

mybatis plus自动生成器的示例分析

这里的时候,一定一定要把import的包也复制,不然很容易出错

package van.generator;import java.util.ArrayList;import java.util.List;import java.util.Scanner;import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;import com.baomidou.mybatisplus.core.toolkit.StringPool;import com.baomidou.mybatisplus.core.toolkit.StringUtils;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.po.TableInfo;import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;public class CodeGenerator {        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 + "!");    }        public static void main(String[] args) {        // 代码生成器        AutoGenerator mpg = new AutoGenerator();        // 全局配置        GlobalConfig gc = new GlobalConfig();        String projectPath = System.getProperty("user.dir");        gc.setOutputDir(projectPath + "/ad-sponsor/src/main/java/van");        gc.setAuthor("van");        gc.setOpen(false);        mpg.setGlobalConfig(gc);        // 数据源配置        DataSourceConfig dsc = new DataSourceConfig();        dsc.setUrl("jdbc:mysql://localhost:3306/ad?useUnicode=true&serverTimezone=GMT&useSSL=false&characterEncoding=utf8");        // dsc.setSchemaName("public");        dsc.setDriverName("com.mysql.jdbc.Driver");        dsc.setUsername("root");        dsc.setPassword("321asd");        mpg.setDataSource(dsc);        // 包配置        PackageConfig pc = new PackageConfig();        pc.setModuleName(scanner("模块名"));        pc.setParent("com.baomidou.mybatisplus.samples.generator");        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) {                // 自定义输入文件名称                return projectPath + "/mybatis-plus-sample-generator/src/main/resources/mapper/" + pc.getModuleName()                        + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;            }        });        cfg.setFileOutConfigList(focList);        mpg.setCfg(cfg);        mpg.setTemplate(new TemplateConfig().setXml(null));        // 策略配置        StrategyConfig strategy = new StrategyConfig();        strategy.setNaming(NamingStrategy.underline_to_camel);        strategy.setColumnNaming(NamingStrategy.underline_to_camel);        strategy.setSuperEntityClass("com.baomidou.mybatisplus.samples.generator.common.BaseEntity");        strategy.setEntityLombokModel(true);        strategy.setSuperControllerClass("com.baomidou.mybatisplus.samples.generator.common.BaseController");        strategy.setInclude(scanner("表名"));        strategy.setSuperEntityColumns("id");        strategy.setControllerMappingHyphenStyle(true);        strategy.setTablePrefix(pc.getModuleName() + "_");        mpg.setStrategy(strategy);        // 选择 freemarker 引擎需要指定如下加,注意 pom 依赖必须有!        mpg.setTemplateEngine(new FreemarkerTemplateEngine());        mpg.execute();    }}

3.修改代码

1.全局配置

mybatis plus自动生成器的示例分析

2.数据源配置

mybatis plus自动生成器的示例分析

3.包配置

mybatis plus自动生成器的示例分析

3.运行

mybatis plus自动生成器的示例分析

讲解一下

1.首先运行这里

要求输入的模块名是生成的entity等的上层包名,我这里输入的是sys如上图所示

mybatis plus自动生成器的示例分析

2.全局配置这里

mybatis plus自动生成器的示例分析

是指定要生成的地方(模块名)

mybatis plus自动生成器的示例分析

3.数据源配置没啥说的,填入正确信息即可

4.包配置

mybatis plus自动生成器的示例分析

mybatis plus代码生成器使用及注意事项

Mybatis-plus的代码生成器是mybatis-plus组件的,并不是mybatis的,注意不要看错,这里会介绍代码生成器的主要用法以及需要注意的事项。

1.添加maven依赖

Mybatis-plus的代码生成器在3.0.3之后就独立出来,与mybatis-plus分开了,所以使用高版本的mybatis-plus的同学要注意,代码生成器要单独引入,如果是使用低版本的,不需要额外引用,这里使用的是按照官方文档的3.1.2版本,

mybatis plus自动生成器的示例分析

mybatis plus自动生成器的示例分析

<?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.code.generator</groupId>    <artifactId>code-generator</artifactId>    <version>1.0-SNAPSHOT</version>    <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>    </build>     <dependencies>        <dependency>            <groupId>com.baomidou</groupId>            <artifactId>mybatis-plus-generator</artifactId>            <version>3.1.2</version>        </dependency>           <!-- velocity 模板引擎, 默认 -->        <!-- https://mvnrepository.com/artifact/org.apache.velocity/velocity-engine-core -->        <dependency>            <groupId>org.apache.velocity</groupId>            <artifactId>velocity-engine-core</artifactId>            <version>2.0</version>        </dependency>          <!-- freemarker 模板引擎 -->        <!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->        <dependency>            <groupId>org.freemarker</groupId>            <artifactId>freemarker</artifactId>            <version>2.3.28</version>        </dependency>         <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->        <dependency>            <groupId>oracle.jdbc</groupId>            <artifactId>ojdbc6</artifactId>            <version>11.2.0.2.0</version>        </dependency>          <!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-core</artifactId>            <version>4.3.20.RELEASE</version>        </dependency>          <dependency>            <groupId>org.slf4j</groupId>            <artifactId>slf4j-log4j12</artifactId>            <version>1.7.25</version>            <scope>compile</scope>        </dependency>      </dependencies> </project>

2.编写代码生成器的类

依赖好了之后就可以开始编写我们的代码生成器,代码生成器主要有几部分的配置,具体配置的说明参考代码注释

(1)全局配置

(2)包名配置

(3)数据源配置

(4)输出模板

(5)自定义配置

(6)生成策略

import com.baomidou.mybatisplus.annotation.DbType;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 java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;  public class CodeGenerator {    public static void main(String[] args) {        AutoGenerator mpg = new AutoGenerator();                 final GlobalConfig gc = new GlobalConfig();        gc.setOutputDir("E://output");//输出文件路径        gc.setFileOverride(true);        gc.setActiveRecord(false);// 不需要ActiveRecord特性的请改为false        //gc.setEnableCache(false);// XML 二级缓存        //gc.setBaseResultMap(true);// XML ResultMap        //gc.setBaseColumnList(false);// XML columList        gc.setAuthor("simple");// 作者gc.setSwagger2(true);         // 自定义文件命名,注意 %s 会自动填充表实体属性!        gc.setControllerName("%sController");        gc.setServiceName("%sService");        gc.setServiceImplName("%sServiceImpl");        gc.setMapperName("%sMapper");        mpg.setGlobalConfig(gc);                 final PackageConfig pc = new PackageConfig();        //设置包名        pc.setParent("com.code.generator");        pc.setController("system.web");        pc.setService("system.service");        pc.setServiceImpl("system.service.impl");        pc.setMapper("system.mapper");        pc.setEntity("domain.po");        mpg.setPackageInfo(pc);                 DataSourceConfig dsc = new DataSourceConfig();        dsc.setDbType(DbType.ORACLE);        dsc.setDriverName("oracle.jdbc.driver.OracleDriver");//TODO        dsc.setUsername("user");//TODO        dsc.setPassword("password");//TODO        dsc.setUrl("jdbc:oracle:thin:@ip:host:db");        mpg.setDataSource(dsc);                 TemplateConfig templateConfig = new TemplateConfig();         // 配置自定义输出模板        //指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别,默认vm,xml不输出        templateConfig.setEntity("myTemplates/entity.java");        templateConfig.setService("myTemplates/service.java");        templateConfig.setServiceImpl("myTemplates/serviceImpl.java");        templateConfig.setController("myTemplates/controller.java");        templateConfig.setMapper("myTemplates/mapper.java");        templateConfig.setXml(null);        mpg.setTemplate(templateConfig);                 InjectionConfig cfg = new InjectionConfig() {            @Override            public void initMap() {                Map<String, Object> map = new HashMap<String, Object>();                map.put("tableComment", "系统用户");                map.put("Handler", pc.getParent()+".system.handler");                map.put("SuperHandler", "com.code.generator.core.base.BaseHandler");                map.put("SuperHandlerName", "BaseHandler");                map.put("vo", pc.getParent()+".domain.vo");                this.setMap(map);            }        };         // 自定义输出配置        List<FileOutConfig> focList = new ArrayList<>();        // 自定义handler        focList.add(new FileOutConfig("myTemplates/handler.java.vm") {            @Override            public String outputFile(TableInfo tableInfo) {                return gc.getOutputDir() + "/com/code/generator/handler/"                        + tableInfo.getEntityName()+"Handler" + StringPool.DOT_JAVA;            }        });        // 自定义provider        focList.add(new FileOutConfig("myTemplates/provider.java.vm") {            @Override            public String outputFile(TableInfo tableInfo) {                return gc.getOutputDir() + "/com/code/generator/mapper/provider/"                        + tableInfo.getEntityName()+"Provider" + StringPool.DOT_JAVA;            }        });         // 自定义vo        focList.add(new FileOutConfig("myTemplates/vo.java.vm") {            @Override            public String outputFile(TableInfo tableInfo) {                return gc.getOutputDir() + "/com/code/generator/domain/vo/"                        + tableInfo.getEntityName()+"Vo" + StringPool.DOT_JAVA;            }        });         cfg.setFileOutConfigList(focList);        mpg.setCfg(cfg);                   StrategyConfig strategy = new StrategyConfig();        //过滤表前缀        strategy.setTablePrefix(new String[] { "T_" });        //类名生成策略:驼峰命名        strategy.setNaming(NamingStrategy.underline_to_camel);        //字段名生成方式:驼峰命名        strategy.setColumnNaming(NamingStrategy.underline_to_camel);        //需要生成的表        strategy.setInclude(new String[] { "T_SYS_USER" });        strategy.setCapitalMode(true);        //controller是否restful风格        strategy.setRestControllerStyle(true);         //配置继承的父类        strategy.setSuperEntityClass("com.code.generator.po.BaseDomain");        strategy.setSuperEntityColumns("ID","ISVALID","CREATORID","CREATEDTIME","MODIFYID","MODIFYTIME","PACKAGEID");        strategy.setSuperControllerClass("com.code.generator.core.base.BaseController");        strategy.setSuperServiceClass("com.code.generator.core.base.BaseService");        strategy.setSuperServiceImplClass("com.code.generator.impl.core.base.BaseServiceImpl");        strategy.setSuperMapperClass("com.code.generator.impl.core.base.BaseMapper");        mpg.setStrategy(strategy);          // 执行生成        mpg.execute();     } }

3.自定义输出模板

mybatis-plus-generator的jar包里面有原生的模板文件,在jar包的templates目录下,btl对应的是beetl模板引擎,ftl对应freemarker模板引擎,vm对应的是velocity模板引擎,默认是vm,如果想更改使用的引擎可以通过setTemplateEngine方法设置,模板中的全局变量可以参考下面方法里面的变量com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine#getObjectMap

mybatis plus自动生成器的示例分析

mybatis plus自动生成器的示例分析

如果不想使用原生的模板,可以编写自己的模板,基于原生模板修改,新的模板要放在resources下面,注意写的时候不要加上模板文件的后缀,会根据引擎自动识别,如果不想输出对应的文件,需要设置为null,否则会拿jar包下面原生的模板生成。

//指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别,默认vm,xml不输出templateConfig.setEntity("myTemplates/entity.java");templateConfig.setXml(null);

mybatis plus自动生成器的示例分析

4.自定义参数模板

(1)自定义参数

代码生成器中提供了一些模板参数,如果需要定制化自己的模板可能需要一些自定义的参数可以在这里添加,在模板中可以通过${cfg.key}来使用

mybatis plus自动生成器的示例分析

(2)自定义模板

原生提供的有controller、service、serviceImpl、dao、mapper、entity六种生成模板,如果我们还需要输出其他的一些模板文件,可以通过以下方式来输出,与TemplateConfig配置不一样,这里模板的路径需要加上后缀,还需要指定输出路径。

mybatis plus自动生成器的示例分析

到这里,代码生成器就可以工作了,但是还有一些小缺陷在其他的文章中没有提到,下面再提两点

5.关于日志输出

在代码生成器中实际上是有生成过程的日志输出的,如果配置不正确也会有对应的提示,但是在很多的教程里面都没有提到这一点,控制台都提示log4j异常了。

mybatis plus自动生成器的示例分析

关于日志,实际上在模板引擎中就有log4j的api包引入了,但是log4j还需要有对应的实现才能输出日志,所以会提示上图的异常,因此在上面我的依赖中还加入了slf4j-log4j12的实现依赖

mybatis plus自动生成器的示例分析

mybatis plus自动生成器的示例分析

这时候我们再来运行,发现还会报错,这是因为缺少log4j的properties文件,下面我们建立一个log4j.properties文件,注意文件名不要改,就叫这个名字,配置内容参考下面的,也可以用你常用的,具体配置的属性自行查找吧

mybatis plus自动生成器的示例分析

mybatis plus自动生成器的示例分析

log4j.rootLogger=DEBUG, stdoutlog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

上面该补的补完之后我们就可以看到代码生成器的控制台日志了

mybatis plus自动生成器的示例分析

6.关于字段类型转换

代码生成器在生成字段信息的时候会从数据库获取表字段信息,根据一定的规则来生成字段,如果不想使用原生的字段信息,可以自定义自己的规则,在这里我使用的是Oracle数据库,在配置数据源的时候有两个方法setDbQuery和setTypeConvert,前者是获取数据库字段信息的sql,后者是数据库字段类型与java字段类型的映射规则,下面我们看一下源码的实现看看是如何转换的

mybatis plus自动生成器的示例分析

(1)获取字段信息

在这里可以看到对于Oracle在处理Number类型字段的时候是做了处理的,不像mysql,很多时候我们会直接使用number来代表各种数字类型,如double、decimal等,这里会根据number的字段长度、小数位来进行组装然后提供给后面字段映射来进行处理,所以我们在设计的时候要注意,该定义长度就定义长度,该定义小数位就定义小数位,尽量不要直接用number或者number(*,0)这样的方式来定义,否则在后面映射的时候回当成Double处理,但实际上我们想要的是Integer,不然生成之后你就只能手工修改,或者自定义自己的转换规则来适配

SELECTA.COLUMN_NAME,CASEWHEN A.DATA_TYPE = 'NUMBER' THEN(CASEWHEN A.DATA_PRECISION IS NULL THENA.DATA_TYPE WHEN NVL( A.DATA_SCALE, 0 ) > 0 THENA.DATA_TYPE || '(' || A.DATA_PRECISION || ',' || A.DATA_SCALE || ')' ELSE A.DATA_TYPE || '(' || A.DATA_PRECISION || ')' END ) ELSE A.DATA_TYPE END DATA_TYPE,B.COMMENTS,DECODE( C.POSITION, '1', 'PRI' ) KEY FROMALL_TAB_COLUMNS AINNER JOIN ALL_COL_COMMENTS B ON A.TABLE_NAME = B.TABLE_NAME AND A.COLUMN_NAME = B.COLUMN_NAME AND B.OWNER = 'USER'--schemaLEFT JOIN ALL_CONSTRAINTS D ON D.TABLE_NAME = A.TABLE_NAME AND D.CONSTRAINT_TYPE = 'P' AND D.OWNER = 'USER'--schemaLEFT JOIN ALL_CONS_COLUMNS C ON C.CONSTRAINT_NAME = D.CONSTRAINT_NAME AND C.COLUMN_NAME = A.COLUMN_NAME AND C.OWNER = 'USER' --schemaWHEREA.OWNER = 'USER' --schemaAND A.TABLE_NAME = 'T_SYS_USER' ORDER BYA.COLUMN_ID

(2)字段类型映射

字段类型映射我们关注点还是对于number的处理,其他类型都是直接映射过去的,在这里可以看到是使用了正则表达式对number的字段长度进行匹配来区分Integer、Long、Double,如果没有小数位,长度小于10的则为Integer,否则为Long,否则一律按Double处理,所以在定义Number的时候就注意按实际来吧,不要贪图方便或者偷懒,否则生成之后Entity、xml都要做相应的修改。

mybatis plus自动生成器的示例分析

关于“mybatis plus自动生成器的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯