Mybatis-Generator插件学习

本环境是spring boot+maven。
MBG(Mybatis Generator)的默认配置文件名:generatorConfig.xml,位置在:src/main/resources文件夹下,如果generatorConfig.xml没有放在resources下,请指定generatorConfig.xml配置文件的路径。

依赖:

1.Java8+
2.一个实现DatabaseMetaData接口的JDBC driver,主要方法getColumns 和getPrimaryKeys 是必须的。

注意点:
1.对于XLM-若已存在同名的XML文件,MBG则自动合并XML文件。且不会覆写你自定义的更改(自定义的SQL)。你可以一遍又一遍的运行它,不用担心XML内容的丢失与自定义更改。但是会替换先前运行生成的任何XML元素。
2.对于Java类-MBG不会合并Java文件。它会覆盖之前存在的文件或者使用新的唯一名称生成新文件。在迭代方式运行MBG时必须要手动合并Java文件。作为Eclipse插件时,MBG可以自动合并Java文件。
3.如果存在冲突,MBG将使用唯一名称(例如MyClass.java.1)保存新生成的文件。可以此命令覆盖存在的文件:java -jar mybatis-generator-core-x.x.x.jar -configfile \temp\generatorConfig.xml -overwrite

使用MySQL时注意事项:

1.MySQL支持signed和unsigned,numeric类型的字段。这些是JDBC不支持的,Mybatis Generator不能自动转换这些类型的字段。而Java类型都是signed的,使用unsigned时可能会导致无符号字段精度丢失。MBG为MySQL中的unsigned numeric类型的字段提供了<columnOverride>标签。

<table tableName="ALLTYPES" >
<columnOverride column="UNSIGNED_BIGINT_FIELD" javaType="java.lang.Object" jdbcType="LONG" />
</table>

必须自己将返回值转换为适当的类型(在这种情况下,为java.math.BigInteger)。一般是要转成范围更大的类型。

2.MySQL对Catalog和Schema不是友好支持。如果运行 create schema命令则会创建数据库,而JDBC驱动会将其报告为catalog.但是MySql语法不支持标准的catalog..table SQL语法。因此,最好不要在生成器配置中指定catalog或schema。 只需指定表名并在JDBC URL中指定数据库即可。如果使用Connector/J版本是8.x版本,则会尝试对mysql数据库中的系统表(sys, information_schema, performance_schema, etc.)生成代码。若要进制此行为,则 将 nullCatalogMeansCurrent=true追加到JDBC的URL中即可。

jdbc:mysql://127.0.0.1:3309/ssm?useUnicode=true&characterEncoding=utf-8&useSSL=false&nullCatalogMeansCurrent=true

一个数据库系统包含多个Catalog,每个Catalog包含多个Schema,每个Schema包含多个数据库对象(表、视图、字段等)
如数据库对象表的全限定名可表示为:Catalog名.Schema名.表名
SQL标准并不要求每个数据库对象的完全限定名称是唯一的,就象域名一样,如果喜欢的话,每个IP地址都可以拥有多个域名。

MBG插件包含一个goal目标即 mybatis-generator:generate,此目标maven不会自动执行,可以使用 mvn mybatis-generator:help 查看帮助。运行方法2种(也可以idea中双击mybatis-generator:generate):

1.命令行运行:mvn mybatis-generator:generate

2.覆写已存在的文件: mvn -Dmybatis.generator.overwrite=true mybatis-generator:generate

如果generatorConfig.xml文件使用了自定义的插件,在指定依赖前,请先编译,确定生成了jar包(不然会报错提示无法初始化该对象)

pom.xml文件中配置:

<build>
	<plugins>
		<plugin>
			<groupId>org.mybatis.generator</groupId>
			<artifactId>mybatis-generator-maven-plugin</artifactId>
			<version>1.4.0</version>
			<dependencies>
				<dependency>
					<groupId>mysql</groupId>
					<artifactId>mysql-connector-java</artifactId>
					<version>6.0.6</version>
				</dependency>
			</dependencies>
			<!-- 以下代码放开后则会作为maven构建的一部分,即随着maven的构建自动执行MBG,生产环境一定要注释 -->
			<!--<executions>
				<execution>
					<id>Generate MyBatis Artifacts</id>
					<goals>
						<goal>generate</goal>
					</goals>
				</execution>
			</executions>-->
		</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>
    <context id="DB2Tables" targetRuntime="MyBatis3">
        <property name="javaFileEncoding" value="UTF-8"/>

        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://127.0.0.1:3309/ssm?useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=false"
                        userId="root" password="123456">
        </jdbcConnection>

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

        <!-- 生成对象 -->
        <javaModelGenerator targetPackage="com.ruyi.mybatis.model" targetProject="src/main/java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!-- 生成xml文件 -->
        <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>

        <!-- 生成mapper接口 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.ruyi.mybatis.mapper" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>

        <table tableName="emp" domainObjectName="Employee">
            <property name="useActualColumnNames" value="true"/>
        </table>

        <table tableName="dept" domainObjectName="Department">
            <property name="useActualColumnNames" value="true"/>
        </table>
    </context>
</generatorConfiguration>