Mybatis Generator 生成的 Mapper.xml 代码重复

版权声明:本文为博主原创文章,欢迎转载,转载请注明出处。觉得此文有用的,不嫌麻烦的,就留个言呐,或者点个赞呐,要是嫌麻烦呢,也麻烦点个赞嘛 https://blog.csdn.net/qq_40147863/article/details/89109611

Mybatis Generator 生成的 Mapper.xml 代码重复

问题: 在生成 mapper.xml 时,文件内容重复生成。

解决办法:删除下面的标签及属性

<!--是否在代码中显示注释-->
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

今天遇到一个奇怪的 BUG,之前使用过 MyBatis Generator 生成代码,当然也没有问题,但是我今天想更深入的学习 generatorConfig.xml 配置文件,于是我百度了,于是看到了上面的是否显示注释。鬼知道,我去掉了一些注释,但是 mapper.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">

<!--提示:如果修改本文件名,需在 pom 中配置-->

<!--MyBatis Generator 执行方式:-->
<!--(1)使用命令-->
<!--mvn mybatis-generator:generate-->
<!--(2)使用工具-->
<!--IDEA > Add Configuration > + > Maven > Command Lines > mybatis-generator:generate > 运行-->
<!--(3)使用工具类执行-->
<!--https://github.com/xpwi/spring-springmvc-mybatis/tree/master/src/main/java/com/xiaopengwei/ssm/util-->
<generatorConfiguration>

    <!-- context 是逆向工程的主要配置信息 -->
    <!-- id:起个名字 -->
    <!-- targetRuntime:设置生成的文件适用于那个 mybatis 版本 -->
    <context id="default" targetRuntime="MyBatis3">

        <!--jdbc的数据库连接-->
        <!--这里是以变量的形式定义,具体的值在 application.properties 文件中-->
        <!--jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC-->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://127.0.0.1:3306/studb?serverTimezone=UTC"
                        userId="root"
                        password="root">
        </jdbcConnection>

        <!--不自动转换成 BigDecimal 类型-->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- targetPackage:生成的实体类所在的包 -->
        <!-- targetProject:生成的实体类所在的硬盘位置 -->
        <!-- DataObject 类存放位置 -->
        <javaModelGenerator targetPackage="com.xiaopengwei.springboot.entity"
                            targetProject=".\src\main\java">
            <!-- 是否允许子包 -->
            <property name="enableSubPackages" value="false"/>
            <!-- 是否对modal添加构造函数 -->
            <property name="constructorBased" value="true"/>
            <!-- 是否清理从数据库中查询出的字符串左右两边的空白字符 -->
            <property name="trimStrings" value="true"/>

        </javaModelGenerator>

        <!-- targetPackage 和 targetProject:生成的 mapper 文件的包和位置 -->
        <sqlMapGenerator targetPackage="mapper"
                         targetProject=".\src\main\resources">
            <!-- 针对数据库的一个配置,是否把 schema 作为字包名 -->
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>

        <!-- targetPackage 和 targetProject:生成的 interface 文件的包和位置 -->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="com.xiaopengwei.springboot.mapper" targetProject=".\src\main\java">
            <!-- 针对 oracle 数据库的一个配置,是否把 schema 作为字包名 -->
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>

        <!--配置生成的表-->
        <!--方式一:统配
        警告:如果只用 % 这里是全部数据库统配,不仅是当前数据库,生成名称会自动首字母大写的驼峰命名-->
        <!--<table tableName="%" domainObjectName="StudentEO"/>-->

        <!--方式二:指定表,指定名称-->
        <!-- table 可以有多个,每个数据库中的表都可以写一个 table,tableName表 示要匹配的数据库表,
        也可以在 tableName 属性中通过使用%通配符来匹配所有数据库表,只有匹配的表才会自动生成文件 -->
        <table tableName="student" domainObjectName="StudentEO" enableCountByExample="false"
               enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
               selectByExampleQueryId="false">
            <property name="my.isgen.usekeys" value="true"/>
            <property name="useActualColumnNames" value="true"/>
            <generatedKey column="id" sqlStatement="JDBC"/>
        </table>

        <table tableName="teacher" domainObjectName="TeacherEO" enableCountByExample="false"
               enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
               selectByExampleQueryId="false">
            <property name="my.isgen.usekeys" value="true"/>
            <property name="useActualColumnNames" value="true"/>
            <generatedKey column="id" sqlStatement="JDBC"/>
        </table>

    </context>
</generatorConfiguration>

使用工具类执行(避免一些重复生成!):

package com.xiaopengwei.springboot.util;

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;

import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * <p>
 *   自动生成代码启动类
 * </p>
 *
 * @author Xiao pengwei
 * @since 2019-04-02
 */
public class MybatisGenerator {
	
    public static void main(String[] args) throws Exception {
        String today = "2019-04-08";

        SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd");
        Date now =sdf.parse(today);
        Date d = new Date();

        if(d.getTime()>now.getTime()+1000*60*60*24){
            System.err.println("================== MyBatis Generator 运行失败!================");
            System.err.println("警告: 本程序具有破坏作用, 应该只运行一次, 如果必须要再运行, 需要修改 today 变量为今天, 如:" + sdf.format(new Date()));
            return;
        }

        List<String> warnings = new ArrayList<String>();

        InputStream is= MybatisGenerator.class.getClassLoader().getResource("generatorConfig.xml").openStream();
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(is);
        is.close();
        DefaultShellCallback callback = new DefaultShellCallback(true);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);
        System.out.println("================== MyBatis Generator 运行成功!================");
        System.out.println("生成代码成功, 只能执行一次, 以后执行会覆盖掉 mapper, entity, xml 等文件上做的修改");

    }
}

避免重复执行工具类:

package com.xiaopengwei.springboot.util;

import org.mybatis.generator.api.GeneratedXmlFile;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;

import java.lang.reflect.Field;
import java.util.List;

/**
 * <p>
 *   避免重复工具类
 * </p>
 *
 * @author Xiao pengwei
 * @since 2019-04-02
 */
public class OverIsMergeablePlugin extends PluginAdapter {

	@Override
	public boolean validate(List<String> warnings) {
		return true;
	}

	@Override
	public boolean sqlMapGenerated(GeneratedXmlFile sqlMap, IntrospectedTable introspectedTable) {

		try {
			Field field = sqlMap.getClass().getDeclaredField("isMergeable");
			field.setAccessible(true);
			field.setBoolean(sqlMap, false);
		} catch (Exception e) {
			e.printStackTrace();
		}

		return true;
	}

}


猜你喜欢

转载自blog.csdn.net/qq_40147863/article/details/89109611