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

article/2025/10/12 11:57:45

文章目录

  • 前言
  • 一、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://chatgpt.dhexx.cn/article/MJrnYD3w.shtml

相关文章

软著代码生成器

软著代码生成器 介绍使用说明 使用下载 介绍 软著代码生成器 自动生成word 自动删除注释单行注释(python c# 等)每页50行代码自动删除空行 使用说明 下载解压即可使用 使用 下载 gitee下载地址 觉得好用的客官, 欢迎star

mybatis代码生成器

mybatis代码生成器 步骤一&#xff1a;在pom中安装mybatis generator 自动生成代码插件 步骤二&#xff1a;复制代码生成器代码&#xff0c;修改数据库配置&#xff0c;及实体类生成的位置即可 步骤三&#xff1a;增加配置启动命令 步骤一&#xff1a;在pom中安装mybatis gener…

C# 源代码生成器

C# 源代码生成器 什么是源生成器源生成器允许执行两个主要操作Microsoft 文档模型图示常见方案源生成器的使用1、创建 .NET控制台应用程序2、创建源生成器项目3、在控制台程序中使用生成器项目 结语 什么是源生成器 源生成器是由.NET Compiler Platform&#xff08;“Roslyn”&…

vue代码生成器

直接根据swagger api生成vue代码 前要 目前的代码生成器基本上是基于数据库表格来生成对应的前后台代码&#xff0c;好处是前后台一次性搞定&#xff0e;但实际开发中&#xff0c;很多的业务是需要连表的&#xff0c;所以这种情况来说&#xff0c;根据接口直接生成前代码&#…

C#代码生成器

引言 引言&#xff1a;随着.net Core 的不断发展&#xff0c;它也是一个成熟的平台了&#xff0c;鲁迅说过&#xff1a;成熟的平台就要学会自己写代码&#xff0c;那么今天我就在这里教大家如何让.net Core学会自己写代码。 提示&#xff1a;如果只是向往&#xff0c;远方依旧…

MybatisPlus代码生成器

代码生成器 问题导入 如果只给一张表的字段信息&#xff0c;能够推演出Domain、Dao层的代码&#xff1f; 1. MyBatisPlus提供模板 Mapper接口模板 实体对象类模板 2. 工程搭建和基本代码编写 第一步&#xff1a;创建SpringBoot工程&#xff0c;添加代码生成器相关依赖&…

python 代码生成器_Python代码生成器(代码生成工具)V1.1 正式版

Python代码生成器(代码生成工具)是一款很优秀好用的为新手制作的代码生成助手。小编带来的这款Python代码生成器功能强大&#xff0c;操作简单&#xff0c;使用后可以帮助用户更轻松便捷的生成Python代码&#xff0c;非常方便实用。其内置了大量的示例代码&#xff0c;可以帮助…

12款AI代码生成工具,都很能打

1.Anania Anania 是一个机器人数据分析师&#xff0c;可以通过简单、自然的英语对话来分析您的数据。连接数据源并以简单的英语提问&#xff0c;无需任何设置或配置。在幕后&#xff0c;Anania 正在使用一个 AI 系统&#xff0c;该系统将文本转换为 SQL 和 Python 代码并执行您…

3D相册动态桌面制作

3D相册动态桌面制作 1.下载3D相册代码链接&#xff1a;https://pan.baidu.com/s/1Z_br3XKGsW3vsISvSCteJA&#xff0c;提取码&#xff1a;8888 更换自己喜欢的图片 注意第三张和第四章相册右键旋转照片 直接双击运行index.html可以在浏览器中看到效果。 如果不是很喜欢 可以自行…

HTML+CSS+JavaScript七夕情人节表白网页【樱花雨3D相册】超好看

这是程序员表白系列中的100款网站表白之一&#xff0c;旨在让任何人都能使用并创建自己的表白网站给心爱的人看。 此波共有100个表白网站&#xff0c;可以任意修改和使用&#xff0c;很多人会希望向心爱的男孩女孩告白&#xff0c;生性腼腆的人即使那个TA站在眼前都不敢向前表白…

制作简易的3D相册

今天介绍一下3D相册&#xff0c;用到了开源的FeatureCoverFlow控件&#xff0c;之前的几个作品用的也全都是开源的控件&#xff0c;为什么要用开源的控件呢&#xff0c;因为...他稳定啊&#xff01; 1.准备 仍然是&#xff0c;去掉标题栏&#xff0c;然后导库&#xff1a; impl…

HTML5、css3、js实现3D相册

目录 想法 实现 一、基础知识 1.3D转换 transform-style: preserve-3d; ①简述 ②使用 ③3D转换方法 2.onmouseover 事件 ①解释 ②具体语法 3.onmouseout事件 ①解释 ②具体语法 **本例通过在div的class中设置相同的类名&#xff0c;然后在js方法中通过document…

前端CSS3实现3D相册小案例

前端CSS3实现3D相册小案例 HTML代码部分&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>3D相册</title> <link type"text/css" href"css/style.css&qu…

制作一个简单3D相册

- 用到的点&#xff1a; 旋转 2D 旋转 transform: rotate(值deg) deg 角度的单位 3D 旋转 transform:rotateX rotateY roteteZ 如果让一个块实现3D效果&#xff0c;必须做两件事&#xff1a; 1、在要实现3D效果的块上 加transform-style:preserve-3D (声明) 2、在要实现3D效…

html结合css实现浏览器展示3D相册

最近写了一个在浏览器展示3D相册效果&#xff0c;通过html文件结合css实现。 1.html详细代码如下&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>3D相册</title> <script src"../js/jquer…

python3d相册源代码_js和CSS3炫酷3D相册展示

js和CSS3炫酷3D相册展示 *{margin:0;padding:0;} body{background:url(img/bg.jpg);width:100%;height:100%;overflow:hidden;}; h1{width:277;height:76px;margin:30px auto 0;} .xc-3D{width:100%;height:300px;background:#fff;margin-top:100px;position:relative;transfor…

three.js 制作3D相册

效果图&#xff1a; 由于博客限制了图片大小&#xff0c;动画质量不太好&#xff0c; 在线效果&#xff1a; https://static-mp-df787464-d77c-4180-83c3-6e7add40073e.next.bspapp.com/ 参考了three.js 官方代码 <!-- 源码下载地址 https://pan.baidu.com/s/1AVB71Aj…

3d相册

页面脚本 我的图片是是本地的&#xff0c;大家可以放上自己喜爱的图片 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>3d相册</title></head><style>#box1 {/* 宽 */width: 300px;/* 高 */height: …

HTML实现3D相册

今天&#xff0c;我给大家分享一个3D相册的代码 废话不说先上效果图&#xff1a; 先新建两个文件夹&#xff0c;一个叫css&#xff0c;另一个叫img&#xff0c;如下图&#xff1a; 先新建一个文本文档&#xff0c;输入下面的代码&#xff1a; <!DOCTYPE html> <html…

教你零基础制作3D旋转相册(送给那个她~)

3D立体相册&#xff1f;   是的&#xff0c;相信大家或多或少的会在一些地方看到某些程序员用代码给自己女朋友写3D立体相册&#xff0c;那么你会不会也想自己手动敲出那些炫酷的代码呢&#xff1f;   那你是找对地方了。废话不多说&#xff0c;今天为大家分享利用html实现…