mybatis plus自动生成器解析(及遇到的坑)

下面我会详细介绍一下如何使用 MyBatis-Plus 自动生成器,以及在使用过程中可能会遇到哪些坑。

一、MyBatis-Plus 自动生成器概述

MyBatis-Plus 自动生成器是一种通过模板自动生成代码的快速开发工具。它可以根据定义的实体类和模板,自动生成增删改查的 Dao 文件、实体类文件、服务接口文件以及部分控制器文件等。

二、如何使用 Mybatis-Plus 自动生成器

  1. 配置自动生成器

在 pom.xml 文件中引入 MyBatis-Plus 自动生成器的依赖:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.0.6</version>
</dependency>

在 resources 文件夹下创建generator.properties配置文件,指定生成配置。具体配置项可以参考官方文档:MyBatis-Plus 自动生成器配置项

  1. 编写 Entity

在项目中编写对应的Entity:java文件即可。Entity类中应当包含对应表的字段以及getter、setter方法。同时在 Entity 类中添加 @TableName 注解,指定对应数据库表名。

@Data
@TableName("user")
public class User {
    @TableId(value = "id",type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
}
  1. 编写模板

在项目中创建对应的模板文件,例如 Mapper.xml.ftl 文件用于生成 Mapper 类文件。模板里面可以包含对应增删改查的 sql 语句。

模板文件示例 mapper.xml.ftl:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="${mapperPackage}.${entityName}Mapper">
\t<resultMap id="BaseResultMap" type="${entityPackage}.${entityName}">
\t\t<id column="id" property="id" />
\t\t<result column="name" property="name" />
\t\t<result column="age" property="age" />
\t</resultMap>

\t<sql id="Base_Column_List">
\t\tid, name, age
\t</sql>

\t<select id="selectById" resultMap="BaseResultMap" parameterType="java.lang.Long">
\t\tselect * from user where id = #{id}
\t</select>

</mapper>
  1. 运行 MyBatis-Plus 自动生成器

在项目中运行 MyBatis-Plus 自动生成器指令即可快速生成对应的代码文件:

public static void main(String[] args) {
    AutoGenerator mpg = new AutoGenerator();
    //全局配置
    GlobalConfig gc = new GlobalConfig();
    gc.setOutputDir(outputDir);
    gc.setAuthor(author);
    gc.setOpen(false);
    gc.setSwagger2(true);
    gc.setBaseResultMap(true);
    gc.setBaseColumnList(true);

    mpg.setGlobalConfig(gc);
    mpg.setDataSource(dataSourceConfig);
    mpg.setPackageInfo(pkgConfig);

    // 配置自动生成器
    mpg.setCfg(injectionConfig);
    // 配置模板
    TemplateConfig tc = new TemplateConfig();
    tc.setXml(null);
    mpg.setTemplate(tc);
    // 配置策略
    StrategyConfig strategy = new StrategyConfig();
    // 表名下划线转驼峰命名
    strategy.setNaming(NamingStrategy.underline_to_camel);
    strategy.setColumnNaming(NamingStrategy.underline_to_camel);

    strategy.setEntityLombokModel(true);
    strategy.setRestControllerStyle(true);
    // 公共父实体
    strategy.setSuperEntityColumns("id");
    strategy.setSuperControllerClass("com.example.demo.controller.base.BaseController");//父类controller
    strategy.setSuperEntityClass("com.example.demo.entity.base.BaseEntity");//父类entity
    strategy.setInclude("user");//需要生成的表名
    mpg.setStrategy(strategy);

    mpg.execute();
}

这样就可以快速生成对应的 Dao、Service、Controller、Entity 等基础代码文件。

三、可能遇到的坑

1. 数据库表名与实体类名不匹配

如果数据表名和实体类名不一致,需要在 Entity 类上通过 @TableName 注解指定对应的数据表名。若不指定,则会按照默认的驼峰命名规则自动匹配。

2. 数据库字段名与实体类属性名不匹配

如果数据库表字段名与实体类属性名不一致,需要在 Entity 类上通过 @TableField 注解 指定对应的数据库字段名,若不指定,则会按照默认的驼峰命名规则自动匹配。

3. 复杂查询的sql语句自动生成会存在问题

Mybatis-plus 自动生成器只能生成简单的增删改查的 sql 语句,一些复杂的查询语句需要手写。

四、示例

示例一

例如以下代码可以生成对应的user表的增删改查操作代码:

public class AutoGeneratorApplication {
    public static void main(String[] args) {
        AutoGenerator mpg = new AutoGenerator();
        //全局配置
        GlobalConfig gc = new GlobalConfig();
        gc.setOutputDir("/Users/baiyyang/Documents/pri/daily-practice/mybatis-plus-example/src/main/java");
        gc.setAuthor("byYang");
        gc.setOpen(false);
        gc.setSwagger2(true);
        gc.setBaseResultMap(true);
        gc.setBaseColumnList(true);
        mpg.setGlobalConfig(gc);

        //数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/mybatis-plus-example?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8");
        // dsc.setSchemaName("public");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("root");
        mpg.setDataSource(dsc);

        //包配置
        PackageConfig pc = new PackageConfig();
        pc.setParent("com.yangbai");
        mpg.setPackageInfo(pc);

        // 配置自动生成器
        mpg.setCfg(getInjectionConfig());
        // 配置模板
        TemplateConfig tc = new TemplateConfig();
        tc.setXml(null);
        mpg.setTemplate(tc);
        // 配置策略
        StrategyConfig strategy = new StrategyConfig();
        // 表名下划线转驼峰命名
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);

