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


截止上一章,我们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>

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

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值