Mybatis Generator 使用com.mysql.cj.jdbc.Driver遇到的問題
今天閑來無事,準備搭一套SSM的環(huán)境韧骗,當然所有的jar包都用最新的。
Mybatis使用3.4.6,Mysql使用最新的8.0沈贝,mysql-connector-java用的8.0.11。
安裝好數(shù)據(jù)庫后勋乾,新建了一個test庫宋下,并創(chuàng)建了一張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>
<!-- 指定數(shù)據(jù)連接驅(qū)動jar地址 -->
<classPathEntry location="D:\.m2\repository\mysql\mysql-connector-java\8.0.11\mysql-connector-java-8.0.11.jar" />
<!-- 一個數(shù)據(jù)庫一個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" />
<!-- 類型轉(zhuǎn)換 -->
<javaTypeResolver>
<!-- 是否使用bigDecimal学歧, false可自動轉(zhuǎn)化以下類型(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調(diào)用 -->
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- 生成mapxml文件 -->
<sqlMapGenerator targetPackage="mybatis"
targetProject="src\main\resources" >
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- 生成mapxml對應(yīng)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插件后各吨,直接運行枝笨,運行后,生成了User
和User.java.1
兩個文件绅你,打開一看伺帘,
User是test庫中的表,只有4個字段忌锯,而User.java.1則是mysql庫(Mysql的系統(tǒng)用戶庫)中的user表伪嫁。怎么會掃描了兩個
庫(mysql和test)?再看看我的connectionURL偶垮,確實指到了/test了张咳,怎么會掃描mysql庫呢帝洪?
于是我翻閱資料,終于找到了問題脚猾。
org.mybatis.generator.internal.db.DatabaseIntrospector
的509行葱峡,代碼如下:
ResultSet rs = databaseMetaData.getColumns(localCatalog, localSchema,
localTableName, "%");
變量localCatalog是上面配置文件中table中的元素,我們并沒有配置龙助,這里localCatalog是null砰奕,在底層會執(zhí)行SHOW DATABASES
得到所有的數(shù)據(jù)庫,但是我們已經(jīng)在connectionURL="jdbc:mysql://localhost:3306/test?useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai"
中指定了數(shù)據(jù)test呀提鸟,查看源碼發(fā)現(xiàn)在連接中少配置了一個屬性nullCatalogMeansCurrent=true
,加上這個屬性军援,再執(zhí)行,就沒有問題了称勋。
尤其是使用com.mysql.cj.jdbc.Driver
這個驅(qū)動的時候胸哥,更要加上這個屬性。在項目中不需要加赡鲜,但是在使用Mybatis Generator時要加上空厌。
com.mysql.cj.jdbc.Driver
是mysql官方比較推薦的,舊的驅(qū)動com.mysql.jdbc.Driver
已經(jīng)不用了银酬。