5.6 Mybatis代码生成器Mybatis Generator (MBG)实战详解

文章目录
  • 前言
  • 一、Mybatis Generator简介
  • 二、Maven插件运行方式
  • 三、生成配置 generatorConfig.xml
    • MyBatis3Simple风格
    • MyBatis3风格
    • MyBatis3DynamicSql风格
  • 四、Java代码运行方式
  • 五、MGB生成全部表
  • 六、增加Ext包
  • 七、Git提交
  • 总结

前言

本文我们主要实战Mybatis官方的代码生成器:Mybatis Generator(MBG),掌握它以后,可以简化大部分手写代码,我们只需要写复杂逻辑代码!

通过前几篇,我们掌握了在SpringBoot下Mybatis的基本用法,操作步骤回顾一下:

  1. 创建与MySQL表对应的Java PO对象,字段一一对应;
  2. 创建Mapper接口,和对应的XML映射文件(或注解)。

在实际开发中,你会发现有很多重复的工作:

  1. 首先是PO对象,我们往往创建与数据库表字段一一对应的PO对象;
  2. 其次在Mapper里,通常都会写基本的增删改查代码。

重复不符合我们程序员的风格:

  1. 其实对于PO对象,只需要读取数据库表字段,然后做SQL列类型与Java字段类型转换,再将列名转成骆驼命名就可以实现,所以能实现的代码生成器也非常多!
  2. 再者对于单表的基本增删改查是ORM的基本功能,像JPA对单表的基本增删改查都进行了封装!
    那么在Mybatis里,这些当然也不在话下,Mybatis官方为我们提供了非常好用的代码生成器:Mybatis Generator (MBG) 。

本文就带大家实战一下Mybatis Generator,用它生成实战项目全部表的PO对象和基本增删改查代码!


一、Mybatis Generator简介

Mybatis Generator(MBG)是Mybatis官方提供的一个代码生成工具,它可以根据数据库表自动生成对应的Java Model、Mapper和XML文件,甚至还可以生成一些高级查询功能,使用Mybatis-Generator可以大大降低开发者的工作量,提高开发效率!

支持使用Maven插件生成,也支持编写Java代码生成,还有命令行等等多种方式!
支持生成XML映射文件风格的代码,也支持生成全注解风格的代码!


二、Maven插件运行方式

首先在工程tg-book-dal的pom.xml中,根节点project下添加build节点,如下:

<build><resources><resource><directory>src/main/resources</directory><filtering>true</filtering></resource></resources><plugins><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.7</version><configuration><verbose>true</verbose><overwrite>true</overwrite></configuration><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.21</version></dependency></dependencies></plugin></plugins>
</build>

然后刷新tg-book-dal的Maven依赖,你就能看到mybatis-generator插件了,如下图:
在这里插入图片描述

注意,这时生成时会报错,因为我们还需要添加配置文件,接着向下看.


三、生成配置 generatorConfig.xml

在tg-book-dal 的 src/main/resources 下 添加配置文件: generatorConfig.xml ,用于配置生成风格,数据库连接、生成代码包路径、生成哪些表等等,各配置参数详解参考注释:
注意:==我增加了几个实用的可选配置,像生成时覆盖原文件、去除注释、自增主键列、columnOverride ==

