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

Mybatis官方生成器使用示例

在这篇文章中,我们将通过实际代码示例来说明如何使用 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 实体类(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><!-- 显示生成过程中的详细日志 --><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 generatorConfigurationPUBLIC "-//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 类位置 --><javaClientGenerator 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(Mapper 接口)
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 passengerSET 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) 执行查询操作。

5. 总结

通过 MyBatis Generator 的配置和使用示例,我们可以快速根据数据库表生成实体类、Mapper 接口和 XML 映射文件,极大地提高开发效率。上述代码示例展示了如何在 Maven 项目中配置 MyBatis Generator,并结合实际数据库表生成相应的代码。通过自定义配置文件,我们可以控制生成的代码风格、存放位置以及生成的内容,进一步提高代码的自动化程度和一致性。

相关文章:

Mybatis官方生成器使用示例

在这篇文章中&#xff0c;我们将通过实际代码示例来说明如何使用 MyBatis Generator (MBG) 来自动化生成 MyBatis 项目所需的实体类、Mapper 接口和 Mapper XML 文件。我们将使用一个 Maven 插件来执行代码生成&#xff0c;并提供详细的配置和解释。 1. MyBatis Generator 简介…...

演员王子辰—专注革命题材 《前行者》后再出发

2021年10月22日在北京卫视播出的由张鲁一、聂远等人主演的电视剧《前行者》&#xff0c;讲述了在二十世纪三十年代初&#xff0c;因叛徒出卖&#xff0c;我上海地下党组织遭到严重破坏&#xff0c;革命事业陷入一片白色恐怖之中。我党情报员马天目刚从法国归来&#xff0c;临危…...

Spring Boot基础教学:创建第一个Spring Boot项目

使用Spring Initializr生成项目 Spring Initializr是一个在线工具&#xff0c;用于快速生成Spring Boot项目的基本结构。以下是使用Spring Initializr创建项目的步骤&#xff1a; 步骤1&#xff1a;访问Spring Initializr 打开网址 start.spring.io。 步骤2&#xff1a;选择…...

基于SpringBoot+Vue实现校园多媒体信息共享平台

作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参与学生毕业答辩指导&#xff0c;…...

WebRTC API分析

