Mybatis官方生成器的使用方式

2025-01-22 04:50

本文主要是介绍Mybatis官方生成器的使用方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Mybatis官方生成器的使用方式》本文详细介绍了MyBatisGenerator(MBG)的使用方法,通过实际代码示例展示了如何配置Maven插件来自动化生成MyBatis项目所需的实体类、Map...

在这篇文章中,我们将通过实际代码示例来说明如何使用 MyBatis Generator (MBG) 来自动化生成 MyBatis 项目所需的实体类、Mapper 接口和 Mapper XML 文件。

我们将使用一个 Maven 插件来执行代码生成,并提供详细的配置和解释。

1. MyBatis Generator 简介

MyBatis Generator(简称 MBG)是 MyBatis 官方提供的工具,旨在通过数据库表结构自动生成 MyBatis 所需的代码,包括 Java 实体类(Model)、Mapper 接口以及 Mapper XML 文件。使用 MBG,可以大大减少开发人员在进行 CRUD 操作时的重复工作,提升开发效率和代码一致性。

2. MyBatis Generator 的功能

MBG 主要提供以下功能:

  • 生成 Java python实体类(Model):自动根据数据库表的结构生成对应的 Java 类,类的字段和数据库表的列一一对应。
  • 生成 Mapper 接口:为每个数据库表生成对应的 Mapper 接口,接口中包含了常见的 CRUD 方法。
  • 生成 MyBatis 映射文件(Mapper XML):根据数据库表结构,自动生成与 Mapper 接口方法对应的 XML 映射文件,其中包含 SQL 语句的定义。

3. 使用 MyBatis Generator 的优势

  • 节省时间和精力:通过自动化生成代码,减少了重复劳动,开发人员可以将更多时间专注于业务逻辑的实现。
  • 减少错误:自动生成的代码遵循一定的规范和模板,避免了手动编写时的拼写错误和不规范。
  • 提高一致性:生成的代码在结构和格式上非常统一,便于团队协作和代码的维护。
  • 灵活性和扩展性:MBG 提供了丰富的配置选项,可以根据项目的需求定制生成的代码,包括字段类型映射、SQL 语句生成规则等。

4. MyBatis Generator 配置与使用示例

4.1 Maven 插件配置

首先,我们需要在 pom.xml 中添加 MyBatis Generator 插件的配置。

以下是一个典型的 Maven 配置段:

<plugin>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-maven-plugin</artifactId>
    <version>1.4.0</version>
    <configuration>
        <!-- 指定 MyBatis Generator 的配置文件 -->
        <configurationFile>src/main/resources/generator-config-business.xml</configurationFile>
        
        <!-- 如果需要覆盖现有的代码,设置 overwrite 为 true -->
        <overwrite>true</overwrite>
      TpfTQBS  
        <!-- 显示生成过程中的详细日志 -->
        <verbose>true</verbose>
    </configuration>
    <dependencies>
        <!-- 添加数据库连接依赖,如 mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.22</version>
        </dependency>
    </dependencies>
</plugin>
  • configurationFile:指定 MyBatis Generator 的配置文件路径。
  • overwrite:如果设置为 true,则允许覆盖已存在的生成文件。
  • verbose:如果设置为 true,则会输出更多的生成过程日志,方便调试。

4.2 MyBatis Generator 配置文件

接下来是 MyBatis Generator 的核心配置文件 generator-config-business.xml,在配置生成器的基本设置时,需要关注以下几个重要配置:

