记录下mybatis generator生成代码的坑

2021-09-11  本文已影响0人  c7d122ec46c0

事情的缘由

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


image.png

看源码

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

        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://MMMMMMM:3306/databaseone?databaseTerm=schema"  userId="111"
                        password="11111!">
        </jdbcConnection>

        <table tableName="user" schema="databaseone" domainObjectName="User"
               enableInsert="true" enableSelectByPrimaryKey="true"
               enableSelectByExample="true" enableUpdateByPrimaryKey="true"
               enableDeleteByPrimaryKey="true" enableDeleteByExample="true"
               enableCountByExample="true" enableUpdateByExample="true"
               selectByExampleQueryId="true">
            <generatedKey column="id" sqlStatement="Mysql"
                          identity="true" type="post" />
        </table>

debug 跟踪到DatabaseIntrospector类的 getColumns

private Map<ActualTableName, List<IntrospectedColumn>> 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等框架没有使用元数据的情况下是正常的。

上一篇下一篇

猜你喜欢

热点阅读