主题 本文详细描述常用的webrtc api 媒体协商类 myPeerConnection.createOffer([options]); var options { offerToReceiveAudio: true, // 告诉另一端&#xff0c;你是否想接收音频&#xff0c;默认true offerToReceiveVideo: true, // 告诉另一端&a…...

ArkTS学习笔记:ArkTS起步

ArkTS是HarmonyOS的主力应用开发语言&#xff0c;基于TypeScript扩展&#xff0c;强化了静态检查和分析&#xff0c;旨在提升程序稳定性和性能。它采用静态类型&#xff0c;禁止运行时改变对象布局&#xff0c;并对UI开发框架能力进行扩展&#xff0c;支持声明式UI描述和自定义…...

spring-gateway网关聚合swagger实现多个服务接口切换

前提条件 微服务已经集成了swagger&#xff0c;并且注册进了nacos。 gateway配置 package com.zmy.springcloud.config;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springfra…...

关于 Oracle Database Express Edition 的功能和安装

Oracle Database Express Edition&#xff0c;简称 Oracle Database XE。是一个免费的版本&#xff0c;主要用于培训和一些功能要求比较简单&#xff0c;又需要免费分发的场景。 看看官方的说明&#xff1a; Whether you are a developer, a DBA, a data scientist, an educat…...

领夹麦克风哪个品牌好,手机领夹麦克风哪个牌子好,选购推荐

​无线麦克风凭借其无与伦比的便携性与灵活性&#xff0c;成为在演讲、表演以及会议等多种场合中不可或缺的有力帮手。它挣脱了线缆的束缚&#xff0c;使得声音的传播更加自由自在。其操作十分简便&#xff0c;只需简单配对就能投入使用&#xff0c;从而可以轻松地适应各类场景…...

什么是 Go 语言?

Go 语言&#xff08;也称为 Golang&#xff09;是由 Google 开发的一种开源编程语言。它最初由 Rob Pike、Ken Thompson 和 Robert Griesemer 等人于 2007 年设计&#xff0c;经过两年的研发&#xff0c;于 2009 年首次公开发布。Go 语言的设计目标是提高编程效率&#xff0c;特…...

AI 大模型重塑软件开发流程:定义、应用、优势与挑战

随着人工智能技术的飞速发展&#xff0c;AI 大模型正在深刻影响软件开发的各个环节。从代码自动生成到智能测试&#xff0c;AI 大模型不仅提高了开发效率&#xff0c;还带来了全新的开发模式和流程变化。本文将从 AI 大模型的定义、应用场景、优势以及挑战等方面&#xff0c;探…...

微服务即时通讯系统的实现(客户端)----(1)

目录 1. 项目整体介绍1.1 项目概况1.2 界面预览和功能介绍1.3 技术重点和服务器架构 2. 项目环境搭建2.1 安装Qt62.3 安装vcpkg2.3 安装protobuf2.4 构建项目2.5 配置CMake属性 3. 项目核心数据结构的实现3.1 创建data.h存放核心的类3.2 工具函数的实现3.3 创建编译开关 4. 界面…...

【freertos】FreeRTOS时间管理

FreeRTOS时间管理 一、睡眠延时函数1、vTaskDelay2、vTaskDelayUntil3、相对延时与绝对延时对比 二、自定义延时函数1、微秒延时2、毫秒延时 一、睡眠延时函数 1、vTaskDelay \quad 在UCOSIII 中延时函数OSTimeDly()可以设置为三种模式:相对模式、周期模式和绝对模式。在FreeR…...

台式电脑没有声音怎么办?台式电脑没有声音解决详解

台式电脑一般来说都是没有内置扬声器的&#xff0c;需要连接耳机或者是音响才可以播放音乐。那么如果遇到台式电脑没有声音的问题&#xff0c;我们也需要确认这些设备硬件有没问题&#xff0c;知道原因才可以进行处理。下面本文将为你介绍台式电脑没有声音的可能原因和解决方法…...

机器学习基础02

目录 1.特征工程 1.1特征工程概念 1.2特征工程的步骤 1.3特征工程-特征提取 1.3.1字典列表(json)特征提取 1.3.2文本特征提取 英文文本提取 中文文本提取 1.3.3TF-IDF文本特征词的稀有程度特征提取 2.无量纲化 2.1归一化 2.2标准化 2.3fit、fit_transform、transfo…...

element plus的表格内容自动滚动

<el-table:data"tableData"ref"tableRef"borderstyle"width: 100%"height"150"><el-table-column prop"date" label"名称" width"250" /><el-table-column prop"name" label&…...

哈佛商业评论 | 未来商业的技术趋势:百度李彦宏谈技术如何变革商业

在《哈佛商业评论》的HBR IdeaCast节目中&#xff0c;百度联合创始人、首席执行官兼董事长李彦宏分享了他对人工智能&#xff08;AI&#xff09;和其他技术趋势的见解。这期节目讨论了百度如何将生成式AI融入业务&#xff0c;以及这些技术如何重塑我们的生活和工作方式。让我们…...

Pytorch如何将嵌套的dict类型数据加载到GPU

在PyTorch中&#xff0c;您可以使用.to(device)方法将嵌套的字典中的所有支持的Tensor对象转移到GPU。以下是一个简单的例子 import torch# 假设您已经有了一个名为device的GPU设备对象 device torch.device("cuda:0" if torch.cuda.is_available() else "cp…...

Shell基础2

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团…...

7z 解压器手机版与解压专家:安卓解压工具对决

7z 解压器手机版和解压专家都是在安卓设备上广受欢迎的解压软件。7z 解压器手机版由深圳乡里云网络科技有限公司开发&#xff0c;大小为 32.8M&#xff0c;支持多种常见的压缩文件格式&#xff0c;如.zip、.rar、.7z 等。 它对安卓操作系统的特性和用户习惯进行了优化&#xf…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

路由基础-路由表

本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中&#xff0c;往往存在多个不同的IP网段&#xff0c;数据在不同的IP网段之间交互是需要借助三层设备的&#xff0c;这些设备具备路由能力&#xff0c;能够实现数据的跨网段转发。 路由是数据通信网络中最基…...