当前位置: 首页 > wzjs >正文

网站开发时间表2022最近十大的新闻热点

网站开发时间表,2022最近十大的新闻热点,wordpress rockgroup,郑州市建设工程造价信息网引言 什么是 MyBatis Generator? MyBatis Generator (MBG) 是一个代码生成工具,专为 MyBatis 框架设计。它可以根据数据库表结构自动生成 Java 实体类、Mapper 接口、Mapper XML 文件以及 Example 类。通过使用 MBG,开发者可以显著减少编写…

引言

什么是 MyBatis Generator?

MyBatis Generator (MBG) 是一个代码生成工具,专为 MyBatis 框架设计。它可以根据数据库表结构自动生成 Java 实体类、Mapper 接口、Mapper XML 文件以及 Example 类。通过使用 MBG,开发者可以显著减少编写重复代码的工作量,提高开发效率,并确保代码的一致性和质量。

为什么需要使用 MyBatis Generator?
  1. 提高开发效率

    • 手动编写实体类、Mapper 接口和 XML 文件是一项繁琐且容易出错的任务。MBG 可以自动完成这些工作,让开发者可以专注于业务逻辑的实现。
  2. 减少错误

    • 自动生成的代码通常比手动编写的代码更一致且不易出错。MBG 生成的代码经过严格的测试,减少了因人为因素引入的错误。
  3. 一致性保证

    • 使用 MBG 生成的代码在风格和格式上保持一致,这有助于团队协作和代码维护。
  4. 快速响应变化

    • 当数据库结构发生变化时,只需重新运行 MBG 即可更新相应的 Java 代码,大大简化了维护工作。
  5. 支持多种数据库

    • MBG 支持多种数据库系统(如 MySQL、Oracle、PostgreSQL 等),使得跨数据库平台的应用开发更加方便。
本文的目标读者
  • 初学者:如果你是刚刚接触 MyBatis 或者对 MyBatis Generator 不太了解,这篇文章将帮助你从零开始学习如何使用 MBG。

  • 中级开发者:对于已经熟悉 MyBatis 但希望进一步提高开发效率的开发者,本文提供了详细的配置和使用指南,帮助你更好地利用 MBG 的功能。

  • 高级开发者:如果你已经在项目中使用过 MBG,但希望探索其更高级的功能(如自定义模板、插件等),本文也将提供一些进阶内容和最佳实践。

  • 项目经理和技术负责人:对于负责项目管理和技术决策的人员,本文可以帮助你了解 MBG 在项目中的应用价值,从而做出更好的技术选型和决策。

 

第一部分:MyBatis Generator 概述

1.什么是 MyBatis Generator?

定义和用途

MyBatis Generator (MBG) 是一个强大的代码生成工具,专为 MyBatis 框架设计。它可以根据数据库表结构自动生成 Java 实体类、Mapper 接口、Mapper XML 文件以及 Example 类。通过使用 MBG,开发者可以显著减少编写重复代码的工作量,提高开发效率,并确保代码的一致性和质量。

主要功能

  1. 生成 Java 实体类

    • 根据数据库表结构生成对应的 Java 实体类。
    • 支持基本的 CRUD 操作所需的字段和方法。
    • 可以配置是否生成构造函数、getter 和 setter 方法等。
  2. 生成 Mapper 接口

    • 生成包含基本 CRUD 操作(如 select, insert, update, delete)的 Mapper 接口。
    • 支持自定义方法的生成,可以通过插件扩展来实现更复杂的功能。
  3. 生成 Mapper XML 文件

    • 生成包含 SQL 语句映射的 XML 文件。
    • 包括基本的 SQL 语句(如 SELECT, INSERT, UPDATE, DELETE)。
    • 支持动态 SQL 生成,如 WHERE 子句的条件拼接。
  4. 生成 Example 类

    • 生成用于构建动态查询条件的 Example 类。
    • 通过 Example 类可以方便地构建复杂的查询条件,支持多条件组合。
  5. 支持多种数据库

    • 支持 MySQL、Oracle、PostgreSQL、SQL Server 等多种主流数据库系统。
    • 可以根据不同的数据库类型生成相应的 SQL 语句。
  6. 高度可配置

    • 通过 generatorConfig.xml 配置文件,可以灵活控制生成的内容和行为。
    • 支持配置目标包路径、表映射、生成选项等。
  7. 插件扩展

    • 支持自定义插件以扩展生成器的功能。
    • 可以通过插件实现更复杂的生成逻辑,如生成特定的业务逻辑代码。
  8. 模板定制

    • 支持自定义 Velocity 模板,以满足项目特定的需求。
    • 可以修改默认模板或创建新的模板,以生成符合项目规范的代码。
  9. 增量生成

    • 支持增量生成,即只生成新增或修改的表结构对应的代码。
    • 可以配置 overwrite 选项,决定是否覆盖已存在的文件。
  10. 集成到 CI/CD 流程

    • 可以轻松集成到持续集成和持续部署流程中。
    • 自动化生成代码,确保每次构建时代码的一致性和最新性。

2 MyBatis Generator 的优势

MyBatis Generator (MBG) 为开发者提供了多种优势,使其成为 MyBatis 项目中不可或缺的工具。以下是 MBG 的主要优势:

提高开发效率
  1. 自动化生成

    • MBG 可以自动生成 Java 实体类、Mapper 接口、Mapper XML 文件和 Example 类,这些通常是手动编写时非常繁琐且容易出错的部分。
    • 开发者可以将更多时间集中在业务逻辑的实现上,而不是重复的代码编写。
  2. 快速响应变化

    • 当数据库表结构发生变化时,只需重新运行 MBG 即可更新相应的 Java 代码,大大简化了维护工作。
    • 自动化生成确保了代码与数据库结构的一致性,减少了手动同步的工作量。
  3. 减少配置时间

    • 通过配置文件 generatorConfig.xml,可以一次性定义多个表的生成规则,避免了逐个手动配置的时间消耗。
    • 配置文件支持灵活的选项,可以根据项目需求进行调整。
减少重复代码
  1. 一致的代码风格

    • 自动生成的代码在风格和格式上保持一致,减少了因人为因素引入的错误。
    • 一致的代码风格使得团队协作更加顺畅,代码维护也变得更加简单。
  2. 避免手动错误

    • 手动编写大量相似的代码容易引入拼写错误、语法错误等,而 MBG 生成的代码经过严格的测试,减少了这类错误的发生。
    • 生成的代码通常比手动编写的代码更可靠,提高了代码的质量。
  3. 减少冗余代码

    • MBG 只生成必要的代码,避免了冗余和不必要的代码片段。
    • 通过配置文件,可以控制生成哪些方法和字段,进一步减少冗余代码。
一致性保证
  1. 统一的代码模板

    • MBG 使用预定义的模板生成代码,确保生成的代码在风格和格式上保持一致。
    • 可以通过自定义模板来满足项目的特定需求,但仍保持一致的代码风格。
  2. 易于维护

    • 一致的代码风格使得团队成员更容易理解和维护代码。
    • 当新的开发者加入项目时,一致的代码风格有助于他们更快地熟悉项目代码。
  3. 版本控制友好

    • 生成的代码可以轻松纳入版本控制系统(如 Git),便于团队协作和版本管理。
    • 生成器配置文件也可以纳入版本控制,确保所有团队成员使用相同的生成规则。
  4. 文档生成

    • 生成的代码通常包含注释和文档,帮助开发者理解代码的功能和用途。
    • 一致的文档风格也有助于提高代码的可读性和可维护性。

3 MyBatis Generator 的工作原理

生成器的架构

MyBatis Generator (MBG) 的架构设计使其能够高效地从数据库表结构生成 Java 代码。以下是 MBG 的主要组成部分及其功能:

  1. 配置文件 (generatorConfig.xml)

    • 定义了生成器的行为,包括数据库连接信息、目标包路径、表映射等。
    • 支持多种配置选项,如是否生成某些特定的方法(例如 selectByExample)。
  2. 数据库元数据读取

    • 从数据库中读取表结构、字段信息等元数据。
    • 支持多种数据库驱动,如 MySQL、Oracle、PostgreSQL 等。
  3. 代码生成器

    • 根据配置文件和数据库元数据生成 Java 实体类、Mapper 接口、Mapper XML 文件和 Example 类。
    • 支持自定义模板和插件扩展。
  4. 输出文件

    • 生成的代码文件被写入指定的目标包路径。
    • 包括 Java 实体类、Mapper 接口、Mapper XML 文件和 Example 类。
