MyBatis学习day5-MyBatis Generator介绍及文件生成

本文介绍了MyBatisGenerator的下载、项目配置、关键标签解析,以及结合Maven优化的步骤。通过学习,读者能快速掌握MBG的使用,提升开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


截止上一章,我们MyBatis的基本用法已经差不多了,接下来我们再学习一个新的非常有用的工具----MyBatis Generator(以下称MBG);它可以自动的根据数据库的表生成对应的Javabean对象、接口以及xml文件,这样我们又能偷好多懒了ヽ( ̄▽ ̄)ノ,那就直接进行一个新知识的学


jar包下载

首先打开MyBatis的GitHub首页
https://github.com/mybatis
往下拉,找到generator,点他!
在这里插入图片描述
然后右边会有最新版本的MBG,点击,往下拉,下载第一个zip文件就可以了
在这里插入图片描述
在这里插入图片描述

项目创建及lib导入

之前那个项目我们就可以不用去管他了,创建一个新的project
然后我们在项目中创建lib文件夹、先把需要用到的外部库导进去:mybatis的核心包、mysq数据库连接的包以及mybatis-genterator的核心包,然后我们再打开项目结构把他们添加到依赖里面就可以了。
在这里插入图片描述

简单了解generatorConfig.xml

以上我们已经创建好了项目,那么要用MBG我们还要先建立一个配置文件用于指导生成文件的目标啊、路径啊、数据库链接啊这些的。所以我们可以再src下创建一个配置文件generatorConfig.xml,然后我们打开以下链接打开MBG的官方文档,点击XML Configuration Reference,把里面的代码复制粘贴到我们自己的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>
  <classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />

  <context id="DB2Tables" targetRuntime="MyBatis3">
    <jdbcConnection driverClass="COM.ibm.db2.jdbc.app.DB2Driver"
        connectionURL="jdbc:db2:TEST"
        userId="db2admin"
        password="db2admin">
    </jdbcConnection>

    <javaTypeResolver >
      <property name="forceBigDecimals" value="false" />
    </javaTypeResolver>

    <javaModelGenerator targetPackage="test.model" targetProject="\MBGTestProject\src">
      <property name="enableSubPackages" value="true" />
      <property name="trimStrings" value="true" />
    </javaModelGenerator>

    <sqlMapGenerator targetPackage="test.xml"  targetProject="\MBGTestProject\src">
      <property name="enableSubPackages" value="true" />
    </sqlMapGenerator>

    <javaClientGenerator type="XMLMAPPER" targetPackage="test.dao"  targetProject="\MBGTestProject\src">
      <property name="enableSubPackages" value="true" />
    </javaClientGenerator>

    <table schema="DB2ADMIN" tableName="ALLTYPES" domainObjectName="Customer" >
      <property name="useActualColumnNames" value="true"/>
      <generatedKey column="ID" sqlStatement="DB2" identity="true" />
      <columnOverride column="DATE_FIELD" property="startDate" />
      <ignoreColumn column="FRED" />
      <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />
    </table>

  </context>
</generatorConfiguration>

http://mybatis.org/generator/whatsNew.html
然后我们一个个来介绍一些每个标签是干什么用的

classPathEntry

classpathentry标签用于指定数据库链接包–也就是mysql-connector-J包,这里呢我们已经包导入到项目依赖中了,所以这条标签我们可以注释掉

context

context标签呢就是接下来要讲的主要标签了,很多文件生成的规则都是在这个标签之下设置的。context有一个id属性,具有唯一性,我们先给id赋值为“MyGenerator”,运行环境–“targetRuntime”我们设置为MyBatis3,以后会说明有什么用

jdbcConnection

改标签用于承载一些数据库链接的信息,我们之前也遇到过,
driverClass属性:设置驱动类
connectionURL属性:数据库地址
userId属性:用户名
password属性:密码
我们把它们设置为本地数据库的相关信息

javaTypeResolver

该标签用于指定java与jdbc之间数据类型转换的规则,因为有些MySQL中存在的数据类型java中并没有,所以便有了改标签来标识哪些数据库类型应该转换为哪些java类型。具体的一些转换规则可以参照MBG官方文档xmlConfigurationReference下查看改标签的相关信息。

javaModelGenerator

改标签用于规定Javabean对象生成的一些规则,具体如下:

targetPackage属性:
用于指定Javabean对象输出的目标包名(这里我们设置为com.mbg.bean,如果该包名不存在,它会自动生成)

targetProject属性:
指定Javabean对象输出在项目的哪一个位置(这里我们直接设置其值为“src”表示输出在src下然后他自己去找targetPackage)

改标签下还可以有property字标签用于设置其他参数,如上述的例子

<!-- 在targetPackage的基础上,根据数据库的schema再生成一层package,最终生成的类放在这个package下,默认为false -->
<property name="enableSubPackages" value="true"/>
<!-- 在生成的bean对象的setter中为字符串追加.trim()方法去掉多余空格,默认值为false -->
<property name="trimStrings" value="true" />

