Mybatis genarate 代码自动生成实战

前言

接触过后端三层架构设计思想的小伙伴应该都清楚,与数据库打交道的一层是 DAO 层,而在这一层大部分都是与业务逻辑无关的、对数据增删改查的操作。

针对这一特点,前辈们也非常聪明的进行了抽象,并关联数据表结构自动生成 DAO 层的 Model、Mapper 等结构,接下来本文将展示 mybatis 的代码自动生成实践。

实战

方式一:引入 mybatis-generator-core

1、在你的 Maven 项目的 pom.xml 文件中添加以下依赖:

xml 复制代码
<dependency>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-core</artifactId>
    <version>1.3.7</version>
</dependency>

2、自定义 generator-config.xml 文件:

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
    <context id="default" targetRuntime="MyBatis3">
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/mydb"
                        userId="myuser"
                        password="mypassword">
        </jdbcConnection>

        <javaModelGenerator targetPackage="org.mybatis.generator.domain" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <sqlMapGenerator targetPackage="mappers" targetProject="src/main/resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>

        <javaClientGenerator type="XMLMAPPER" targetPackage="org.mybatis.generator.dao.mapper" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>

        <table schema="mydb" tableName="mytable" domainObjectName="MyTable">
        </table>
    </context>
</generatorConfiguration>

各种配置都在这里定义,详见后文!

3、编写 java 代码生成:

java 复制代码
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;

import java.util.ArrayList;
import java.util.List;

public class MyBatisGeneratorTool {
    public static void main(String[] args) throws Exception {
        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        
        // 自定义配置文件
        File configFile = new File("generator-config.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(configFile);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);
    }
}

先创建一个 ConfigurationParser 对象来解析我们自定义配置文件。

然后,创建一个 DefaultShellCallback 对象,这个对象用于处理生成的文件的覆盖问题。

最后,创建一个 MyBatisGenerator 对象,并调用了它的 generate 方法来生成代码。

注意:需要根据实际情况修改上述代码中的配置文件路径。

方式二:插件包

1、引入插件包:

xml 复制代码
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.5</version>
                <configuration>
                    <verbose>true</verbose>
                    <overwrite>true</overwrite>
                    <configurationFile>src/main/resources/generator-config.xml</configurationFile>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>5.1.46</version>
                    </dependency>
                </dependencies>
            </plugin>

2、自定义 generator-config.xml 文件:

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
    <context id="default" targetRuntime="MyBatis3">
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/mydb"
                        userId="myuser"
                        password="mypassword">
        </jdbcConnection>

        <javaModelGenerator targetPackage="org.mybatis.generator.domain" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <sqlMapGenerator targetPackage="mappers" targetProject="src/main/resources">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>

        <javaClientGenerator type="XMLMAPPER" targetPackage="org.mybatis.generator.dao.mapper" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>

        <table schema="mydb" tableName="mytable" domainObjectName="MyTable">
        </table>
    </context>
</generatorConfiguration>

核心参数:

  • jdbcConnection:配置与数据库建立连接
  • sqlMapGenerator:指定 mapper 生成路径
  • javaModelGenerator:指定 domain 实体类生成路径
  • javaClientGenerator:指定 mapper 对应的 interface 接口生成路径
  • table:指定数据库表名,最终会根据此表字段生成。

3、命令行运行插件:

复制代码
mvn mybatis-generator:generate

当然,你也可以通过idea,找到对应模块,点击运行插件:

插件运行后,就会根据 generator-config.xml 配置的路径,生成对应的 mapper.xml文件、mapper接口、domain 实体类。

比较

引入 mybatis-generator-core 包和使用 mybatis-generator-maven-plugin 插件的主要区别,在于它们的使用场景和方式:

  1. mybatis-generator-core 包:是 MyBatis Generator 的核心库,包含了生成MyBatis 代码的所有核心类和接口,可以在 Java 代码中直接使用这个包来生成代码。这种方式比较灵活,通过在代码中动态地配置生成器,但需要自己编写代码来调用生成器。
  2. mybatis-generator-maven-plugin 插件:这是一个 Maven 插件,可以在 Maven 项目中直接使用,并不需要编写 Java 代码调用生成,直接运行插件就行。

在笔者的实战中,采用最多的是第二种插件的方式,更加方便!

改进

mapper.xml 和 extMapper.xml

先说结论:定义两个 mapper,分开维护!!!

一个是插件自动生成,一个是开发编写个性化的业务。

为什么?

试想,如果你都维护在一个 mapper 文件中,后续新增或更新某个字段,你需要手动维护 mapper.xml 文件,出错率极高!

如果是分开维护,mapper.xml 可以使用自动生成(原来的覆盖就行),extMapper.xml 是开发自定义维护,无需改动!

相关推荐
Victor35615 分钟前
Netty(20)如何实现基于Netty的WebSocket服务器?
后端
缘不易15 分钟前
Springboot 整合JustAuth实现gitee授权登录
spring boot·后端·gitee
Kiri霧21 分钟前
Range循环和切片
前端·后端·学习·golang
WizLC24 分钟前
【Java】各种IO流知识详解
java·开发语言·后端·spring·intellij idea
星星不打輰31 分钟前
SSM项目--SweetHouse 甜蜜蛋糕屋
java·spring·mybatis·ssm·springmvc
Victor35631 分钟前
Netty(19)Netty的性能优化手段有哪些?
后端
爬山算法38 分钟前
Netty(15)Netty的线程模型是什么?它有哪些线程池类型?
java·后端
白宇横流学长1 小时前
基于SpringBoot实现的冬奥会科普平台设计与实现【源码+文档】
java·spring boot·后端
Python编程学习圈2 小时前
Asciinema - 终端日志记录神器,开发者的福音
后端
bing.shao2 小时前
Golang 高并发秒杀系统踩坑
开发语言·后端·golang