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>
再次运行就没有问题了