接下来是一些关于xml文件的配置


sqlMapGenerator

用于设定Mapper.xml文件生成的相关规则,其参数、属性作用于javaModelGenerator相同,这里不多赘述了(另外我设置了targetPackage=“com.mbg.mapper” targetProject=“src”,其他内容与原内容一致)

javaClientGenerator

改标签用于设定Mapper接口文件生成的相关规则,我们也只用修改一下targetPackage=“com.mbg.mapper” 和 targetProject=“src” 就好了,其他不用修改

table

改标签用于指定哪些数据表需要生成文件,官方文档所给的配置过于复杂,我们只需设定数据表明即可,如下

<table tableName="user"/>
<table tableName="country"/>

这样我们每个标签大致就介绍完了,最终的内容如下

<?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="MyGenerator" targetRuntime="MyBatis3">
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/ssm_mybatis?serverTimezone=UTC"
                        userId="root"
                        password="root">
        </jdbcConnection>

        <javaTypeResolver >
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <javaModelGenerator targetPackage="com.mbg.bean" targetProject="src">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>

        <sqlMapGenerator targetPackage="com.mbg.mapper"  targetProject="src">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>

        <javaClientGenerator type="XMLMAPPER" targetPackage="com.mbg.mapper"  targetProject="src">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>

        <table tableName="user"/>
        <table tableName="country"/>

    </context>
</generatorConfiguration>

生成所需文件

接下来我们就要通过Java代码来生成相关文件了,首先创建一个com.mbg.test包,然后创建一个Generator类(随意取名),添加一个main方法
我们可以继续看MBG的官方文档,点击如下标签,复制右边的代码
在这里插入图片描述


