前言

Mybatis也有反向工程,用于通过数据库表生成对应的Mapper接口和mapper.xml文件,与Mybatis-plus的代码生成器不同的是,其主要生成的代码在mapper.xml文件中,包含了表的动态增删改查操作。如果不用Mybatis-plus的话用Mybatis反向工程可以生成更为标准的mapper文件。

导入依赖

<dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <scope>test</scope>
        </dependency>

由于我们的generator不应打包部署到对应的应用中,所以我们定义scope为test。

编写配置DBGenerator.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" 

[
		<!ENTITY driverClass "com.mysql.cj.jdbc.Driver">
		<!ENTITY connectionURL "jdbc:mysql://127.0.0.1:3306/test">
		<!ENTITY schema "test">
		<!ENTITY userId "test">
		<!ENTITY password "test">

		<!ENTITY beanPath "com.yyoo.mybatis.beans.auto">
		<!ENTITY daoPath "com.yyoo.mybatis.mapper.auto">
		<!ENTITY sqlmapPath "mapper.auto">

		<!ENTITY beanProject "src\main\java">
		<!ENTITY daoProject "src\main\java">
		<!ENTITY sqlmapProject "src\main\resources">

		<!ENTITY daoType "XMLMAPPER">
]>

<generatorConfiguration >

	<!--MyBatis3Simple或MyBatis3-->
  <context id="context1" targetRuntime="MyBatis3">

	  <!-- 指定生成的java文件的编码,没有直接生成到项目时中文可能会乱码 -->
	  <property name="javaFileEncoding" value="UTF-8"/>

  	<!-- plugin -->
  	<plugin type="org.mybatis.generator.plugins.RenameExampleClassPlugin">
  		<property name="searchString" value="Example$" />
		<property name="replaceString" value="Criteria" />
  	</plugin>
  	<!--<plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin"></plugin>-->
  	<plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>
  	<plugin type="org.mybatis.generator.plugins.ToStringPlugin"></plugin>
	<!-- 解决使用了自定义注释后map.xml文件重复生成的问题-->
	<plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"></plugin>

	  <!-- 这里的type里写的是你的实现类的类全路径 -->
	  <commentGenerator type="com.yyoo.generator.MyCommentGenerator">
		  <!--<property name="suppressAllComments" value="true" />-->
		  <!--<property name="suppressDate" value="false" />-->
	  </commentGenerator>

	<!-- jdbc-->
	<jdbcConnection driverClass="&driverClass;" connectionURL="&connectionURL;?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false"
		userId="&userId;" password="&password;" >

		<!-- 针对oracle数据库 -->
		<!--<property name="remarksReporting" value="true"></property>-->

		<!--针对mysql数据库-->
		<property name="useInformationSchema" value="true"></property>

	</jdbcConnection>

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

	<!-- JavaBean -->
	  <!--targetProject属性如果是eclipse就是src就可以了,其他环境下需要是一个实际存在的目录如:D:\generator-->
	<javaModelGenerator targetPackage="&beanPath;" targetProject="&beanProject;">
		<property name="enableSubPackages" value="false" />
		<property name="trimStrings" value="true" />
		<!-- <property name="rootClass" value="apps.myFrame.baseBean.BaseBean" /> -->
	</javaModelGenerator>

	<!-- sqlMap -->
	<sqlMapGenerator targetPackage="&sqlmapPath;" targetProject="&sqlmapProject;">
		<property name="enableSubPackages" value="false" />
	</sqlMapGenerator>

	<!-- dao -->
	<javaClientGenerator targetPackage="&daoPath;" targetProject="&daoProject;" type="&daoType;">
		<property name="enableSubPackages" value="false" />
		<!-- <property name="rootInterface" value="com.yyoo.core.app.BaseDAO" /> -->
	</javaClientGenerator>



	<!-- ******************************************************************************* -->
	  <table schema="&schema;" catalog="&schema;" tableName="t_my_emp" domainObjectName="MyEmpBean"
			 enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"
			 enableSelectByExample="false" selectByExampleQueryId="false">
		  <!-- false尝试骆驼大小写返回的名称,true:直接用表中的字段名称 -->
		  <property name="useActualColumnNames" value="false" />
		  <!-- 不将schema或catalog添加到生成的SQL中的表名称 -->
		  <property name="ignoreQualifiersAtRuntime" value="true"/>
	  </table>
	 <!-- ******************************************************************************* -->

</context>
</generatorConfiguration>

<!ENTITY driverClass "com.mysql.cj.jdbc.Driver">:其实就是xml的语法定义,类似于java中定义一个变量。这里的变量名是driverClass,值为com.mysql.cj.jdbc.Driver

commentGenerator 标签中的MyCommentGenerator是我们自定义的生成的类的注释等的配置,可以不用配置,不配置默认使用的是DefaultCommentGenerator。我们自定义配置的话可以继承DefaultCommentGenerator修改我们想要修改的内容。

table标签详解

属性

说明

schema& catalog

数据库的schema,mysql这里需要设置

tableName

数据库表名

domainObjectName

生成的JavaBean类名

enable****ByExample

是否生成对应的Example操作类,我们的示例全部禁止了

子标签的定义代码中有注释,这里不作说明了。

编写生成代码GeneratorUtil

package com.yyoo.generator;

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.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public abstract class GeneratorUtil {

    /**
     * 默认使用generator.xml文件生成
     */
    public static void generator(){
        generator("generator.xml");
    }

    /**
     * 自定义配置文件生成
     * @param configFile 自定义配置文件的路径
     */
    public static void generator(String configFile){
        try {
            List<String> warnings = new ArrayList<String>();
            boolean overwrite = true;
            ConfigurationParser cp = new ConfigurationParser(warnings);
            Configuration config = cp.parseConfiguration(GeneratorUtil.class.getClassLoader().getResourceAsStream(configFile));

            DefaultShellCallback callback = new DefaultShellCallback(overwrite);
            MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
            myBatisGenerator.generate(null);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (InvalidConfigurationException e) {
            e.printStackTrace();
        } catch (XMLParserException e) {
            e.printStackTrace();
        }
    }

}

测试代码

package com.yyoo.generator;

import org.junit.Test;

public class Main {

    @Test
    public void generator(){

        GeneratorUtil.generator("DBGenerator.xml");

    }

}

本文只是提供一个Mybatis的反向工程的参考代码。内容写得并不详细,这里推荐还是使用Mybatis-plus以及其对应的代码生成器。因为确实简单方便实用。