数据库连接、生成的 Java 类、Mapper 类及 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="Mysql" targetRuntime="MyBatis3" defaultModelType="flat">

        <!-- 自动检查数据库的关键字并加上反引号,避免与数据库关键字冲突 -->
        <property name="autoDelimitKeywords" value="true"/>
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>

        <!-- 插件配置:增强 XML 的合并性 -->
        <plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/>

        <!-- 插件配置:自动生成 toString() 方法 -->
        <plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>

        <!-- 配置注释生成策略,这里选择不生成注释 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <!-- 配置数据库连接,修改为实际数据库的连接信息 -->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/train?characterEncoding=UTF8&amp;allowpublicKeyRetrieval=true&amp;useSSL=false&amp;serverTimezone=Asia/Shanghai"
                        userId="train"
                        password="123456">
        </jdbcConnection>

        <!-- 配置生成的实体类位置 -->
        <javaModelGenerator targetProject="../member/src/main/java"
                            targetPackage="com.stu.train.member.domain"/>

        <!-- 配置生成的 SQL 映射文件位置 -->
        <sqlMapGenerator targetProject="../member/src/main/resources"
                         targetPackage="mapper"/>

        <!-- 配置生成的 Mapper 类位置 -->
        <javaClienjstGenerator targetProject="../member/src/main/java"
                             targetPackage="com.stu.train.member.mapper"
                             type="XMLMAPPER"/>

        <!-- 选择要生成代码的数据库表 -->
        <table tableName="passenger" domainObjectName="Passenger"/>
    </context>
</generatorConfiguration>

4.3 配置项说明

  • jdbcConnection:配置数据库连接信息,包括数据库的 URL、用户名、密码等。
  • javaModelGenerator:配置生成的 Java 实体类的存放位置。
  • sqlMapGenerator:配置生成的 SQL 映射文件的存放位置。
  • javaClientGenerator:配置生成的 Mapper 接口类的位置。
  • table:指定要生成代码的数据库表,可以多次配置以支持多个表。

4.4 执行 MyBatis Generator 生成代码

配置完成后,可以通过 Maven 执行代码生成。

在命令行中运行以下命令(或者在 Maven 插件中双击执行):

mvn mybatis-generator:generate

执行后,MyBatis Generator 会根据配置文件自动生成对应的 Java 实体类、Example 类(用于复杂查询)、Mapper 接口和 Mapper XML 文件。

生成的文件结构大致如下:

src/main/java
    └── com
        └── stu
            └── train
                └── member
                    └── domain
                        └── Passenger.java   <-- 生成的实体类
                        └── PassengerExample.java   <-- 生成的辅助类
                    └── mapper
                        └── PassengerMapper.java   <-- 生成的 Mapper 接口
src/main/resources
    └── mapper
        └── PassengerMapper.xml  <-- 生成的 XML 映射文件

