事情的缘由
自己在弄一个项目,准备使用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
链接
在mybatis等框架没有使用元数据的情况下是正常的。
网友评论