生成过程详解

以下是 MyBatis Generator 生成代码的详细过程:

  1. 读取配置文件

    • 生成器首先读取 generatorConfig.xml 配置文件,获取数据库连接信息、目标包路径、表映射等配置。
    • 配置文件中的内容决定了生成器的行为,包括哪些表需要生成代码、生成的目标包路径、是否覆盖现有文件等。
  2. 建立数据库连接

    • 使用配置文件中的数据库连接信息(如驱动类、URL、用户名和密码)建立数据库连接。
    • 连接成功后,生成器可以访问数据库中的元数据。
  3. 读取数据库元数据

    • 通过数据库连接读取指定表的元数据,包括表名、字段名、字段类型、主键等信息。
    • 元数据是生成代码的基础,生成器会根据这些信息生成相应的 Java 类和 SQL 映射。
  4. 生成代码

    • 根据读取到的元数据和配置文件中的设置,生成相应的 Java 实体类、Mapper 接口、Mapper XML 文件和 Example 类。
    • 生成的代码基于预定义的模板,支持自定义模板和插件扩展。
    • 生成的具体内容包括:
      • Java 实体类:包含表的字段、构造函数、getter 和 setter 方法等。
      • Mapper 接口:包含基本的 CRUD 操作方法(如 select, insert, update, delete)。
      • Mapper XML 文件:包含与 Mapper 接口方法对应的 SQL 语句。
      • Example 类:用于构建动态查询条件的类。
  5. 写入输出文件

    • 将生成的代码文件写入指定的目标包路径。
    • 如果配置文件中设置了 overwrite 选项,则会覆盖已存在的文件;否则,将保留现有文件。
    • 生成的文件通常包括:
      • Java 实体类文件(例如 User.java
      • Mapper 接口文件(例如 UserMapper.java
      • Mapper XML 文件(例如 UserMapper.xml
      • Example 类文件(例如 UserExample.java
  6. 日志记录

    • 生成过程中,生成器会记录详细的日志信息,包括生成的文件路径、生成的状态等。
    • 日志信息有助于调试和跟踪生成过程中的问题。

第二部分:环境准备

在使用 MyBatis Generator 之前,需要确保你的开发环境已经安装并配置了必要的工具和依赖。以下是详细的环境准备步骤:

安装 Java Development Kit (JDK)

JDK 的安装步骤

  1. 下载 JDK

    • 访问 Oracle 官方网站 或 OpenJDK 下载适合你操作系统的 JDK 版本。
    • 推荐使用 LTS(长期支持)版本,如 JDK 8 或 JDK 11。
  2. 安装 JDK

    • 运行下载的安装程序,并按照提示进行安装。
    • 在 Windows 上,通常选择默认安装路径(如 C:\Program Files\Java\jdk-<version>)。
    • 在 macOS 和 Linux 上,通常通过包管理器进行安装,例如在 Ubuntu 上可以使用以下命令:
      sudo apt update
      sudo apt install openjdk-11-jdk
      
  3. 验证安装

    • 打开终端或命令提示符,输入以下命令来验证 JDK 是否安装成功:
      java -version
      
    • 如果安装成功,会显示 JDK 的版本信息。

配置环境变量

  1. 设置 JAVA_HOME 环境变量

    • 在 Windows 上,打开“系统属性” -> “高级系统设置” -> “环境变量”。
    • 在“系统变量”中点击“新建”,添加 JAVA_HOME 变量,值为 JDK 的安装路径(例如 C:\Program Files\Java\jdk-<version>)。
    • 在“系统变量”中找到 Path 变量,点击“编辑”,将 %JAVA_HOME%\bin 添加到路径中。
  2. 在 macOS 和 Linux 上配置环境变量

    • 编辑 ~/.bashrc~/.zshrc 文件(取决于你使用的 shell),添加以下内容:
      export JAVA_HOME=/path/to/jdk
      export PATH=$JAVA_HOME/bin:$PATH
      
    • 保存文件后,运行以下命令使更改生效:
      source ~/.bashrc
      
安装 Maven

Maven 的安装步骤

  1. 下载 Maven

    • 访问 Apache Maven 官方网站 下载最新版本的 Maven 压缩包。
  2. 解压 Maven

    • 将下载的压缩包解压到一个目录,例如 C:\Program Files\Apache\maven-<version>(Windows)或 /usr/local/apache-maven-<version>(macOS/Linux)。
  3. 配置环境变量

    • 在 Windows 上

      • 打开“系统属性” -> “高级系统设置” -> “环境变量”。
      • 在“系统变量”中点击“新建”,添加 MAVEN_HOME 变量,值为 Maven 的安装路径(例如 C:\Program Files\Apache\maven-<version>)。
      • 在“系统变量”中找到 Path 变量,点击“编辑”,将 %MAVEN_HOME%\bin 添加到路径中。
    • 在 macOS 和 Linux 上

      • 编辑 ~/.bashrc~/.zshrc 文件,添加以下内容:
        export MAVEN_HOME=/path/to/maven
        export PATH=$MAVEN_HOME/bin:$PATH
        
      • 保存文件后,运行以下命令使更改生效:
        source ~/.bashrc
        
  4. 验证安装

    • 打开终端或命令提示符,输入以下命令来验证 Maven 是否安装成功:
      mvn -v
      
    • 如果安装成功,会显示 Maven 的版本信息。
数据库驱动的安装

示例:MySQL JDBC 驱动的安装

  1. 下载 MySQL JDBC 驱动

    • 访问 MySQL 官方网站 下载最新版本的 MySQL Connector/J 驱动。
  2. 将驱动添加到项目中

    • 对于 Maven 项目

      • 在项目的 pom.xml 文件中添加以下依赖:
        <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.23</version>
        </dependency>
        
      • 运行 mvn install 命令以下载并安装依赖。
    • 对于非 Maven 项目

      • 将下载的 JAR 文件(例如 mysql-connector-java-8.0.23.jar)复制到项目的 lib 目录下。
      • 在 IDE 中配置项目的类路径,确保包含该 JAR 文件。
  3. 验证驱动

    • 创建一个简单的 Java 程序,尝试连接到 MySQL 数据库,以验证驱动是否正确安装和配置。例如:
      import java.sql.Connection;
      import java.sql.DriverManager;
      import java.sql.SQLException;public class TestConnection {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/your_database";String user = "your_username";String password = "your_password";try (Connection conn = DriverManager.getConnection(url, user, password)) {System.out.println("Connected to the database!");} catch (SQLException e) {e.printStackTrace();}}
      }
      

第三部分:配置 MyBatis Generator

在这一部分,我们将详细介绍如何配置 MyBatis Generator (MBG),包括创建 Maven 项目、配置 generatorConfig.xml 文件、配置表映射以及自定义模板。

创建 Maven 项目

使用 IDE 创建 Maven 项目

  1. 使用 IntelliJ IDEA 创建 Maven 项目

    • 打开 IntelliJ IDEA。
    • 选择 File -> New -> Project
    • 选择 Maven,点击 Next
    • 输入项目名称和位置,点击 Finish
  2. 使用 Eclipse 创建 Maven 项目

    • 打开 Eclipse。
    • 选择 File -> New -> Other
    • 选择 Maven -> Maven Project,点击 Next
    • 选择 Create a simple project (skip archetype selection),点击 Next
    • 输入项目名称和位置,点击 Finish

添加 MyBatis Generator 依赖

在项目的 pom.xml 文件中添加 MyBatis Generator 的依赖。此外,还需要添加数据库驱动的依赖(以 MySQL 为例):

<dependencies><!-- MyBatis Generator 依赖 --><dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-core</artifactId><version>1.4.0</version><scope>test</scope></dependency><!-- MySQL JDBC 驱动依赖 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.23</version></dependency>
</dependencies>
创建 generatorConfig.xml 文件

配置文件的基本结构

generatorConfig.xml 是 MyBatis Generator 的核心配置文件,它定义了生成器的行为。以下是一个基本的配置文件结构:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration><!-- 数据库连接信息 --><jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/your_database"userId="your_username"password="your_password"></jdbcConnection><!-- Java 模型生成目标包 --><javaModelGenerator targetPackage="com.yourpackage.model" targetProject="src/main/java"><property name="enableSubPackages" value="true"/><property name="trimStrings" value="true"/></javaModelGenerator><!-- SQL 映射文件生成目标包 --><sqlMapGenerator targetPackage="com.yourpackage.mapper" targetProject="src/main/resources"><property name="enableSubPackages" value="true"/></sqlMapGenerator><!-- Mapper 接口生成目标包 --><javaClientGenerator type="XMLMAPPER" targetPackage="com.yourpackage.mapper" targetProject="src/main/java"><property name="enableSubPackages" value="true"/></javaClientGenerator><!-- 表配置 --><table tableName="users" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"><generatedKey column="id" sqlStatement="MySql" identity="true"/></table>
</generatorConfiguration>

数据库连接信息

  • driverClass:数据库驱动类名。
  • connectionURL:数据库连接 URL。
  • userId:数据库用户名。
  • password:数据库密码。

目标包和目标项目

  • targetPackage:生成的 Java 类的目标包路径。
  • targetProject:生成的 Java 类的目标项目路径。
  • enableSubPackages:是否启用子包。
  • trimStrings:是否修剪字符串(去除前后空格)。
配置表映射

表配置详解

  • tableName:数据库表名。
  • domainObjectName:生成的实体类名。
  • enableCountByExampleenableUpdateByExampleenableDeleteByExampleenableSelectByExample:是否生成对应的 Example 方法。
  • selectByExampleQueryId:是否生成查询 ID。

自定义生成选项

  • generatedKey:指定主键生成策略。

    <generatedKey column="id" sqlStatement="MySql" identity="true"/>
    
  • columnOverride:覆盖列的属性。

    <columnOverride column="name" property="userName" javaType="String" jdbcType="VARCHAR"/>
    
  • ignoreColumn:忽略某些列。

    <ignoreColumn column="created_at" />
    
自定义模板

使用 Velocity 模板

MyBatis Generator 支持使用 Velocity 模板来自定义生成的代码。你可以在配置文件中指定模板路径,并编写自定义的 Velocity 模板。

自定义模板示例

  1. 创建自定义模板文件

    • 在项目的资源目录下创建一个 templates 文件夹,并在其中创建自定义模板文件。例如,创建 JavaModel.vmJavaMapper.vm
  2. 编写自定义模板

    • JavaModel.vm 示例:

      #set($className = $table.className)
      package ${table.javaModelGenerator.targetPackage};import java.util.Date;public class ${className} {#foreach ($column in $table.columns)private ${column.javaType} ${column.javaProperty};#end#foreach ($column in $table.columns)public ${column.javaType} get${column.javaProperty}() {return this.${column.javaProperty};}public void set${column.javaProperty}(${column.javaType} ${column.javaProperty}) {this.${column.javaProperty} = ${column.javaProperty};}#end
      }
      
    • JavaMapper.vm 示例:

      #set($className = $table.className)
      package ${table.javaClientGenerator.targetPackage};import org.apache.ibatis.annotations.*;
      import ${table.javaModelGenerator.targetPackage}.${table.className};public interface ${className}Mapper {@Select("SELECT * FROM ${table.tableName} WHERE id = #{id}")${className} selectById(@Param("id") Long id);@Insert("INSERT INTO ${table.tableName} (#{columns}) VALUES (#{values})")@Options(useGeneratedKeys = true, keyProperty = "id")int insert(${className} record);
      }
      
  3. 配置 generatorConfig.xml 使用自定义模板

    <table tableName="users" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"><generatedKey column="id" sqlStatement="MySql" identity="true"/><context property="javaFileGenerator" value="com.yourpackage.MyCustomJavaFileGenerator"/><context property="javaClientGenerator" value="com.yourpackage.MyCustomJavaClientGenerator"/>
    </table><plugin type="org.mybatis.generator.plugins.SerializablePlugin" />
    <plugin type="org.mybatis.generator.plugins.ToStringPlugin" /><javaModelGenerator targetPackage="com.yourpackage.model" targetProject="src/main/java"><property name="enableSubPackages" value="true"/><property name="trimStrings" value="true"/><property name="templateFile" value="path/to/templates/JavaModel.vm"/>
    </javaModelGenerator><javaClientGenerator type="XMLMAPPER" targetPackage="com.yourpackage.mapper" targetProject="src/main/java"><property name="enableSubPackages" value="true"/><property name="templateFile" value="path/to/templates/JavaMapper.vm"/>
    </javaClientGenerator>
    

通过以上步骤,你可以配置 MyBatis Generator 以生成符合项目需求的代码。接下来的部分将介绍如何运行 MyBatis Generator 并检查生成的代码。

第四部分:运行 MyBatis Generator

在这一部分,我们将详细介绍如何运行 MyBatis Generator (MBG),包括使用命令行和 Maven 插件两种方式。我们还将介绍生成的文件结构,帮助你理解生成的代码。

使用命令行运行

命令行参数详解

MyBatis Generator 可以通过命令行直接运行。以下是常用的命令行参数:

  • -configfile-c:指定配置文件的路径。
  • -overwrite-o:是否覆盖已存在的文件。
  • -verbose-v:输出详细的日志信息。
  • -help-h:显示帮助信息。

运行示例

假设你已经将 MyBatis Generator 的 JAR 包下载到本地,并且配置文件 generatorConfig.xml 位于项目的 src/main/resources 目录下,可以使用以下命令运行生成器:

java -jar mybatis-generator-core-1.4.0.jar -configfile src/main/resources/generatorConfig.xml -overwrite -verbose

这个命令会读取 generatorConfig.xml 文件,并根据配置生成相应的代码。如果目标文件已经存在,-overwrite 参数会覆盖这些文件。-verbose 参数则会输出详细的日志信息,帮助你调试和跟踪生成过程。

使用 Maven 插件运行

配置 Maven 插件

如果你使用 Maven 项目,可以通过配置 MyBatis Generator Maven 插件来运行生成器。在项目的 pom.xml 文件中添加以下插件配置:

<build><plugins><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.4.0</version><configuration><configurationFile>src/main/resources/generatorConfig.xml</configurationFile><verbose>true</verbose><overwrite>true</overwrite></configuration><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.23</version></dependency></dependencies></plugin></plugins>
</build>

运行插件示例

在终端或命令提示符中,导航到项目的根目录并运行以下命令:

mvn mybatis-generator:generate

这个命令会读取 generatorConfig.xml 文件,并根据配置生成相应的代码。Maven 插件会自动处理依赖关系,并执行生成任务。

生成的文件结构

运行 MyBatis Generator 后,会在指定的目标包路径下生成以下类型的文件:

生成的 Java 实体类

  • 文件位置src/main/java/com/yourpackage/model/User.java
  • 内容示例
    package com.yourpackage.model;public class User {private Long id;private String username;private String password;private Date createdAt;// Getter and Setter methodspublic Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Date getCreatedAt() {return createdAt;}public void setCreatedAt(Date createdAt) {this.createdAt = createdAt;}
    }
    

生成的 Mapper 接口

  • 文件位置src/main/java/com/yourpackage/mapper/UserMapper.java
  • 内容示例
    package com.yourpackage.mapper;import com.yourpackage.model.User;
    import org.apache.ibatis.annotations.*;public interface UserMapper {@Select("SELECT * FROM users WHERE id = #{id}")User selectById(@Param("id") Long id);@Insert("INSERT INTO users (username, password, created_at) VALUES (#{username}, #{password}, #{createdAt})")@Options(useGeneratedKeys = true, keyProperty = "id")int insert(User user);@Update("UPDATE users SET username = #{username}, password = #{password}, created_at = #{createdAt} WHERE id = #{id}")int update(User user);@Delete("DELETE FROM users WHERE id = #{id}")int deleteById(@Param("id") Long id);
    }
    

生成的 Mapper XML 文件

  • 文件位置src/main/resources/com/yourpackage/mapper/UserMapper.xml
  • 内容示例
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.yourpackage.mapper.UserMapper"><resultMap id="BaseResultMap" type="com.yourpackage.model.User"><id column="id" property="id" jdbcType="BIGINT"/><result column="username" property="username" jdbcType="VARCHAR"/><result column="password" property="password" jdbcType="VARCHAR"/><result column="created_at" property="createdAt" jdbcType="TIMESTAMP"/></resultMap><sql id="Base_Column_List">id, username, password, created_at</sql><select id="selectById" resultMap="BaseResultMap">SELECT<include refid="Base_Column_List"/>FROM usersWHERE id = #{id}</select><insert id="insert" parameterType="com.yourpackage.model.User" useGeneratedKeys="true" keyProperty="id">INSERT INTO users (username, password, created_at)VALUES (#{username}, #{password}, #{createdAt})</insert><update id="update" parameterType="com.yourpackage.model.User">UPDATE usersSET username = #{username},password = #{password},created_at = #{createdAt}WHERE id = #{id}</update><delete id="deleteById">DELETE FROM usersWHERE id = #{id}</delete>
    </mapper>
    

生成的 Example 类

  • 文件位置src/main/java/com/yourpackage/model/UserExample.java
  • 内容示例
    package com.yourpackage.model;import java.util.ArrayList;
    import java.util.List;public class UserExample {protected String orderByClause;protected boolean distinct;protected List<Criteria> oredCriteria;public UserExample() {oredCriteria = new ArrayList<>();}public void setOrderByClause(String orderByClause) {this.orderByClause = orderByClause;}public String getOrderByClause() {return orderByClause;}public void setDistinct(boolean distinct) {this.distinct = distinct;}public boolean isDistinct() {return distinct;}public List<Criteria> getOredCriteria() {return oredCriteria;}public void or(Criteria criteria) {oredCriteria.add(criteria);}public Criteria or() {Criteria criteria = createCriteriaInternal();oredCriteria.add(criteria);return criteria;}public Criteria createCriteria() {Criteria criteria = createCriteriaInternal();if (oredCriteria.size() == 0) {oredCriteria.add(criteria);}return criteria;}protected Criteria createCriteriaInternal() {Criteria criteria = new Criteria();return criteria;}public void clear() {oredCriteria.clear();orderByClause = null;distinct = false;}protected abstract static class GeneratedCriteria {protected List<Criterion> criteria;protected GeneratedCriteria() {super();criteria = new ArrayList<>();}public boolean isValid() {return criteria.size() > 0;}public List<Criterion> getAllCriteria() {return criteria;}public List<Criterion> getCriteria() {return criteria;}protected void addCriterion(String condition) {if (condition == null) {throw new RuntimeException("Value for condition cannot be null");}criteria.add(new Criterion(condition));}protected void addCriterion(String condition, Object value, String property) {if (value == null) {throw new RuntimeException("Value for " + property + " cannot be null");}criteria.add(new Criterion(condition, value));}protected void addCriterion(String condition, Object value1, Object value2, String property) {if (value1 == null || value2 == null) {throw new RuntimeException("Between values for " + property + " cannot be null");}criteria.add(new Criterion(condition, value1, value2));}public Criteria andIdIsNull() {addCriterion("id is null");return (Criteria) this;}public Criteria andIdIsNotNull() {addCriterion("id is not null");return (Criteria) this;}public Criteria andIdEqualTo(Long value) {addCriterion("id =", value, "id");return (Criteria) this;}public Criteria andIdNotEqualTo(Long value) {addCriterion("id <>", value, "id");return (Criteria) this;}public Criteria andIdGreaterThan(Long value) {addCriterion("id >", value, "id");return (Criteria) this;}public Criteria andIdGreaterThanOrEqualTo(Long value) {addCriterion("id >=", value, "id");return (Criteria) this;}public Criteria andIdLessThan(Long value) {addCriterion("id <", value, "id");return (Criteria) this;}public Criteria andIdLessThanOrEqualTo(Long value) {addCriterion("id <=", value, "id");return (Criteria) this;}public Criteria andIdIn(List<Long> values) {addCriterion("id in", values, "id");return (Criteria) this;}public Criteria andIdNotIn(List<Long> values) {addCriterion("id not in", values, "id");return (Criteria) this;}public Criteria andIdBetween(Long value1, Long value2) {addCriterion("id between", value1, value2, "id");return (Criteria) this;}public Criteria andIdNotBetween(Long value1, Long value2) {addCriterion("id not between", value1, value2, "id");return (Criteria) this;}public Criteria andUsernameIsNull() {addCriterion("username is null");return (Criteria) this;}public Criteria andUsernameIsNotNull() {addCriterion("username is not null");return (Criteria) this;}public Criteria andUsernameEqualTo(String value) {addCriterion("username =", value, "username");return (Criteria) this;}public Criteria andUsernameNotEqualTo(String value) {addCriterion("username <>", value, "username");return (Criteria) this;}public Criteria andUsernameGreaterThan(String value) {addCriterion("username >", value, "username");return (Criteria) this;}public Criteria andUsernameGreaterThanOrEqualTo(String value) {addCriterion("username >=", value, "username");return (Criteria) this;}public Criteria andUsernameLessThan(String value) {addCriterion("username <", value, "username");return (Criteria) this;}public Criteria andUsernameLessThanOrEqualTo(String value) {addCriterion("username <=", value, "username");return (Criteria) this;}public Criteria andUsernameLike(String value) {addCriterion("username like", value, "username");return (Criteria) this;}public Criteria andUsernameNotLike(String value) {addCriterion("username not like", value, "username");return (Criteria) this;}public Criteria andUsernameIn(List<String> values) {addCriterion("username in", values, "username");return (Criteria) this;}public Criteria andUsernameNotIn(List<String> values) {addCriterion("username not in", values, "username");return (Criteria) this;}public Criteria andUsernameBetween(String value1, String value2) {addCriterion("username between", value1, value2, "username");return (Criteria) this;}public Criteria andUsernameNotBetween(String value1, String value2) {addCriterion("username not between", value1, value2, "username");return (Criteria) this;}public Criteria andPasswordIsNull() {addCriterion("password is null");return (Criteria) this;}public Criteria andPasswordIsNotNull() {addCriterion("password is not null");return (Criteria) this;}public Criteria andPasswordEqualTo(String value) {addCriterion("password =", value, "password");return (Criteria) this;}public Criteria andPasswordNotEqualTo(String value) {addCriterion("password <>", value, "password");return (Criteria) this;}public Criteria andPasswordGreaterThan(String value) {addCriterion("password >", value, "password");return (Criteria) this;}public Criteria andPasswordGreaterThanOrEqualTo(String value) {addCriterion("password >=", value, "password");return (Criteria) this;}public Criteria andPasswordLessThan(String value) {addCriterion("password <", value, "password");return (Criteria) this;}public Criteria andPasswordLessThanOrEqualTo(String value) {addCriterion("password <=", value, "password");return (Criteria) this;}public Criteria andPasswordLike(String value) {addCriterion("password like", value, "password");return (Criteria) this;}public Criteria andPasswordNotLike(String value) {addCriterion("password not like", value, "password");return (Criteria) this;}public Criteria andPasswordIn(List<String> values) {addCriterion("password in", values, "password");return (Criteria) this;}public Criteria andPasswordNotIn(List<String> values) {addCriterion("password not in", values, "password");return (Criteria) this;}public Criteria andPasswordBetween(String value1, String value2) {addCriterion("password between", value1, value2, "password");return (Criteria) this;}public Criteria andPasswordNotBetween(String value1, String value2) {addCriterion("password not between", value1, value2, "password");return (Criteria) this;}public Criteria andCreatedAtIsNull() {addCriterion("created_at is null");return (Criteria) this;}public Criteria andCreatedAtIsNotNull() {addCriterion("created_at is not null");return (Criteria) this;}public Criteria andCreatedAtEqualTo(Date value) {addCriterion("created_at =", value, "createdAt");return (Criteria) this;}public Criteria andCreatedAtNotEqualTo(Date value) {addCriterion("created_at <>", value, "createdAt");return (Criteria) this;}public Criteria andCreatedAtGreaterThan(Date value) {addCriterion("created_at >", value, "createdAt");return (Criteria) this;}public Criteria andCreatedAtGreaterThanOrEqualTo(Date value) {addCriterion("created_at >=", value, "createdAt");return (Criteria) this;}public Criteria andCreatedAtLessThan(Date value) {addCriterion("created_at <", value, "createdAt");return (Criteria) this;}public Criteria andCreatedAtLessThanOrEqualTo(Date value) {addCriterion("created_at <=", value, "createdAt");return (Criteria) this;}public Criteria andCreatedAtIn(List<Date> values) {addCriterion("created_at in", values, "createdAt");return (Criteria) this;}public Criteria andCreatedAtNotIn(List<Date> values) {addCriterion("created_at not in", values, "createdAt");return (Criteria) this;}public Criteria andCreatedAtBetween(Date value1, Date value2) {addCriterion("created_at between", value1, value2, "createdAt");return (Criteria) this;}public Criteria andCreatedAtNotBetween(Date value1, Date value2) {addCriterion("created_at not between", value1, value2, "createdAt");return (Criteria) this;}}public static class Criteria extends GeneratedCriteria {protected Criteria() {super();}}public static class Criterion {private String condition;private Object value;private Object secondValue;private boolean noValue;private boolean singleValue;private boolean betweenValue;private boolean listValue;private String typeHandler;protected Criterion(String condition) {super();this.condition = condition;this.typeHandler = null;this.noValue = true;}protected Criterion(String condition, Object value, String typeHandler) {super();this.condition = condition;this.value = value;this.typeHandler = typeHandler;if (value instanceof List<?>) {this.listValue = true;} else {this.singleValue = true;}}protected Criterion(String condition, Object value) {this(condition, value, null);}protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {super();this.condition = condition;this.value = value;this.secondValue = secondValue;this.typeHandler = typeHandler;this.betweenValue = true;}protected Criterion(String condition, Object value, Object secondValue) {this(condition, value, secondValue, null);}public String getCondition() {return condition;}public Object getValue() {return value;}public Object getSecondValue() {return secondValue;}public boolean isNoValue() {return noValue;}public boolean isSingleValue() {return singleValue;}public boolean isBetweenValue() {return betweenValue;}public boolean isListValue() {return listValue;}public String getTypeHandler() {return typeHandler;}}
    }
    

通过以上步骤,你可以成功运行 MyBatis Generator 并生成所需的代码文件。生成的文件结构清晰,便于管理和维护。接下来的部分将介绍如何进一步优化和扩展 MyBatis Generator 的功能。

第五部分:生成的内容详解

在这一部分,我们将详细介绍 MyBatis Generator 生成的各个文件的具体内容和结构,包括 Java 实体类、Mapper 接口、Mapper XML 文件和 Example 类。这将帮助你更好地理解和使用生成的代码。

Java 实体类

字段映射

  • 字段:Java 实体类中的字段与数据库表中的列一一对应。
  • 注解:字段上通常会添加 @Column 注解(如果使用 JPA)或其他相关注解来描述字段属性。

构造函数和方法

  • 默认构造函数:无参构造函数,用于对象的初始化。
  • 带参数的构造函数:根据需要生成带参数的构造函数。
  • Getter 和 Setter 方法:每个字段都有对应的 Getter 和 Setter 方法,用于获取和设置字段值。

示例

假设有一个 users 表,包含 id, username, password, 和 created_at 字段,生成的 User 实体类如下:

package com.yourpackage.model;import java.util.Date;public class User {private Long id;private String username;private String password;private Date createdAt;// 默认构造函数public User() {}// 带参数的构造函数public User(Long id, String username, String password, Date createdAt) {this.id = id;this.username = username;this.password = password;this.createdAt = createdAt;}// Getter 和 Setter 方法public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Date getCreatedAt() {return createdAt;}public void setCreatedAt(Date createdAt) {this.createdAt = createdAt;}
}
Mapper 接口

CRUD 方法

  • selectById:根据主键查询单个记录。
  • insert:插入一条新记录。
  • update:更新现有记录。
  • deleteById:根据主键删除记录。

自定义方法

  • 可以通过配置文件或自定义插件添加额外的方法。

示例

package com.yourpackage.mapper;import com.yourpackage.model.User;
import org.apache.ibatis.annotations.*;public interface UserMapper {@Select("SELECT * FROM users WHERE id = #{id}")User selectById(@Param("id") Long id);@Insert("INSERT INTO users (username, password, created_at) VALUES (#{username}, #{password}, #{createdAt})")@Options(useGeneratedKeys = true, keyProperty = "id")int insert(User user);@Update("UPDATE users SET username = #{username}, password = #{password}, created_at = #{createdAt} WHERE id = #{id}")int update(User user);@Delete("DELETE FROM users WHERE id = #{id}")int deleteById(@Param("id") Long id);// 自定义方法@Select("SELECT * FROM users WHERE username = #{username}")User selectByUsername(@Param("username") String username);
}
Mapper XML 文件

SQL 语句映射

  • Result Map:定义了结果集与实体类之间的映射关系。
  • SQL 语句:定义了具体的 SQL 语句,如 SELECT, INSERT, UPDATE, DELETE

参数传递

  • 使用 #{} 占位符传递参数,MyBatis 会自动处理类型转换和防止 SQL 注入。

示例

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.yourpackage.mapper.UserMapper"><resultMap id="BaseResultMap" type="com.yourpackage.model.User"><id column="id" property="id" jdbcType="BIGINT"/><result column="username" property="username" jdbcType="VARCHAR"/><result column="password" property="password" jdbcType="VARCHAR"/><result column="created_at" property="createdAt" jdbcType="TIMESTAMP"/></resultMap><sql id="Base_Column_List">id, username, password, created_at</sql><select id="selectById" resultMap="BaseResultMap">SELECT<include refid="Base_Column_List"/>FROM usersWHERE id = #{id}</select><insert id="insert" parameterType="com.yourpackage.model.User" useGeneratedKeys="true" keyProperty="id">INSERT INTO users (username, password, created_at)VALUES (#{username}, #{password}, #{createdAt})</insert><update id="update" parameterType="com.yourpackage.model.User">UPDATE usersSET username = #{username},password = #{password},created_at = #{createdAt}WHERE id = #{id}</update><delete id="deleteById">DELETE FROM usersWHERE id = #{id}</delete><!-- 自定义方法 --><select id="selectByUsername" resultMap="BaseResultMap">SELECT<include refid="Base_Column_List"/>FROM usersWHERE username = #{username}</select>
</mapper>
Example 类

动态查询条件

  • Criteria:用于构建复杂的查询条件。
  • Example:封装了多个 Criteria 对象,支持多条件组合。

使用示例

package com.yourpackage.model;import java.util.ArrayList;
import java.util.List;public class UserExample {protected String orderByClause;protected boolean distinct;protected List<Criteria> oredCriteria;public UserExample() {oredCriteria = new ArrayList<>();}public void setOrderByClause(String orderByClause) {this.orderByClause = orderByClause;}public String getOrderByClause() {return orderByClause;}public void setDistinct(boolean distinct) {this.distinct = distinct;}public boolean isDistinct() {return distinct;}public List<Criteria> getOredCriteria() {return oredCriteria;}public void or(Criteria criteria) {oredCriteria.add(criteria);}public Criteria or() {Criteria criteria = createCriteriaInternal();oredCriteria.add(criteria);return criteria;}public Criteria createCriteria() {Criteria criteria = createCriteriaInternal();if (oredCriteria.size() == 0) {oredCriteria.add(criteria);}return criteria;}protected Criteria createCriteriaInternal() {Criteria criteria = new Criteria();return criteria;}public void clear() {oredCriteria.clear();orderByClause = null;distinct = false;}protected abstract static class GeneratedCriteria {protected List<Criterion> criteria;protected GeneratedCriteria() {super();criteria = new ArrayList<>();}public boolean isValid() {return criteria.size() > 0;}public List<Criterion> getAllCriteria() {return criteria;}public List<Criterion> getCriteria() {return criteria;}protected void addCriterion(String condition) {if (condition == null) {throw new RuntimeException("Value for condition cannot be null");}criteria.add(new Criterion(condition));}protected void addCriterion(String condition, Object value, String property) {if (value == null) {throw new RuntimeException("Value for " + property + " cannot be null");}criteria.add(new Criterion(condition, value));}protected void addCriterion(String condition, Object value1, Object value2, String property) {if (value1 == null || value2 == null) {throw new RuntimeException("Between values for " + property + " cannot be null");}criteria.add(new Criterion(condition, value1, value2));}public Criteria andIdIsNull() {addCriterion("id is null");return (Criteria) this;}public Criteria andIdIsNotNull() {addCriterion("id is not null");return (Criteria) this;}public Criteria andIdEqualTo(Long value) {addCriterion("id =", value, "id");return (Criteria) this;}public Criteria andIdNotEqualTo(Long value) {addCriterion("id <>", value, "id");return (Criteria) this;}public Criteria andIdGreaterThan(Long value) {addCriterion("id >", value, "id");return (Criteria) this;}public Criteria andIdGreaterThanOrEqualTo(Long value) {addCriterion("id >=", value, "id");return (Criteria) this;}public Criteria andIdLessThan(Long value) {addCriterion("id <", value, "id");return (Criteria) this;}public Criteria andIdLessThanOrEqualTo(Long value) {addCriterion("id <=", value, "id");return (Criteria) this;}public Criteria andIdIn(List<Long> values) {addCriterion("id in", values, "id");return (Criteria) this;}public Criteria andIdNotIn(List<Long> values) {addCriterion("id not in", values, "id");return (Criteria) this;}public Criteria andIdBetween(Long value1, Long value2) {addCriterion("id between", value1, value2, "id");return (Criteria) this;}public Criteria andIdNotBetween(Long value1, Long value2) {addCriterion("id not between", value1, value2, "id");return (Criteria) this;}public Criteria andUsernameIsNull() {addCriterion("username is null");return (Criteria) this;}public Criteria andUsernameIsNotNull() {addCriterion("username is not null");return (Criteria) this;}public Criteria andUsernameEqualTo(String value) {addCriterion("username =", value, "username");return (Criteria) this;}public Criteria andUsernameNotEqualTo(String value) {addCriterion("username <>", value, "username");return (Criteria) this;}public Criteria andUsernameGreaterThan(String value) {addCriterion("username >", value, "username");return (Criteria) this;}public Criteria andUsernameGreaterThanOrEqualTo(String value) {addCriterion("username >=", value, "username");return (Criteria) this;}public Criteria andUsernameLessThan(String value) {addCriterion("username <", value, "username");return (Criteria) this;}public Criteria andUsernameLessThanOrEqualTo(String value) {addCriterion("username <=", value, "username");return (Criteria) this;}public Criteria andUsernameLike(String value) {addCriterion("username like", value, "username");return (Criteria) this;}public Criteria andUsernameNotLike(String value) {addCriterion("username not like", value, "username");return (Criteria) this;}public Criteria andUsernameIn(List<String> values) {addCriterion("username in", values, "username");return (Criteria) this;}public Criteria andUsernameNotIn(List<String> values) {addCriterion("username not in", values, "username");return (Criteria) this;}public Criteria andUsernameBetween(String value1, String value2) {addCriterion("username between", value1, value2, "username");return (Criteria) this;}public Criteria andUsernameNotBetween(String value1, String value2) {addCriterion("username not between", value1, value2, "username");return (Criteria) this;}public Criteria andPasswordIsNull() {addCriterion("password is null");return (Criteria) this;}public Criteria andPasswordIsNotNull() {addCriterion("password is not null");return (Criteria) this;}public Criteria andPasswordEqualTo(String value) {addCriterion("password =", value, "password");return (Criteria) this;}public Criteria andPasswordNotEqualTo(String value) {addCriterion("password <>", value, "password");return (Criteria) this;}public Criteria andPasswordGreaterThan(String value) {addCriterion("password >", value, "password");return (Criteria) this;}public Criteria andPasswordGreaterThanOrEqualTo(String value) {addCriterion("password >=", value, "password");return (Criteria) this;}public Criteria andPasswordLessThan(String value) {addCriterion("password <", value, "password");return (Criteria) this;}public Criteria andPasswordLessThanOrEqualTo(String value) {addCriterion("password <=", value, "password");return (Criteria) this;}public Criteria andPasswordLike(String value) {addCriterion("password like", value, "password");return (Criteria) this;}public Criteria andPasswordNotLike(String value) {addCriterion("password not like", value, "password");return (Criteria) this;}public Criteria andPasswordIn(List<String> values) {addCriterion("password in", values, "password");return (Criteria) this;}public Criteria andPasswordNotIn(List<String> values) {addCriterion("password not in", values, "password");return (Criteria) this;}public Criteria andPasswordBetween(String value1, String value2) {addCriterion("password between", value1, value2, "password");return (Criteria) this;}public Criteria andPasswordNotBetween(String value1, String value2) {addCriterion("password not between", value1, value2, "password");return (Criteria) this;}public Criteria andCreatedAtIsNull() {addCriterion("created_at is null");return (Criteria) this;}public Criteria andCreatedAtIsNotNull() {addCriterion("created_at is not null");return (Criteria) this;}public Criteria andCreatedAtEqualTo(Date value) {addCriterion("created_at =", value, "createdAt");return (Criteria) this;}public Criteria andCreatedAtNotEqualTo(Date value) {addCriterion("created_at <>", value, "createdAt");return (Criteria) this;}public Criteria andCreatedAtGreaterThan(Date value) {addCriterion("created_at >", value, "createdAt");return (Criteria) this;}public Criteria andCreatedAtGreaterThanOrEqualTo(Date value) {addCriterion("created_at >=", value, "createdAt");return (Criteria) this;}public Criteria andCreatedAtLessThan(Date value) {addCriterion("created_at <", value, "createdAt");return (Criteria) this;}public Criteria andCreatedAtLessThanOrEqualTo(Date value) {addCriterion("created_at <=", value, "createdAt");return (Criteria) this;}public Criteria andCreatedAtIn(List<Date> values) {addCriterion("created_at in", values, "createdAt");return (Criteria) this;}public Criteria andCreatedAtNotIn(List<Date> values) {addCriterion("created_at not in", values, "createdAt");return (Criteria) this;}public Criteria andCreatedAtBetween(Date value1, Date value2) {addCriterion("created_at between", value1, value2, "createdAt");return (Criteria) this;}public Criteria andCreatedAtNotBetween(Date value1, Date value2) {addCriterion("created_at not between", value1, value2, "createdAt");return (Criteria) this;}}public static class Criteria extends GeneratedCriteria {protected Criteria() {super();}}public static class Criterion {private String condition;private Object value;private Object secondValue;private boolean noValue;private boolean singleValue;private boolean betweenValue;private boolean listValue;private String typeHandler;protected Criterion(String condition) {super();this.condition = condition;this.typeHandler = null;this.noValue = true;}protected Criterion(String condition, Object value, String typeHandler) {super();this.condition = condition;this.value = value;this.typeHandler = typeHandler;if (value instanceof List<?>) {this.listValue = true;} else {this.singleValue = true;}}protected Criterion(String condition, Object value) {this(condition, value, null);}protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {super();this.condition = condition;this.value = value;this.secondValue = secondValue;this.typeHandler = typeHandler;this.betweenValue = true;}protected Criterion(String condition, Object value, Object secondValue) {this(condition, value, secondValue, null);}public String getCondition() {return condition;}public Object getValue() {return value;}public Object getSecondValue() {return secondValue;}public boolean isNoValue() {return noValue;}public boolean isSingleValue() {return singleValue;}public boolean isBetweenValue() {return betweenValue;}public boolean isListValue() {return listValue;}public String getTypeHandler() {return typeHandler;}}
}

使用示例

import com.yourpackage.mapper.UserMapper;
import com.yourpackage.model.User;
import com.yourpackage.model.UserExample;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.InputStream;
import java.util.List;public class Main {public static void main(String[] args) {// 读取 MyBatis 配置文件InputStream inputStream = Main.class.getResourceAsStream("/mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);try (SqlSession session = sqlSessionFactory.openSession()) {UserMapper userMapper = session.getMapper(UserMapper.class);// 查询所有用户List<User> users = userMapper.selectAll();for (User user : users) {System.out.println(user);}// 根据用户名查询用户UserExample example = new UserExample();example.createCriteria().andUsernameEqualTo("testuser");List<User> usersByName = userMapper.selectByExample(example);for (User user : usersByName) {System.out.println(user);}// 插入新用户User newUser = new User(null, "newuser", "newpassword", new Date());userMapper.insert(newUser);session.commit();// 更新用户User updateUser = new User(1L, "updateduser", "updatedpassword", new Date());userMapper.update(updateUser);session.commit();// 删除用户userMapper.deleteById(1L);session.commit();}}
}

通过以上内容,你可以详细了解 MyBatis Generator 生成的各个文件的具体结构和用法。这些生成的文件为你的项目提供了坚实的基础,使你能够更高效地进行开发。接下来的部分将介绍如何进一步扩展和优化 MyBatis Generator 的功能。

第六部分:常见问题及解决方案

在使用 MyBatis Generator 时,可能会遇到一些常见的问题。本部分将介绍这些问题及其解决方法,并提供一些性能优化的建议。

常见错误及解决方法

数据库连接失败

症状

  • 生成器无法连接到数据库。
  • 日志中显示连接超时或认证失败等错误信息。

解决方法

  1. 检查数据库连接配置

    • 确保 generatorConfig.xml 中的数据库连接信息(如驱动类、URL、用户名和密码)正确无误。
    • 例如:
      <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/your_database"userId="your_username"password="your_password">
      </jdbcConnection>
      
  2. 检查数据库服务是否运行

    • 确保数据库服务已经启动并且可以访问。
    • 使用数据库管理工具(如 MySQL Workbench 或 pgAdmin)测试连接。
  3. 检查网络连接

    • 确保你的开发环境可以访问数据库服务器。
    • 检查防火墙设置,确保端口未被阻止。
  4. 检查驱动依赖

    • 确保项目中包含了正确的数据库驱动依赖。
    • 例如,对于 MySQL:
      <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.23</version>
      </dependency>
      

生成的代码不符合预期

症状

  • 生成的 Java 实体类、Mapper 接口或 XML 文件不符合预期。
  • 缺少某些字段或方法。

解决方法

  1. 检查表配置

    • 确保 generatorConfig.xml 中的 <table> 配置正确。
    • 例如:
      <table tableName="users" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"><generatedKey column="id" sqlStatement="MySql" identity="true"/>
      </table>
      
  2. 检查字段映射

    • 确保数据库表中的字段名称和类型正确。
    • 如果需要忽略某些字段,可以使用 <ignoreColumn> 标签。
    • 例如:
      <ignoreColumn column="created_at" />
      
  3. 自定义模板

    • 如果默认模板生成的代码不符合需求,可以使用自定义模板。
    • 参考前面的自定义模板部分,编写和配置自定义模板文件。
  4. 调试日志

    • 启用详细日志输出,查看生成过程中的详细信息。
    • generatorConfig.xml 中添加 <verbose>true</verbose> 选项。
    • 例如:
      <configuration><configurationFile>src/main/resources/generatorConfig.xml</configurationFile><verbose>true</verbose><overwrite>true</overwrite>
      </configuration>
      
性能优化

优化生成配置

  1. 选择性生成

    • 只生成必要的表和字段,避免不必要的生成。
    • 使用 <table><ignoreColumn> 标签来控制生成的内容。
    • 例如:
      <table tableName="users" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"><ignoreColumn column="created_at" />
      </table>
      
  2. 增量生成

    • 通过配置 overwrite 选项,只覆盖已存在的文件。
    • 例如:
      <configuration><configurationFile>src/main/resources/generatorConfig.xml</configurationFile><overwrite>false</overwrite>
      </configuration>
      
  3. 减少生成的方法

    • 通过配置 <table> 的属性,禁用不需要的方法。
    • 例如:
      <table tableName="users" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
      </table>
      

减少不必要的生成

  1. 分批生成

    • 将生成任务分成多个小任务,每次只生成一部分表。
    • 例如,创建多个 generatorConfig.xml 文件,每个文件负责一部分表的生成。
  2. 条件生成

    • 使用插件来实现条件生成逻辑,根据特定条件决定是否生成某些代码。
    • 例如,编写一个插件,在生成前检查某些条件,如果条件不满足则跳过生成。
  3. 缓存生成结果

    • 对于不经常变化的表结构,可以将生成的结果缓存起来,避免频繁生成。
    • 例如,将生成的代码文件存储在版本控制系统中,只有在表结构发生变化时才重新生成。

第七部分:最佳实践

在使用 MyBatis Generator 时,遵循一些最佳实践可以帮助你更好地管理代码、确保安全性,并提高开发效率。本部分将介绍代码管理、安全性考虑和持续集成的最佳实践。

代码管理

将配置文件纳入版本控制

  1. 配置文件版本化

    • generatorConfig.xml 文件纳入版本控制系统(如 Git),确保所有团队成员使用相同的配置。
    • 这有助于保持生成的代码一致性和可追溯性。
  2. 文档说明

    • 在项目文档中详细说明 generatorConfig.xml 的配置规则和注意事项,帮助新加入的团队成员快速上手。
  3. 定期审查

    • 定期审查 generatorConfig.xml 文件,确保其配置符合当前项目需求。
    • 可以通过代码审查工具(如 GitHub Pull Requests 或 GitLab Merge Requests)进行审查。

团队协作

  1. 统一规范

    • 制定统一的命名规范和编码风格,确保生成的代码风格一致。
    • 例如,统一表名和类名的命名规则,字段名称的转换规则等。
  2. 共享知识

    • 定期组织技术分享会,让经验丰富的开发者向团队成员传授 MyBatis Generator 的使用技巧和经验。
    • 创建内部知识库或 Wiki,记录常见问题及解决方案。
  3. 权限管理

    • 限制对 generatorConfig.xml 文件的修改权限,确保只有授权人员可以进行修改。
    • 使用版本控制系统中的分支管理和合并策略,避免冲突和误操作。
安全性考虑

防止 SQL 注入

  1. 使用参数化查询

    • 确保生成的 SQL 语句使用参数化查询,而不是直接拼接字符串。
    • MyBatis Generator 生成的代码默认使用参数化查询,但仍需注意手动编写的 SQL 语句。
  2. 输入验证

    • 对用户输入进行严格的验证和过滤,确保输入符合预期的格式和类型。
    • 例如,使用正则表达式或其他验证库来检查输入的有效性。
  3. 日志记录

    • 记录重要的数据库操作,并定期审查日志文件,及时发现异常行为。
    • 避免在错误消息中暴露过多的细节,这可能帮助攻击者进一步利用漏洞。

数据库权限管理

  1. 最小权限原则

    • 数据库用户应仅拥有执行其任务所需的最小权限。
    • 例如,如果一个应用程序只需要读取数据,则不要赋予其写入或删除数据的权限。
  2. 角色分离

    • 分离不同的数据库角色,确保每个角色只具有必要的权限。
    • 例如,创建专门用于读取数据的角色和专门用于写入数据的角色。
  3. 定期审计

    • 定期审查数据库用户的权限设置,确保没有不必要的权限。
    • 使用数据库自带的安全审计工具,监控和记录敏感操作。
持续集成

自动化生成

  1. 集成到 CI/CD 流程

    • 将 MyBatis Generator 集成到持续集成和持续部署流程中,确保每次构建时代码的一致性和最新性。
    • 例如,在 Jenkins 或 GitLab CI/CD 中配置自动运行 MyBatis Generator 的步骤。
  2. 定时生成

    • 设置定时任务,定期运行 MyBatis Generator 以更新生成的代码。
    • 例如,每天凌晨自动运行生成器,确保代码与数据库结构同步。

测试生成的代码

  1. 单元测试

    • 为生成的 Mapper 接口编写单元测试,确保生成的代码功能正确。
    • 使用 JUnit 或其他测试框架编写测试用例,覆盖基本的 CRUD 操作和其他自定义方法。
  2. 集成测试

    • 编写集成测试,验证生成的代码与数据库交互的正确性。
    • 使用测试数据库或内存数据库(如 H2)进行集成测试,确保测试环境与生产环境隔离。
  3. 代码覆盖率

    • 使用代码覆盖率工具(如 JaCoCo)监控测试覆盖率,确保生成的代码得到充分测试。
    • 定期审查代码覆盖率报告,找出未被测试的代码路径并补充测试用例。
  4. 静态代码分析

    • 使用静态代码分析工具(如 SonarQube)检查生成的代码质量。
    • 配置静态代码分析工具,自动检测潜在的问题和安全漏洞。

附录

在附录部分,我们将提供一些常用的配置示例和相关工具及资源链接,帮助你更方便地使用 MyBatis Generator。

常用配置示例

基本配置示例

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration><!-- 数据库连接信息 --><jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/your_database"userId="your_username"password="your_password"></jdbcConnection><!-- Java 模型生成目标包 --><javaModelGenerator targetPackage="com.yourpackage.model" targetProject="src/main/java"><property name="enableSubPackages" value="true"/><property name="trimStrings" value="true"/></javaModelGenerator><!-- SQL 映射文件生成目标包 --><sqlMapGenerator targetPackage="com.yourpackage.mapper" targetProject="src/main/resources"><property name="enableSubPackages" value="true"/></sqlMapGenerator><!-- Mapper 接口生成目标包 --><javaClientGenerator type="XMLMAPPER" targetPackage="com.yourpackage.mapper" targetProject="src/main/java"><property name="enableSubPackages" value="true"/></javaClientGenerator><!-- 表配置 --><table tableName="users" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"><generatedKey column="id" sqlStatement="MySql" identity="true"/></table>
</generatorConfiguration>

多数据库连接配置示例

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration><!-- 数据库连接 1 --><jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/your_database_1"userId="your_username_1"password="your_password_1"></jdbcConnection><!-- 数据库连接 2 --><jdbcConnection driverClass="org.postgresql.Driver"connectionURL="jdbc:postgresql://localhost:5432/your_database_2"userId="your_username_2"password="your_password_2"></jdbcConnection><!-- Java 模型生成目标包 --><javaModelGenerator targetPackage="com.yourpackage.model" targetProject="src/main/java"><property name="enableSubPackages" value="true"/><property name="trimStrings" value="true"/></javaModelGenerator><!-- SQL 映射文件生成目标包 --><sqlMapGenerator targetPackage="com.yourpackage.mapper" targetProject="src/main/resources"><property name="enableSubPackages" value="true"/></sqlMapGenerator><!-- Mapper 接口生成目标包 --><javaClientGenerator type="XMLMAPPER" targetPackage="com.yourpackage.mapper" targetProject="src/main/java"><property name="enableSubPackages" value="true"/></javaClientGenerator><!-- 表配置 1 --><table tableName="users_1" domainObjectName="User1" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"><generatedKey column="id" sqlStatement="MySql" identity="true"/></table><!-- 表配置 2 --><table tableName="users_2" domainObjectName="User2" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"><generatedKey column="id" sqlStatement="PostgreSQL" identity="true"/></table>
</generatorConfiguration>

自定义插件配置示例

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration><!-- 数据库连接信息 --><jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/your_database"userId="your_username"password="your_password"></jdbcConnection><!-- Java 模型生成目标包 --><javaModelGenerator targetPackage="com.yourpackage.model" targetProject="src/main/java"><property name="enableSubPackages" value="true"/><property name="trimStrings" value="true"/></javaModelGenerator><!-- SQL 映射文件生成目标包 --><sqlMapGenerator targetPackage="com.yourpackage.mapper" targetProject="src/main/resources"><property name="enableSubPackages" value="true"/></sqlMapGenerator><!-- Mapper 接口生成目标包 --><javaClientGenerator type="XMLMAPPER" targetPackage="com.yourpackage.mapper" targetProject="src/main/java"><property name="enableSubPackages" value="true"/></javaClientGenerator><!-- 自定义插件 --><plugin type="com.yourpackage.CustomPlugin" /><!-- 表配置 --><table tableName="users" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"><generatedKey column="id" sqlStatement="MySql" identity="true"/></table>
</generatorConfiguration>

自定义模板配置示例

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration><!-- 数据库连接信息 --><jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/your_database"userId="your_username"password="your_password"></jdbcConnection><!-- Java 模型生成目标包 --><javaModelGenerator targetPackage="com.yourpackage.model" targetProject="src/main/java"><property name="enableSubPackages" value="true"/><property name="trimStrings" value="true"/><property name="templateFile" value="path/to/templates/JavaModel.vm"/></javaModelGenerator><!-- SQL 映射文件生成目标包 --><sqlMapGenerator targetPackage="com.yourpackage.mapper" targetProject="src/main/resources"><property name="enableSubPackages" value="true"/><property name="templateFile" value="path/to/templates/SqlMap.vm"/></sqlMapGenerator><!-- Mapper 接口生成目标包 --><javaClientGenerator type="XMLMAPPER" targetPackage="com.yourpackage.mapper" targetProject="src/main/java"><property name="enableSubPackages" value="true"/><property name="templateFile" value="path/to/templates/JavaMapper.vm"/></javaClientGenerator><!-- 表配置 --><table tableName="users" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"><generatedKey column="id" sqlStatement="MySql" identity="true"/></table>
</generatorConfiguration>

    结语


    1. 回顾核心价值

    通过本系列文章的学习,我们深入探讨了 MyBatis 这一灵活、高效的持久层框架,以及其代码生成工具 MyBatis Generator 的核心机制与实践技巧。以下是核心收获总结:

    • MyBatis 的核心优势

      • SQL 与代码解耦:通过 XML 或注解直接管理 SQL,兼顾灵活性与可维护性。
      • 动态 SQL 能力:借助 <if><foreach> 等标签,轻松应对复杂查询逻辑。
      • 高度可定制化:插件机制(Interceptor)支持扩展框架行为(如分页、性能监控)。
      • 与 Spring 生态无缝集成:通过 SqlSessionTemplate@MapperScan 简化配置。
    • MyBatis Generator 的实战意义

      • 自动化代码生成:快速生成实体类、Mapper 接口及 XML 文件,减少重复劳动。
      • 规范开发流程:统一代码风格,避免人工编码的潜在错误。
      • 支持自定义模板:通过修改模板文件(如 generatorConfig.ftl)适配个性化需求。

    2. 实战中的关键启示

    在入门与实战过程中,以下几个要点值得反复强调:

    1. 配置文件是核心
      • mybatis-config.xml 中全局配置(如缓存、类型处理器)需贴合项目需求。
      • generatorConfig.xml 的精准配置(数据源、生成策略)决定了代码生成的质量。
    2. 插件扩展与优化
      • 利用 MyBatis 插件实现 SQL 日志打印、分页逻辑封装。
      • 通过自定义 Generator 插件添加 Lombok 注解、Swagger 文档等实用功能。
    3. 避免过度依赖生成工具
      • 生成的代码需结合业务逻辑二次调整(如复杂关联查询、DTO 封装)。
      • 手动编写部分 SQL 以优化性能或实现特殊需求。

    3. 继续探索的方向

    MyBatis 和 MyBatis Generator 的深入学习永无止境。以下是进一步精进的建议:

    • 高级特性研究
      • 深入理解 一级缓存与二级缓存 的机制与适用场景。
      • 掌握 延迟加载(Lazy Loading) 的配置与性能优化。
    • 源码与插件开发
      • 阅读 MyBatis 核心源码(如 SqlSessionExecutor),理解执行流程。
      • 开发自定义插件,实现审计日志、数据脱敏等企业级功能。
    • 生态整合实践
      • 结合 Spring Boot 的 mybatis-spring-boot-starter 实现零配置快速集成。
      • 探索与分布式框架(如 MyBatis-Plus、ShardingSphere)的协同使用。

    4. 资源推荐
    • 官方文档
      • MyBatis 官方文档
      • MyBatis Generator 配置指南
    • 社区与工具
      • GitHub 开源项目:MyBatis 插件集合
      • 代码生成模板库:MyBatis Generator 自定义模板示例
    • 延伸阅读
      • 书籍:《MyBatis 从入门到精通》(刘增辉 著)
      • 博客系列:MyBatis 源码深度解析

    5. 最后的话

    技术的学习不仅是工具的掌握,更是设计思想与工程实践的融合。MyBatis 以其“轻量级”与“高可控性”,在 ORM 与原生 SQL 之间找到了完美平衡,而 MyBatis Generator 则进一步解放了开发者的生产力。

    鼓励行动

    • 立即尝试为你的项目引入 MyBatis Generator,感受自动化生成的便捷。
    • 在下一个需求中,尝试手写复杂 SQL 并优化其性能,体会 MyBatis 的灵活性。

    愿你在持久层开发的征途中,既能高效完成需求,又能深入技术本质,成为真正的“SQL 手艺人”!


    期待你的反馈与分享! 🌟

    http://www.dtcms.com/wzjs/411910.html

    相关文章:

  1. 红色专题网站首页模板女教师遭网课入侵视频大全播放
  2. 网站建设公司哪家强怎么让关键词快速排名首页
  3. 国内顶级网站制作公司百度统计怎么使用
  4. 眼镜东莞网站建设网络公司有哪些
  5. 网站源码安全吗360优化大师官方最新
  6. 想自己搞一个视频网站怎么做seo优化网站网页教学
  7. wordpress优化方案网站关键词优化公司
  8. 网站建设服务项目表格网站seo工具
  9. 在什么网站上兼职做加工中心编程世界足球排名前100
  10. 邯郸做网站流程百度推广开户多少钱一个月
  11. 网站解析怎么设置电商网站建设价格
  12. 网页广告图整站优化排名
  13. 企业官网建设费用南昌seo网站排名
  14. 邵阳网站开发网站建设价格
  15. 教人做甜品的网站百度精简版入口
  16. 哪个网站做课件ppt比较好2345中国最好的网址站
  17. 北京网站建设哪便宜百度登陆
  18. 网站开发与iso9001关系网优工程师前景和待遇
  19. 唐山建设集团下岗职工网站网络广告的形式
  20. 做网站做得好的公司有哪些中国企业500强最新排名
  21. 西安搬家公司收费seo排名软件
  22. 做网站的的人收入多少钱网上培训机构
  23. 关于校园网站设计的毕业论文google关键词优化
  24. 用java做直播网站谷歌关键词搜索工具
  25. 手表网站错误怎么办巩义网络推广外包
  26. 婚礼策划方案seo优化工具软件
  27. 网址导航类网站怎么做店铺引流的30种方法
  28. 福州做网站互联网公司排名网络营销推广主要做什么?
  29. 深圳电商网站开发公司上海比较好的seo公司
  30. 如何用word做简单的网站贵阳seo网站推广