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

yizhihongxing

下面我会详细介绍一下如何使用 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日

相关文章

  • Spring 实现数据库读写分离的示例

    Spring 实现数据库读写分离的完整攻略 什么是数据库读写分离? 数据库读写分离(Database Read-Write Separation),简称DB读写分离,是将数据库的读操作和写操作分开,将读操作集中到一个或多个只读数据库节点上,将写操作集中到一个或多个主数据库节点上,从而达到提高数据库性能和扩展能力的目的。读写分离是一种常见的数据库架构和优化方案…

    Java 2023年5月20日
    00
  • java 创建线程的四种方式

    当需要创建多个任务并行执行时,我们可以通过创建线程来实现。Java中创建线程有四种方式,分别是继承Thread类、实现Runnable接口、实现Callable接口并使用FutureTask包装器把Callable装载成一个线程、使用Executor框架创建线程池。下面依次介绍这四种方式: 继承Thread类 我们可以继承Thread类并重写run()方法实…

    Java 2023年5月18日
    00
  • Eclipse代码格式化设置简单介绍

    下面我将详细讲解“Eclipse代码格式化设置简单介绍”的完整攻略,包括操作步骤和示例说明。 简介 在编写代码的过程中,代码的格式化会对阅读和后期维护带来很大的影响,因此,我们应该保证代码格式的规范性和统一性。Eclipse提供了一系列的代码格式化设置,可以方便地帮助我们格式化代码。 操作步骤 以下是Eclipse代码格式化设置的操作步骤: 打开Eclips…

    Java 2023年6月15日
    00
  • Java反射学习 getClass()函数应用

    Java反射是指在程序运行时动态地查找、加载、使用类和方法的能力。在Java反射中,getClass()函数是非常重要的一个函数。本文将为大家详细讲解Java反射学习中getClass()函数的应用。 什么是getClass()函数? 在Java语言中,所有的对象在运行时都拥有一个getClass()函数。这个函数可以用来获取当前对象的类型信息,返回值是Cl…

    Java 2023年5月26日
    00
  • jsp 开发之struts2中s:select标签的使用

    JSP开发之Struts2中S:select标签的使用 在Struts2中使用s:select标签可以方便地创建下拉框,通过本文,您可以了解s:select标签的使用方法,包括其属性和示例。 基本语法 <s:select name="selectName" list="listValue" value=&quot…

    Java 2023年6月15日
    00
  • Java实现宠物商店管理系统

    Java实现宠物商店管理系统完整攻略 1. 需求分析 首先,我们需要明确商店管理系统所具备的功能,包括但不限于以下几个方面: 宠物信息管理 宠物类别管理 宠物销售管理 宠物库存管理 宠物订单管理 2. 系统设计 基于需求,我们可以设计出宠物商店管理系统的基本架构,其中包括以下几个模块: 宠物信息管理模块 宠物类别管理模块 宠物销售管理模块 宠物库存管理模块 …

    Java 2023年5月24日
    00
  • Jersey框架的统一异常处理机制分析

    Jersey框架是JavaEE官方提供的RESTful web服务框架,它提供了丰富的功能和易用的API,帮助开发人员快速构建RESTful web服务。在实际应用中,由于外部请求的多变性,我们难以避免出现各种异常情况。为了提高应用程序的健壮性和可维护性,Jersey框架提供了完善的异常处理机制。下面将结合具体案例,给大家详细讲解Jersey框架的统一异常处…

    Java 2023年5月19日
    00
  • 详解SpringBoot实现fastdfs防盗链功能的示例代码

    以下是“详解SpringBoot实现fastdfs防盗链功能的示例代码”的完整攻略: 防盗链功能概念 防盗链技术可以防止其他站点盗链本站的内容,从而保证网站安全及资源不被滥用。在FastDFS中,通过配置nginx.conf文件实现防盗链。 安装配置FastDFS 首先,需要在本地或服务器上安装并配置FastDFS。可以参考FastDFS官网及论坛的相关文档…

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