版权声明:本文为博主原创文章,欢迎转载,转载请注明出处。觉得此文有用的,不嫌麻烦的,就留个言呐,或者点个赞呐,要是嫌麻烦呢,也麻烦点个赞嘛 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;
}
}