作者:admin,发布日期:2021-03-21
阅读:1646;评论:0

什么是AutoGenerator

AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。

在SpringBoot中AutoGenerator

首先需要安装mybaits-plus,作为数据库访问基础,在pom.xml中加入以下内容

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.2</version>
</dependency>

安装完成后,就可以开始安装mybaits-plus代码生成器,安装的同时需要安装模板引擎(AutoGenerator默认使用的是velocity模板引擎)

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.4.1</version>
</dependency>
<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>
    <version>2.3</version>
</dependency>

接着创建生成器类,为其添加main方法便于我们运行

此文件为我自己编写好的代码,自己编写时可以参考官网的代码进行自定义。

https://mp.baomidou.com/guide/generator.html

package com.example.demo.generator;

import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;

public class CodeGenerator {
    public static void main(String[] args) {
//        创建AutoGenerator
        AutoGenerator generator = new AutoGenerator();
//        创建全局配置实体
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setOutputDir(System.getProperty("user.dir") + "/src/main/java"); // 输出目录
        globalConfig.setOpen(false); // 生成后是否打开目录
        globalConfig.setAuthor("FanHuaCloud"); // 设置作者,将会显示在生成的类注释中
        globalConfig.setFileOverride(false); // 设置是否覆盖原有文件
        generator.setGlobalConfig(globalConfig); // 将设置应用到generator上

//        创建数据源配置实体,用于自动生成实体类
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setUrl(""); // 设置数据源url
        dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver"); // 设置数据库驱动
        dataSourceConfig.setUsername(""); // 设置用户名
        dataSourceConfig.setPassword(""); // 设置密码
        generator.setDataSource(dataSourceConfig); // 将设置应用到generator上

//        创建数据表策略实体
        StrategyConfig strategyConfig = new StrategyConfig();
        strategyConfig.setInclude("emp"); // 设置需要生成的表,与exclude二选一配置
        strategyConfig.setEntityLombokModel(true); // 设置实体类是否使用lombok
        strategyConfig.setEntitySerialVersionUID(false); // 设置实体类是否添加SerialVersionUID
        strategyConfig.setNaming(NamingStrategy.underline_to_camel);
        generator.setStrategy(strategyConfig); // 将设置应用到generator上

//        包配置
        PackageConfig packageConfig = new PackageConfig();
        packageConfig.setParent("com.example.demo");// 设置父包名
        generator.setPackageInfo(packageConfig);// 将设置应用到generator上

        // 模板设置
        TemplateConfig templateConfig = new TemplateConfig();
        templateConfig.disable(TemplateType.CONTROLLER, TemplateType.XML); // 不生成指定的模板
        generator.setTemplate(templateConfig); // 将设置应用到generator上

        // 开始生成
        generator.execute();
    }
}

运行测试

Snipaste_2021-03-21_16-39-15.jpg

Snipaste_2021-03-21_16-39-26.jpg

运行后即可发现程序已经按照我们的代码生成了正确的文件,我们可以使用junit来测试一下mybaits-plus内置方法

package com.example.demo;


import com.example.demo.entity.Emp;
import com.example.demo.service.IEmpService;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;
import java.util.List;

@Slf4j
@SpringBootTest
class DemoApplicationTests {
    @Resource
    private IEmpService empService;

    @Test
    public void testEmpSelect() {
        List<Emp> list = empService.list();
        log.info(String.valueOf(list));
    }
}

Snipaste_2021-03-21_16-42-03.jpg

关于mapper文件的位置

当使用生成器创建mapper的xml文件时,默认此文件会被创建在mapper/xml下面,而此目录中的文件在maven打包时不会将其打包进去(不过eclipse貌似会打包进去),这就导致实际使用中无法加载mapper.xml。

解决方法就是在resources中创建mapper文件夹,然后把所有的xml文件复制到里面,这样就可以正常加载了。

Snipaste_2021-03-21_16-45-59.jpg

默认的mapper.xml目录可以在MybatisPlusProperties中找到

private String[] mapperLocations = new String[]{"classpath*:/mapper/**/*.xml"};

当然我们也可以在配置中对其进行设置:

mybatis-plus:
  mapper-locations: classpath*:/mapper/**/*.xml

关于mybaits xml中配置的sql返回的map字段不全的问题

在配置中开启call-setters-on-nulls来解决这个问题

mybatis-plus:
  configuration:
    call-setters-on-nulls: true

指定当结果集中值为 null 的时候是否调用映射对象的 Setter(Map 对象时为 put)方法,通常运用于有 Map.keySet() 依赖或 null 值初始化的情况。 

通俗的讲,即 MyBatis 在使用 resultMap 来映射查询结果中的列,如果查询结果中包含空值的列,则 MyBatis 在映射的时候,不会映射这个字段,这就导致在调用到该字段的时候由于没有映射,取不到而报空指针异常。 当您遇到类似的情况,请针对该属性进行相关配置以解决以上问题。