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 是开发自定义维护,无需改动!

相关推荐
老毛肚11 分钟前
手写mybatis
java·数据库·mybatis
码农阿豪27 分钟前
Flask应用上下文问题解析与解决方案:从错误日志到完美修复
后端·python·flask
威迪斯特35 分钟前
Flask:轻量级Web框架的技术本质与工程实践
前端·数据库·后端·python·flask·开发框架·核心架构
毕设源码-钟学长1 小时前
【开题答辩全过程】以 基于Springboot的扶贫众筹平台为例,包含答辩的问题和答案
java·spring boot·后端
程序员良许2 小时前
三极管推挽输出电路分析
后端·嵌入式
Java水解2 小时前
【JAVA 进阶】Spring AOP核心原理:JDK与CGLib动态代理实战解析
后端·spring
Java水解2 小时前
Spring Boot 4 升级指南:告别RestTemplate,拥抱现代HTTP客户端
spring boot·后端
宫水三叶的刷题日记2 小时前
工商银行今年的年终奖。。
后端
大黄评测2 小时前
双库协同,各取所长:.NET Core 中 PostgreSQL 与 SQLite 的优雅融合实战
后端
Java编程爱好者2 小时前
Java 后端定时任务怎么选:@Scheduled、Quartz 还是 XXL-Job?
后端