MyBatis Generator 自动生成的代码包括以下几个部分:

  1. 实体类(Passenger.java:对应数据库表的每一列,它通常包含基本的字段、getter 和 setter 方法。
  2. Example 类(PassengerExample.java:用于构建动态查询条件,支持链式调用来添加查询条件、排序、分页等。
  3. Mapper 接口(PassengerMapper.java:定义与数据库交互的方法,如增、删、改、查。
  4. Mapper XML 文件(PassengerMapper.xml:对应 Mapper 接口的方法,编写 SQL 查询语句。

4.5 生成的代码示例

Passenger.java(实体类)

public class Passenger {
    private Integer id;
    private String name;
    private Integer age;

    // Getter 和 Setter 方法

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

PassengerMapper.java(MapChina编程per 接口)

public interface PassengerMapper {
    int deleteByPrimaryKey(Integer id);

    int insert(Passenger record);

    Passenger selectByPrimaryKey(Integer id);

    int updateByPrimaryKey(Passenger record);

    List<Passenger> selectByExample(PassengerExample example);
}

PassengerMapper.xml(Mapper 映射文件)

<mapper namespace="com.stu.train.member.mapper.PassengerMapper">
    <!-- 查询单个乘客 -->
    <select id="selectByPrimaryKey" resultType="com.stu.train.member.domain.Passenger">
        SELECT id, name, age FROM passenger WHERE id = #{id}
    </select>

    <!-- 插入乘客 -->
    <insert id="insert" parameterType="com.stu.train.member.domain.Passenger">
        INSERT INTO passenger (name, age) VALUES (#{name}, #{age})
    </insert>

    <!-- 删除乘客 -->
    <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
        DELETE FROM passenger WHERE id = #{id}
    </delete>

    <!-- 更新乘客 -->
    <update id="updateByPrimaryKey" parameterType="com.stu.train.member.domain.Passenger">
        UPDATE passenger
        SET name = #{name}, age = #{age}
        WHERE id = #{id}
    </update>
</mapper>

PassengerExample.java(Example 类)

PassengerExample 类是用来构建 SQL 查询条件的。它通常包含一个内部类 Criteria,用来定义具体的查询条件。

以下是一个 PassengerExample 的生成代码示例:

public class PassengerExample {
    protected String orderByClause;
    protected boolean distinct;
    protected List<Criteria> oredCriteria;

    public PassengerExample() {
        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() {
        return new Criteria();
    }

    // 清除查询条件
    public void clear() {
        oredCriteria.clear();
        orderByClause = null;
        distinct = false;
    }

    public static class Criteria {
        protected List<Criterion> criteria;

        protected Criteria() {
编程            criteria = new ArrayList<>();
        }

        // 判断条件是否有效
        public boolean isValid() {
            return criteria.size() > 0;
        }

        // 获取所有条件
        public List<Criterion> getAllCriteria() {
            return criteria;
        }

        // 添加单一条件
        public void addCriterion(String condition) {
            criteria.add(new Criterion(condition));
        }

        public void addCriterion(String condition, Object value, String property) {
            criteria.add(new Criterion(condition, value));
        }

        public void addCriterion(String condition, Object value1, Object value2, String property) {
            criteria.add(new Criterion(condition, value1, value2));
        }

        // 例如,添加条件:id = ?
        public Criteria andIdEqualTo(Integer value) {
            addCriterion("id =", value, "id");
            return this;
        }

        // 例如,添加条件:name like ?
        public Criteria andNameLike(String value) {
            addCriterion("name like", value, "name");
            return this;
        }

        // ...更多查询条件方法
    }

    // 用于表示一个条件
    public static class Criterion {
        private String condition;
        private Object value;
        private Object secondValue;

        public Criterion(String condition) {
            this.condition = condition;
        }

        public Criterion(String condition, Object value) {
            this(condition);
            this.value = value;
        }

        public Criterion(String condition, Object value, Object secondValue) {
            this(condition, value);
            this.secondValue = secondValue;
        }

        public String getCondition() {
            return condition;
        }

        public Object getValue() {
            return value;
        }

        public Object getSecondValue() {
            return secondValue;
        }
    }
}

4.6 使用 Example 类进行动态查询

使用 PassengerExample 类进行动态查询时,可以通过 Criteria 类来设置查询条件,然后传递给 Mapper 方法。

例如:

PassengerExample example = new PassengerExample();
PassengerExample.Criteria criteria = example.createCriteria();
criteria.andNameLike("%John%");  // 查询 name 字段包含 "John" 的记录
criteria.andAgeGreaterThan(20);  // 查询 age 大于 20 的记录

List<Passenger> passengers = passengerMapper.selectByExample(example);

在这个例子中,我们使用 PassengerExampleCriteria 构造了一个动态 SQL 查询,其中包含了两个条件:

  1. name 字段包含 “John”。
  2. age 字段大于 20。

最后,使用 passengerMapper.selectByExample(example) 执行查询操作。

总结

通过 MyBatis Generator 的配置和使用示例,我们可以快速根据数据库表生成实体类、Mapper 接口和 XML 映射文件,极大地提高开发效率。

上述代码示例展示了如何在 Maven 项目中配置 MyBatis Generator,并结合实际数据库表生成相应的代码。通过自定义配置文件,我们可以控制生成的代码风格、存放位置以及生成的内容,进一步提高代码的自动化程度和一致性。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程China编程(www.chinasem.cn)。

这篇关于Mybatis官方生成器的使用方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153178

相关文章

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用