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&allowPublicKeyRetrieval=true&useSSL=false&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 自动生成的代码包括以下几个部分:
- 实体类(
Passenger.java
):对应数据库表的每一列,它通常包含基本的字段、getter 和 setter 方法。 Example
类(PassengerExample.java
):用于构建动态查询条件,支持链式调用来添加查询条件、排序、分页等。- Mapper 接口(
PassengerMapper.java
):定义与数据库交互的方法,如增、删、改、查。 - 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);
在这个例子中,我们使用 PassengerExample
和 Criteria
构造了一个动态 SQL 查询,其中包含了两个条件:
name
字段包含 “John”。age
字段大于 20。
最后,使用 passengerMapper.selectByExample(example)
执行查询操作。
5. 总结
通过 MyBatis Generator 的配置和使用示例,我们可以快速根据数据库表生成实体类、Mapper 接口和 XML 映射文件,极大地提高开发效率。上述代码示例展示了如何在 Maven 项目中配置 MyBatis Generator,并结合实际数据库表生成相应的代码。通过自定义配置文件,我们可以控制生成的代码风格、存放位置以及生成的内容,进一步提高代码的自动化程度和一致性。
相关文章:

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

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

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

基于SpringBoot+Vue实现校园多媒体信息共享平台
作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参与学生毕业答辩指导,…...

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

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

spring-gateway网关聚合swagger实现多个服务接口切换
前提条件 微服务已经集成了swagger,并且注册进了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,简称 Oracle Database XE。是一个免费的版本,主要用于培训和一些功能要求比较简单,又需要免费分发的场景。 看看官方的说明: Whether you are a developer, a DBA, a data scientist, an educat…...

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

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

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

微服务即时通讯系统的实现(客户端)----(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…...

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

机器学习基础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节目中,百度联合创始人、首席执行官兼董事长李彦宏分享了他对人工智能(AI)和其他技术趋势的见解。这期节目讨论了百度如何将生成式AI融入业务,以及这些技术如何重塑我们的生活和工作方式。让我们…...

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

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

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

C++清除所有输出【DEV-C++】所有编辑器通用 | 算法基础NO.1
各位小伙伴们,上一期的保留小数位数教学够用一辈子,有不错的点赞量,可我连一个粉丝铁粉都没有,你愿意做我的第一个铁粉吗?OK废话不多说,开始! 温故与知心 可能你也学过,且是工作者…...

【Android、IOS、Flutter、鸿蒙、ReactNative 】启动页
Android 设置启动页 自定义 splash.xml 通过themes.xml配置启动页背景图 IOS 设置启动页 LaunchScreen.storyboard 设置为启动页 storyboard页面绘制 Assets.xcassets 目录下导入图片 AppLogo Flutter 设置启动页 Flutter Android 设置启动页 自定义 launch_background.xm…...

SpringBoot 2.2.10 无法执行Test单元测试
很早之前的项目今天clone现在,想执行一个业务订单的检查,该检查的代码放在test单元测试中,启动也是好好的,当点击对应的方法执行Test的时候就报错 tip:已添加spring-boot-test-starter 所以本身就引入了junit5的库 No…...

聊天服务器(8)用户登录业务
目录 登录状态业务层代码数据模型层代码记录用户的连接信息以及线程安全问题客户端异常退出业务 登录状态 登录且状态变为online 业务层代码 #include "chatservice.hpp" #include "public.hpp" #include <string> #include <muduo/base/Loggi…...

stm32在linux环境下的开发与调试
环境安装 注:文末提供一键脚本 下载安装stm32cubeclt 下载地址为:https://www.st.com/en/development-tools/stm32cubeclt.html 选择 linux版本下载安装 安装好后默认在家目录st下 > $ ls ~/st/stm32cubeclt_1.16.0 …...

flinkOnYarn并配置prometheus+grafana监控告警
flinkOnYarn并配置prometheusgrafana监控告警 一、相关服务版本: flink版本:1.17.2 pushgateway版本:1.10.0 prometheus版本:3.0.0 grafana-v11.3.0参考了网上的多个文档以及学习某硅谷的视频,总结了一下文档&#x…...

麒麟系统下docker搭建jenkins
首先我们需要创建宿主机挂载路径,我这里放在本地的/data/henkins/home,然后赋予权限,命令如下: mkdir -p /data/jenkins/home chown -R 1000:1000 /data/jenkins/home chmod -R 777 /data/jenkins/homedocker run -d --restart …...

论文阅读 - Causally Regularized Learning with Agnostic Data Selection
代码链接: GitHub - HMTTT/CRLR: CRLR尝试实现 https://arxiv.org/pdf/1708.06656v2 目录 摘要 INTRODUCTION 2 RELATED WORK 3 CAUSALLY REGULARIZED LOGISTIC REGRESSION 3.1 Problem Formulation 3.2 Confounder Balancing 3.3 Causally Regularized Lo…...

计算机网络之会话层
一、会话层的核心功能 会话层作为OSI模型的第五层,不仅承担着建立、管理和终止通信会话的基本任务,还隐含着许多复杂且关键的功能,这些功能共同确保了网络通信的高效、有序和安全。 1. 会话建立与连接管理: 身份验证与授权&…...

blind-watermark - 水印绑定
文章目录 一、关于 blind-watermark安装 二、bash 中使用三、Python 调用1、基本使用2、attacks on Watermarked Image3、embed images4、embed array of bits 四、并发五、相关 Project 一、关于 blind-watermark Blind watermark 基于 DWT-DCT-SVD. github : https://githu…...