        strategy.setEntityLombokModel(true);
        strategy.setRestControllerStyle(true);
        // 公共父实体
        strategy.setSuperEntityColumns("id");
        strategy.setSuperControllerClass("com.yangbai.controller.base.BaseController");//父类controller
        strategy.setSuperEntityClass("com.yangbai.entity.base.BaseEntity");//父类entity
        strategy.setInclude("user");//需要生成的表名
        mpg.setStrategy(strategy);

        mpg.execute();
        System.out.println("finish");
    }

    /**
     * 自定义配置
     * @return
     */
    private static InjectionConfig getInjectionConfig(){
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                Map<String, Object> map = new HashMap<>();
                this.setMap(map);
            }
        };
        String templatePath = "/templates/mapper.xml.ftl";
        List<FileOutConfig> focList = new ArrayList<>();
        focList.add(new FileOutConfig(templatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输出文件名, 如果Entity设置了前后缀、此处注意xml的名称会跟着发生变化
                System.out.println(tableInfo.getEntityName());
                return "/Users/baiyyang/Documents/pri/daily-practice/mybatis-plus-example/src/main/resources/mapper/" + tableInfo.getEntityName() + "Mapper.xml";
            }
        });

        cfg.setFileOutConfigList(focList);
        return cfg;
    }
}

示例二

下面是generator.properties的配置示例:

# 全局配置
config.author=byy表示作者
config.outputDir=/Users/baiyyang/Documents/pri/daily-practice/mybatis-plus-example/src/main/java
config.fileOverride=false

# 数据源配置
dataSource.dbName=mybatis-plus-example
dataSource.type=com.alibaba.druid.pool.DruidDataSource
dataSource.driverName=com.mysql.cj.jdbc.Driver
dataSource.url=jdbc:mysql://localhost:3306/mybatis-plus-example?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
dataSource.username=root
dataSource.password=root