<!DOCTYPE generatorConfiguration PUBLIC"-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration><!-- MyBatis3Simple风格 --><context id="simple" targetRuntime="MyBatis3Simple"><property name="javaFileEncoding" value="UTF-8"/><!--生成mapper.xml时覆盖原文件--><plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/><commentGenerator><!-- 是否去除自动生成的注释 true:是 : false:否。 自动生成注释太啰嗦,可以编码扩展CommentGenerator --><property name="suppressAllComments" value="true"/></commentGenerator><!-- 数据库连接 --><jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/db_book?useUnicode=true&amp;characterEncoding=utf8&amp;tinyInt1isBit=true&amp;serverTimezone=UTC"userId="root" password="root"><!-- 设置为true就只读取db_book下的表, 否则会优先读取到mysql的user表  --><property name="nullCatalogMeansCurrent" value="true"/></jdbcConnection><!-- 生成PO的包名和位置 --><javaModelGenerator targetPackage="org.tg.book.dal.po.mbg" targetProject="src/main/java"/><!-- 生成XML映射文件的包名和位置 --><sqlMapGenerator targetPackage="org.tg.book.dal.mapper.mbg" targetProject="src/main/resources"/><!-- 生成Mapper接口的包名和位置 --><javaClientGenerator type="XMLMAPPER" targetPackage="org.tg.book.dal.mapper.mbg" targetProject="src/main/java"/><!-- 要生成对应表配置 --><table tableName="user" domainObjectName="User" ><!-- 自增主键列 --><generatedKey column="id" sqlStatement="MYSQL" identity="true"/><!-- tinyint映射为Integer --><columnOverride column="role" javaType="Integer" jdbcType="TINYINT"/></table></context>
</generatorConfiguration>

MyBatis3Simple风格

上面配置的是MyBatis3Simple风格,只配置了一个表:user,双击插件的mybatis-generator:generate以后,生成的代码如下:
在这里插入图片描述

MyBatis3Simple风格生成的代码比较精简,看一看UserMapper的接口方法,只有基本的增删改查方法:

public interface UserMapper {int deleteByPrimaryKey(Integer id);int insert(User record);User selectByPrimaryKey(Integer id);List<User> selectAll();int updateByPrimaryKey(User record);
}

MyBatis3风格

我们再看看MyBatis3风格,只需要将 targetRuntime=“MyBatis3Simple” 修改为 targetRuntime=“MyBatis3”,然后再双击插件的mybatis-generator:generate,就可以看到增加了 “by example” 和 “selective” 方法
在这里插入图片描述

  • selective方法:选择性插入或更新,判断PO字段不为空才插入或修改。在只需要插入或修改个别字段值时使用,对应生成的SQL不包括=null的字段,但同样也需要注意,你无法用它将字段设置为null。 ??
  • by example方法:这个东西有点小强大,可以动态生成各种查询条件,在后面的接口开发实战中我们再使用。但就是生成的代码有点多,没有实现example代码的复用。对于单表复杂查询喜欢直接SQL的,可以禁用生成example,可以通过table节点的如下配置来指定是否启用。

属性

说明

enableSelectByExample

是否启用生成selectByExample

enableDeleteByExample

是否启用生成deleteByExample

enableCountByExample

是否启用生成countByExample

enableUpdateByExample

是否启用生成updateByExample和updateByExampleSelective

MyBatis3DynamicSql风格

只需要将 targetRuntime=“MyBatis3” 修改为 targetRuntime=“MyBatis3DynamicSql”。
生成的代码是全注解风格的,也就不会生成UserMapper.xml和UserExample类,而是新生成了UserDynamicSqlSupport类。

需要增加mybatis-dynamic-sql依赖包:

<!--mybatis-dynamic-sql-->
<dependency><groupId>org.mybatis.dynamic-sql</groupId><artifactId>mybatis-dynamic-sql</artifactId><version>1.1.4</version>
</dependency>

四、Java代码运行方式

除了使用插件运行方式来生成,我们还可以以Java代码方式运行,添加mybatis-generator-core依赖包,如下:

<dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-core</artifactId><version>1.3.7</version>
</dependency>

添加main方法,如下:

package org.tg.book.dal;import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;public class MybatisGeneratorRunner {public static void main(String[] args) throws XMLParserException, IOException, InvalidConfigurationException, SQLException, InterruptedException {List<String> warnings = new ArrayList<String>();boolean overwrite = true;// 使用xml配置文件的方式File configFile = new File(MybatisGeneratorRunner.class.getClassLoader().getResource("generatorConfig.xml").getPath());ConfigurationParser cp = new ConfigurationParser(warnings);Configuration config = cp.parseConfiguration(configFile);// 使用纯Java代码配置的方式, 相当于把 generatorConfig.xml配置的都用java代码配置到config中// config = new Configuration();DefaultShellCallback callback = new DefaultShellCallback(overwrite);MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);myBatisGenerator.generate(null);System.out.println(warnings);}
}

注意:我执行后生成到父项目下了??,需要修改generatorConfig.xmltargetProject加上项目名称,如下:

<!-- 生成PO的包名和位置 -->
<javaModelGenerator targetPackage="org.tg.book.dal.po.mbg" targetProject="tg-book-dal/src/main/java"/><!-- 生成XML映射文件的包名和位置 -->
<sqlMapGenerator targetPackage="org.tg.book.dal.mapper.mbg" targetProject="tg-book-dal/src/main/resources"/><!-- 生成Mapper接口的包名和位置 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="org.tg.book.dal.mapper.mbg" targetProject="tg-book-dal/src/main/java"/>

targetProject加上tg-book-dal以后用插件生成,又提示目录找不到,汗(⊙﹏⊙)b

[WARNING] The specified target project directory tg-book-dal/src/main/resources does not exist
[WARNING] The specified target project directory tg-book-dal/src/main/java does not exist
[WARNING] The specified target project directory tg-book-dal/src/main/java does not exist
[WARNING] The specified target project directory tg-book-dal/src/main/java does not exist

五、MGB生成全部表

一共8张表,主要注意点

  • generatedKey:配置自增id
  • columnOverride:指定tinyint列映射到Java类型是Integer还是Boolean

除了user的另外7张表配置:

<table tableName="book" domainObjectName="Book" ><generatedKey column="id" sqlStatement="MYSQL" identity="true"/><columnOverride column="status" javaType="Integer" jdbcType="TINYINT"/><columnOverride column="is_recommend" javaType="Boolean" jdbcType="TINYINT"/>
</table>
<table tableName="book_borrowing" domainObjectName="BookBorrowing" ><generatedKey column="id" sqlStatement="MYSQL" identity="true"/><columnOverride column="status" javaType="Integer" jdbcType="TINYINT"/>
</table>
<table tableName="book_comment" domainObjectName="BookComment" ><generatedKey column="id" sqlStatement="MYSQL" identity="true"/><columnOverride column="score" javaType="Integer" jdbcType="TINYINT"/>
</table>
<table tableName="book_favorite" domainObjectName="BookFavorite" ><generatedKey column="id" sqlStatement="MYSQL" identity="true"/><columnOverride column="is_cancelled" javaType="Boolean" jdbcType="TINYINT"/>
</table>
<table tableName="notice" domainObjectName="Notice" ><generatedKey column="id" sqlStatement="MYSQL" identity="true"/><columnOverride column="is_deleted" javaType="Boolean" jdbcType="TINYINT"/>
</table>
<table tableName="qualification" domainObjectName="Qualification" ><generatedKey column="id" sqlStatement="MYSQL" identity="true"/><columnOverride column="status" javaType="Integer" jdbcType="TINYINT"/>
</table>
<table tableName="student" domainObjectName="Student" ><generatedKey column="id" sqlStatement="MYSQL" identity="true"/><columnOverride column="is_approved" javaType="Boolean" jdbcType="TINYINT"/><columnOverride column="is_frozen" javaType="Boolean" jdbcType="TINYINT"/>
</table>

六、增加Ext包

mbg包的代码我们不做任何修改,为了便于区分,我们将自定义的PO和Mapper单独放到ext包下,命名以Ext结尾。

  • 原来的UserMapper修改为UserMapperExt
  • 删除原来的BookMapper和BookMapperImpl,用MBG生成的BookMapper替代,原来引用的关联代码都修改一下
  • 删除原来的PO对象:User和Book,用MBG生成的User和Book替代,原来引用的关联代码都修改一下
  • AuthServiceImpl、BookServiceImpl、UserServiceImpl都有修改的点

最终结构dal的 mapper和po包,如下:
在这里插入图片描述
最终的mapper XML映射文件,如下:
在这里插入图片描述


七、Git提交

养成好习惯,一步一提交!
在这里插入图片描述


总结

本文主要介绍了Mybatis Generator (MBG)生成代码的2种生成方式(当然还支持其它方式):

  1. Maven插件方式
  2. Java代码方式

以及generatorConfig.xml配置的3种生成风格

  1. MyBatis3Simple风格
  2. MyBatis3风格
  3. MyBatis3DynamicSql风格

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/12799.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek:全栈开发者视角下的AI革命者

目录​​​​​​​ DeepSeek&#xff1a;全栈开发者视角下的AI革命者 写在前面 一、DeepSeek的诞生与定位 二、DeepSeek技术架构的颠覆性突破 1、解构算力霸权&#xff1a;从MoE架构到内存革命 2、多模态扩展的技术纵深 3、算法范式的升维重构 4、重构AI竞争规则 三、…

(篇一)基于PyDracula搭建一个深度学习的界面之添加启动界面

文章目录 基于PyDracula搭建一个深度学习的界面插入一个启动界面1启动页面的资源如何加载与管理&#xff1f;2启动界面的代码如何写&#xff1f; 基于PyDracula搭建一个深度学习的界面 插入一个启动界面 1启动页面的资源如何加载与管理&#xff1f; 1. 问题一 启动界面包含一…

无人机图传模块 wfb-ng openipc-fpv,4G

openipc 的定位是为各种模块提供底层的驱动和linux最小系统&#xff0c;openipc 是采用buildroot系统编译而成&#xff0c;因此二次开发能力有点麻烦。为啥openipc 会用于无人机图传呢&#xff1f;因为openipc可以将现有的网络摄像头ip-camera模块直接利用起来&#xff0c;从而…

拍照对比,X70 PRO与X90 PRO+的细节差异

以下是局部截图&#xff08;上X70P下X90PP&#xff09; 对比1 这里看不出差异。 对比2 X90PP的字明显更清楚。 对比3 中下的字&#xff0c;X90PP显然更清楚。

深度探索 C 语言操作符:从基础到实战应用

前言&#xff1a; 在 C 语言的编程体系中&#xff0c;操作符就像是一个个精密的齿轮&#xff0c;相互配合驱动着程序的运转。熟练掌握操作符的使用&#xff0c;不仅能编写出高效、简洁的代码&#xff0c;还能深入理解程序运行的底层逻辑。接下来&#xff0c;让我们一同深入探索…

从零开始实现一个双向循环链表:C语言实战

文章目录 1链表的再次介绍2为什么选择双向循环链表&#xff1f;3代码实现&#xff1a;从初始化到销毁1. 定义链表节点2. 初始化链表3. 插入和删除节点4. 链表的其他操作5. 打印链表和判断链表是否为空6. 销毁链表 4测试代码5链表种类介绍6链表与顺序表的区别7存储金字塔L0: 寄存…

简单本地部署deepseek(软件版)

Download Ollama on Windows 下载 下载安装 winr 输入 cmd 然后输入ollama -v&#xff0c;出现ollama版本&#xff0c;安装成功 deepseek-r1 选择1.5b 输入 cmd 下面代码 ollama run deepseek-r1:1.5b 删除deepseek的代码如下&#xff1a; ollama rm deepseek-r1:1.5b 使用…

21.2.1 基本操作

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 Excel的基本操作步骤&#xff1a; 1、打开Excel&#xff1a;定义了一个Application对象&#xff1a; Microsoft.Office.Interop.E…

SGlang 专为大模型设计的高效服务框架

SGlang 是一种专为大型语言模型&#xff08;LLM&#xff09;和视觉语言模型&#xff08;VLM&#xff09;设计的高效服务框架&#xff0c;旨在提升模型的推理速度和灵活性。以下是关于 SGlang 框架的详细介绍&#xff1a; 1. 框架背景与目标 SGlang 是一种快速服务框架&#x…

基于SpringBoot+vue高效旅游管理系统

Spring Boot后端与Vue前端融合&#xff1a;构建高效旅游管理系统 目录 一、项目简介 二、开发技术与环境配置 2.1 SpringBoot框架 2.2 Java语言简介 2.3 Vue的介绍 2.4 mysql数据库介绍 2.5 B/S架构 三、系统功能实现 四、系统项目截图 登录页面 后台管理页面 用户…

visual studio安装

一、下载Visual Studio 访问Visual Studio官方网站。下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux 在主页上找到并点击“下载 Visual Studio”按钮。 选择适合需求的版本&#xff0c;例如“Visual Studio Community”&#xff08;免费版本&#xff09;&#x…

【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(四) -> 常见组件(一)

目录 1 -> List 1.1 -> 创建List组件 1.2 -> 添加滚动条 1.3 -> 添加侧边索引栏 1.4 -> 实现列表折叠和展开 1.5 -> 场景示例 2 -> dialog 2.1 -> 创建Dialog组件 2.2 -> 设置弹窗响应 2.3 -> 场景示例 3 -> form 3.1 -> 创建…

Java中的object类

1.Object类是什么&#xff1f; &#x1f7ea;Object 是 Java 类库中的一个特殊类&#xff0c;也是所有类的父类(超类),位于类继承层次结构的顶端。也就是说&#xff0c;Java 允许把任何类型的对象赋给 Object 类型的变量。 &#x1f7e6;Java里面除了Object类&#xff0c;所有的…

manimgl安装

一、环境 笔记本 $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.5 LTS Release: 22.04 Codename: jammy二、安装miniconda3 manimgl基于python开发&#xff0c;为了防止将笔记本中已有的python环境破坏&#xff0c;因此…

c++中priority_queue的应用及模拟实现

1.介绍 priority_queue 是一种数据结构&#xff0c;它允许你以特定的顺序存储和访问元素。在 C 标准模板库&#xff08;STL&#xff09;中&#xff0c;priority_queue 是一个基于容器适配器的类模板&#xff0c;它默认使用 std::vector 作为底层容器&#xff0c;并且默认使用最…

【技术追踪】DiffMIC:用于医学图像分类的双引导扩散网络(MICCAI-2024)

似乎是第一个用于医学图像分类的扩散模型嗷~ 论文&#xff1a;DiffMIC: Dual-Guidance Diffusion Network for Medical Image Classification 代码&#xff1a;https://github.com/scott-yjyang/DiffMIC 0、摘要 扩散概率模型最近在生成式图像建模中表现出了显著的性能&#xf…

Deepseek v3R1 学习笔记

o1 o1 模型在训练过程中混合了多种奖励函数的设计方法&#xff0c;并且尝试从结果监督转向过程监督&#xff0c;在中间过程进行打分 使用的搜索策略&#xff1a;基于树的搜索和基于顺序修改的搜索 R1 R1-Zero 是从基础模型开始&#xff0c;完全由强化学习驱动&#xff0c;不…

技术书籍写作与编辑沟通指南

引言 撰写技术书籍不仅仅是知识的输出过程&#xff0c;更是与编辑团队紧密合作的协同工作。优秀的技术书籍不仅依赖作者深厚的技术背景&#xff0c;还需要精准的表达、流畅的结构以及符合出版要求的编辑润色。因此&#xff0c;如何高效地与编辑沟通&#xff0c;确保书籍质量&a…

DeepSeek+Ollama+AnythingLLM 本地部署完全指南,打造专属知识库

DeepSeekOllamaAnythingLLM 本地部署完全指南&#xff0c;打造专属知识库 1 Ollama 本地化部署DeepSeek R1 Ollama 是一个用于本地运行大语言模型&#xff08;LLMs&#xff09;的开源工具&#xff0c;提供简单的界面和优化的推理引擎 &#xff0c;使用户能够在个人设备上高效…

更换IP属地会影响网络连接速度吗

在数字化时代&#xff0c;网络连接速度对于个人用户和企业来说都至关重要。无论是日常浏览网页、观看视频&#xff0c;还是进行在线办公、游戏娱乐&#xff0c;网络速度都直接影响着我们的体验。而IP属地&#xff0c;作为网络连接中的一个重要元素&#xff0c;其变动是否会引发…