记录下mybatis generator生成代码的坑

事情的缘由

自己在弄一个项目,准备使用mybatis generator生成代码,使用了一个表user,由于跟mysql自带的user表名字相同,生成的代码一直是mysql schema下的user表


image.png

看源码

一开始以为是generator本生的bug
贴一下最开始的配置,指定了schema,还是不行

        
        

        
        

debug 跟踪到DatabaseIntrospector类的 getColumns

private Map> getColumns(
            TableConfiguration tc) throws SQLException {
       // 省去无用代码
       // 这边使用
        ResultSet rs = databaseMetaData.getColumns(localCatalog, localSchema,
                localTableName, "%"); //$NON-NLS-1$

        boolean supportsIsAutoIncrement = false;
        boolean supportsIsGeneratedColumn = false;
        ResultSetMetaData rsmd = rs.getMetaData();
        int colCount = rsmd.getColumnCount();
        for (int i = 1; i <= colCount; i++) {
            if ("IS_AUTOINCREMENT".equals(rsmd.getColumnName(i))) { //$NON-NLS-1$
                supportsIsAutoIncrement = true;
            }
            if ("IS_GENERATEDCOLUMN".equals(rsmd.getColumnName(i))) { //$NON-NLS-1$
                supportsIsGeneratedColumn = true;
            }
        }

DatabaseMetaData 是数据库元数据的一个类,mysql jdbc实现的有两个,一个是DatabaseMetaData,另一个是DatabaseMetaDataUsingInfoSchema,debug跟入代码,到了 DatabaseMetaDataUsingInfoSchema的getDatabase代码
getColumns=>getColumns 返回的居然是个空值


image.png

后面就是jdbc拼接sql的参数,在db为null时查询列时并没有按schema来查询,会把所有名字是user表的列都查出来
如何规避这个问题呢,在mybatis generator的connectionURL中加上databaseTerm=schema参数

connectionURL="jdbc:mysql://MMMMMMM:3306/databaseone?databaseTerm=schema" 

mysql官网的解释从8.0.17开始默认的databaseTerm是CATALOG
链接

image.png

在mybatis等框架没有使用元数据的情况下是正常的。

你可能感兴趣的:(记录下mybatis generator生成代码的坑)