List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
File configFile = new File("generatorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);

然后将其复制到刚刚创建好的Generator的main方法中,导入包,然后想第三行中的“generatorConfig.xml”改为“src/generatorConfig.xml”
然后我们点击运行代码
控制台出现了一个小提示:
Loading class ‘com.mysql.jdbc.Driver’. This is deprecated. The new driver class is com.mysql.cj.jdbc.Driver. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
大致意思就是现在这个驱动类已经out了,不需要你去声明了,他会自动帮你注册,额…这个小细节不用太在意= =l|
然后我们再刷新一下就会发现
在这里插入图片描述
是不是很神奇!

一些小修改

1.注释

现在生成的文件还是有缺点的,我们随便点击一个bean对象会发现
在这里插入图片描述
这其中存在着大量的注释,这些注释都是不必要的,一般是一些辅助声明和时间戳,我们可以通过一些方法去掉:
回到我们的generatorConfig文件,在context标签下增加一个commentGenerator标签,通过设置property子标签进行参数设定
我们设定suppressAllComments参数的值为true,这样可以去掉元素生成的注释
设定suppressDate参数的值为true,这样可以去掉元素生成的时间戳,也就是下面这个样子

<commentGenerator>
    <property name="suppressAllComments" value="true"/>
    <property name="suppressDate" value="true"/>
</commentGenerator>

然后我们在重新生成一遍就好了

2.生成类UserWithBlobs

我们会发现除了生成了正常的bean对象和example类之外还多了一个UserWithBlobs类,为什么会多出这个类呢?是因为在 MySQL 8.0 以上的版本中,在生成 User 表的实体类时,Mybatis Generator 会找到多张 User 表,包括 MySQL information schemas 中的多张 User 表,生成了多个 User 相关的实体类。
要保证只生成自己指定的 database 中的 User 表,首先要在 中的 connectionURL 中指定数据库的实例名,然后在 中添加相关配置信息,即<property name="nullCatalogMeansCurrent" value="true"/>,即可保证只生成自己需要的 User 类。


OK,修改完之后我们把之前生成的文件删掉,再运行一遍就没问题了
在这里插入图片描述


(2021.5.12更新)

结合maven优化

在经过了一段时间的学习后回过头来发现当初的MBG操作过程还有一些繁琐,在结合了maven以及mabatis-generator插件之后发现上述操作过程可以更加简单

添加maven依赖以及MBG插件

<!--mysql驱动-->
<dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
</dependency>
<!--mybatis整合Springboot依赖,这里导入正常的mybatis依赖也可-->
<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>

<build>
    <plugins>
    <!--MGB运行插件,有了这个就不用自己写运行程序了-->
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.6</version>
            <configuration>
            <!--这里填写相对于pom.xml的路径-->
            	<configurationFile>GeneratorConfig.xml</configurationFile>
                <verbose>true</verbose>
                <overwrite>true</overwrite>
            </configuration>
        </plugin>
    </plugins>
</build>

编辑generatorConfig.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>
	<!--数据库配置文件,这里放在resources下-->
    <properties resource="db.properties"/>

    <!--指向连接数据库的 JDBC 驱动包所在位置,目前好像是只能写绝对路径-->
    <classPathEntry location="D:\repository\mysql\mysql-connector-java\8.0.23\mysql-connector-java-8.0.23.jar"/>
    <!--配置table表信息内容体,targetRuntime 指定采用MyBatis3的版本-->
    <context id="tables" targetRuntime="MyBatis3">
        <!--关闭所有注释生成-->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <!--配置数据库连接老四样-->
        <jdbcConnection driverClass="${jdbc.driver}"
                        connectionURL="${jdbc.url}"
                        userId="${jdbc.username}"
                        password="${jdbc.password}">
        </jdbcConnection>
        <!--映射类生成器-->
        <javaModelGenerator targetPackage="com.wfh.springbootdemo.bean"
                            targetProject="src/main/java">
                <property name="enableSubPackages" value="false"/>
                <property name="trimStrings" value="false"/>
        </javaModelGenerator>
        <!--生成的Mapper文件存放位置-->
        <sqlMapGenerator targetPackage="mappers"
                        targetProject="src/main/resources">
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>
        <!--生成Mybatis的dao接口类文件-->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="com.wfh.springbootdemo.dao" targetProject="src/main/java">
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>

        <!--数据库表名及对应的Java模型类名,
        这里还设置了默认不生成example类,之前写的没有这部分内容
        -->
        <table tableName="userinfo" domainObjectName="User"
               enableCountByExample="false"
               enableUpdateByExample="false"
               enableDeleteByExample="false"
               enableSelectByExample="false"
               selectByExampleQueryId="false"/>
    </context>
</generatorConfiguration>

运行插件

点击右侧的maven,插件,找到mybatis-generator,双击mybatis-generator:generate

在这里插入图片描述
运行之后发现有个warnin,大致意思是有多个数据库中都含有我指定的userinfo表,可是明明我已经指定了要连接的数据库,这是为什么呢
在这里插入图片描述
官方也没有特别的释为什么,只是大致提到了如果用的是mysqlConnector/J 8.x的版本,可能会生成一些mysql自带的信息库中的表相关的文件(比如sys, information_schema, performance_schema等)
在这里插入图片描述
解决上述问题的办法就是将jdbcConnection标签改为如下

<jdbcConnection driverClass="${jdbc.driver}"
                connectionURL="${jdbc.url}"
                userId="${jdbc.username}"
                password="${jdbc.password}">
    <property name="nullCatalogMeansCurrent" value="true" />
</jdbcConnection>

再次运行就没有问题了
在这里插入图片描述
在这里插入图片描述

### 关于苍穹外卖项目中使用MyBatis Plus的教程及代码示例 #### 使用MyBatis Plus简化CRUD操作 在苍穹外卖项目的`day09`阶段,为了提升数据库交互层的开发效率并减少样板代码的数量,采用了MyBatis Plus作为持久化框架。MyBatis Plus不仅继承了MyBatis原有的灵活性和强大功能,还提供了更简洁的操作方式[^2]。 ```java // 定义实体类对应表结构 @Data public class Order { private Long id; private String orderNo; private Integer userId; } // 继承BaseMapper获得基本增删改查能力 public interface OrderMapper extends BaseMapper<Order> {} ``` 通过上述定义,无需编写任何SQL语句即可实现对订单数据的基本操作,这得益于MyBatis Plus内置的支持自动识别字段名映射到对应的列上,并提供了一系列便捷的方法来执行常见的查询逻辑[^1]。 #### 动态条件构建优化查询性能 针对复杂业务场景下的多条件组合筛选需求,MyBatis Plus允许开发者利用其封装好的QueryWrapper对象来进行灵活组装: ```java import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @Autowired private OrderMapper orderMapper; public List<Order> getOrdersByConditions(String orderNo, Integer userId) { QueryWrapper<Order> queryWrapper = new QueryWrapper<>(); if (StringUtils.isNotBlank(orderNo)) { queryWrapper.eq("order_no", orderNo); } if (userId != null && userId > 0) { queryWrapper.eq("user_id", userId); } return orderMapper.selectList(queryWrapper); } ``` 此段代码展示了如何基于传入参数动态调整查询条件,从而达到精准检索的目的。同时,这种方式也使得后续维护更加容易理解与修改[^4]。 #### 自动生成代码加速迭代周期 考虑到实际开发过程中频繁涉及新增模块或调整已有模型的情况,MyBatis Plus支持通过插件形式快速生成所需的DAO层文件、Service接口及其默认实现等资源。对于像苍穹外卖这样的大型应用而言,这一特性极大地缩短了前期准备工作所需的时间成本。 ```bash mvn mybatis-plus:generator -Dmp.generator.config=src/main/resources/generatorConfig.xml ``` 以上命令可以根据预设模板批量产出符合项目规范的基础组件,帮助团队成员专注于核心业务逻辑的设计之上[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值