Mybatis Generator 使用com.mysql.cj.jdbc.Driver遇到的問題


Mybatis Generator 使用com.mysql.cj.jdbc.Driver遇到的問題

今天閑來無事,准備搭一套SSM的環境,當然所有的jar包都用最新的。 Mybatis使用3.4.6,Mysql使用最新的8.0,mysql-connector-java用的8.0.11。

安裝好數據庫后,新建了一個test庫,並創建了一張user表。配置好Mybatis的配置文件,如下:

<?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>

<!-- 指定數據連接驅動jar地址 -->
<classPathEntry location="D:\.m2\repository\mysql\mysql-connector-java\8.0.11\mysql-connector-java-8.0.11.jar" />

<!-- 一個數據庫一個context -->
<context id="infoGuardian" targetRuntime="MyBatis3DynamicSql">
    <!-- 注釋 -->
    <commentGenerator >
        <property name="suppressAllComments" value="true"/><!-- 是否取消注釋 -->
        <property name="suppressDate" value="true" /> <!-- 是否生成注釋代時間戳-->
    </commentGenerator>

    <!-- jdbc連接 -->
    <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                    connectionURL="jdbc:mysql://localhost:3306/test?useSSL=false&characterEncoding=utf8
                    &serverTimezone=Asia/Shanghai"
                    userId="root"
                    password="xxxxx" />

    <!-- 類型轉換 -->
    <javaTypeResolver>
        <!-- 是否使用bigDecimal, false可自動轉化以下類型(Long, Integer, Short, etc.) -->
        <property name="forceBigDecimals" value="false"/>
    </javaTypeResolver>

    <!-- 生成實體類地址 -->
    <javaModelGenerator targetPackage="com.example.xxx.model"
                        targetProject="src\main\java" >
        <property name="enableSubPackages" value="false"/>
        <!-- 是否針對string類型的字段在set的時候進行trim調用 -->
        <property name="trimStrings" value="true"/>
    </javaModelGenerator>

    <!-- 生成mapxml文件 -->
    <sqlMapGenerator targetPackage="mybatis"
                     targetProject="src\main\resources" >
        <property name="enableSubPackages" value="false" />
    </sqlMapGenerator>

    <!-- 生成mapxml對應client,也就是接口dao -->
    <javaClientGenerator targetPackage="com.example.xxx.dao"
                         targetProject="src\main\java" type="XMLMAPPER" >
        <property name="enableSubPackages" value="false" />
    </javaClientGenerator>
    
    <table tableName="user" domainObjectName="User"></table>

</context>
</generatorConfiguration>

安裝好Mybatis Generator的maven插件后,直接運行,運行后,生成了UserUser.java.1兩個文件,打開一看, User是test庫中的表,只有4個字段,而User.java.1則是mysql庫(Mysql的系統用戶庫)中的user表。怎么會掃描了兩個 庫(mysql和test)?再看看我的connectionURL,確實指到了/test了,怎么會掃描mysql庫呢? 於是我翻閱資料,終於找到了問題。org.mybatis.generator.internal.db.DatabaseIntrospector的509行,代碼如下:

ResultSet rs = databaseMetaData.getColumns(localCatalog, localSchema,
                localTableName, "%");

變量localCatalog是上面配置文件中table中的元素,我們並沒有配置,這里localCatalog是null,在底層會執行SHOW DATABASES 得到所有的數據庫,但是我們已經在connectionURL="jdbc:mysql://localhost:3306/test?useSSL=false&amp;characterEncoding=utf8&amp;serverTimezone=Asia/Shanghai" 中指定了數據test呀,查看源碼發現在連接中少配置了一個屬性nullCatalogMeansCurrent=true,加上這個屬性,再執行,就沒有問題了。

尤其是使用com.mysql.cj.jdbc.Driver這個驅動的時候,更要加上這個屬性。在項目中不需要加,但是在使用Mybatis Generator時要加上。 com.mysql.cj.jdbc.Driver是mysql官方比較推薦的,舊的驅動com.mysql.jdbc.Driver已經不用了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM