美文网首页
记录下mybatis generator生成代码的坑

记录下mybatis generator生成代码的坑

作者: c7d122ec46c0 | 来源:发表于2021-09-11 15:29 被阅读0次

    事情的缘由

    自己在弄一个项目,准备使用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等框架没有使用元数据的情况下是正常的。

    相关文章

      网友评论

          本文标题:记录下mybatis generator生成代码的坑

          本文链接:https://www.haomeiwen.com/subject/kecwwltx.html