关于Mybatis generator的逆向生成出现mapper文件的接口生成不全的问题

2,240 阅读3分钟

这是一个坑啊

如果你的myabtis逆向生成也出现了这样的问题,并且 配置文件没有出任何问题,而且不存在数据库表的没有主键或者表结构不完整的低级问题,最可怕的是网上好多解决方法对你都没有效果。那么你可能是Mysql版本的问题。

在springBoot自动加载Mysql的时候会是这个样子

你只需要改成这样:

没有更改的时候生成的接口:

更改后生成的接口:

我的问题就这样结束了,其实在这时候纠结很久的时候就应该想到是版本的问题。

顺便贴上我的配置文件 和 运行生成接口。

配置文件,应该能看懂

<?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="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <!--数据库链接URL,用户名、密码 -->
        <!-- nullCatalogMeansCurrent 在5.1.42中默认是true,而在6.0.6默认为false。-->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/training" userId="root" password="root">
        </jdbcConnection>

        <!-- 引入自定义类型转换的实现类 -->
        <javaTypeResolver type="com.yangxin.demo.generator.MyJavaTypeResolver"></javaTypeResolver>

        <!-- 设置Java类生成的位置 targetPackage:表示生成的路径,targetProject:表示生成的文件/项目下-->
        <javaModelGenerator targetPackage="com.yangxin.demo.dao.model" targetProject="src">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="false"/>
        </javaModelGenerator>

        <!-- 生成映射文件xml存放位置;targetPackage:自己的包名;targetProject:该文件你想放位置(路径的不要有中文) -->
        <sqlMapGenerator targetPackage="data.resources.mappers" targetProject="src">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>

        <!-- 生成DAO的包名和位置-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.yangxin.demo.dao.mapper"
                             targetProject="src">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>

        <!-- 要生成的表 tableName是数据库中的表名或视图名 domainObjectName是实体类名-->
        <table tableName="yx_user" domainObjectName="YxUser"
               enableCountByExample="false"
               enableUpdateByExample="false"
               enableDeleteByExample="false"
               enableSelectByExample="false"
               selectByExampleQueryId="false">
            <generatedKey column="id" sqlStatement="MySql" identity="true"/>
        </table>
    </context>
</generatorConfiguration>

运行的主程序

public static void main(String[] args) {
    List<String> warnings = new ArrayList<>();
    // 配置文件路径
    //String xmlPath = "\\src\\main\\resources\\generatorConfig.xml";
    String xmlPath = "\\src\\main\\resources\\generator2.xml";
    try {
        // System.getProperty("user.dir"),获取当前的工作路径,windows和linux里的路径格式不一致,这里用来转换
        String configFilePath = System.getProperty("user.dir").concat(
                isNotWindows() ? xmlPath.replaceAll("\\\\", "/") : xmlPath);
        logger.info("加载配置文件的路径:" + configFilePath);
        boolean overwrite = true;
        File configFile = new File(configFilePath);
        // configFile.exists():测试此抽象路径名表示的文件或目录是否存在, isFile() :表示测试此抽象路径名表示的文件是否是一个标准文件。
        logger.info("" + configFile.exists());
        // 创建配置解析器
        ConfigurationParser cp = new ConfigurationParser(warnings);
        // 调用解析器创建配置对象()
        Configuration config = cp.parseConfiguration(configFile);
        // 创建一个ShellCallback对象,shellCallback接口是处理文件的创建和合并,默认是不支持文件合并的。
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        // 创建一个MyBatisGenerator对象。MyBatisGenerator类是真正用来执行生成动作的类
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);

        myBatisGenerator.generate(null);
    } catch (Exception e) {
        logger.error(e.getMessage(), e);
    }
    for (String wa : warnings) {
        logger.info("warning:" + wa);
    }
}

private static boolean isNotWindows() {
    // System.getProperty("os.name") 获取当前运行的系统名称
    return !System.getProperty("os.name").toLowerCase()
            .startsWith("windows");
}

作为一个采坑人...希望你们别遇到,好难受的