# 包配置
package.basePackage=com.yangbai
package.entityName=entity
package.mapperName=mapper
package.serviceName=service
package.controllerName=controller

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:mybatis plus自动生成器解析(及遇到的坑) - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • java使用RestTemplate封装post请求方式

    以下为Java使用RestTemplate封装Post请求的攻略: 步骤一:添加依赖 在你的Java项目中,需要使用Maven等依赖管理工具添加RestTemplate的依赖: <dependency> <groupId>org.springframework</groupId> <artifactId>spr…

    Java 2023年5月26日
    00
  • DUBBO 日志过滤器,输出dubbo 接口调用入参、出参等信息(最新推荐)

    下面我将详细讲解如何使用Dubbo日志过滤器来输出Dubbo接口调用入参、出参等信息。 1. Dubbo日志过滤器 Dubbo是一款高性能的分布式服务框架,但在实际的开发过程中,我们有时需要输出一些Dubbo接口的调用信息,例如调用的入参、调用的出参等。 Dubbo提供了日志过滤器的功能,我们可以通过日志过滤器来输出Dubbo接口的调用信息。Dubbo提供了…

    Java 2023年5月26日
    00
  • maven打包成第三方jar包且把pom依赖包打入进来的方法

    下面是详细讲解“maven打包成第三方jar包且把pom依赖包打入进来的方法”的完整攻略。 1. maven打包成第三方jar包的基本操作 在maven项目的根目录下执行以下命令: mvn clean package 执行上述命令即可将项目打包成jar包,同时在target目录下生成一个 xxx.jar 文件,这就是我们要的第三方jar包。 2. 把pom依…

    Java 2023年5月19日
    00
  • java类型生命周期的详细解析

    Java类型生命周期的详细解析 Java语言的类型生命周期包括了以下几个阶段:加载(Loading)、链接(Linking)、初始化(Initialization)、使用(Usage)和卸载(Unloading)。在本文中,我们将详细解析Java类型生命周期的每个阶段。 1. 加载 加载阶段是指Java虚拟机(JVM)在需要使用一个类型时,会首先检查该类型是…

    Java 2023年5月26日
    00
  • 送电子书福利啦!

    过去若干年,一边工作编程,一边思考提炼,写了一些关于“写整洁业务代码”的文章,在随笔分类“代码修行”下。有一天在公司文档空间分享时,突然想到:可以制作一本电子书,将过往的重要经验总结起来,也是对自己十年编程生涯的一个阶段性回顾,作为继续前进的阶梯。 我的第一本电子书 书名:《代码修行:一步一步写出整洁的业务代码》 链接: https://pan.baidu.…

    Java 2023年5月7日
    00
  • Java中常见的日期操作(取值、转换、加减、比较)

    Java中日期操作是常见的编程场景之一,本文将详细介绍Java中常见的日期操作,包括日期的取值、转换、加减、比较等方面的知识。 日期的取值 在Java中,我们可以使用java.util.Date或java.sql.Date类获取系统的当前日期和时间。其中,java.util.Date表示的是时间戳,而java.sql.Date则表示日期。 // 获取当前日期…

    Java 2023年5月20日
    00
  • Java判断两个日期相差天数的方法

    下面我来详细讲解“Java判断两个日期相差天数的方法”的完整攻略。 1. 获取两个日期对象 首先需要获取两个日期对象,可以使用Java中的日期类——java.util.Date或java.time.LocalDate。这里提供两种方式: 1.1 使用java.util.Date Date date1 = new SimpleDateFormat("…

    Java 2023年5月20日
    00
  • Java毕业设计实战之财务预算管理系统的实现

    Java毕业设计实战之财务预算管理系统的实现 1. 确定项目需求 在设计财务预算管理系统之前,我们需要先明确项目需求,对整个系统的功能、架构、流程等方面有一个清晰的认识。一般而言,一个财务预算管理系统应该包括以下几个方面的功能: 用户登录和权限管理 预算制定和管理功能 预算执行和监控功能 预算分析和报告功能 针对以上需求,我们可以进行一个详细的需求分析,并制…

    Java 2023年5月24日
    00
合作推广
合作推广
分享本页
返回顶部