在利用Spring+SpringMVC+Mybatis搭建web系統時,出現了上述bug,一直想不通。
數據庫鏈接參數設置爲(jdbc.properties文件):
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/seckill
username=root
password=seuwqh
在整合spring和mybtais中的配置文件中
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!--配置連接池屬性-->
<property name="driverClass" value="${driver}" />
<!-- 基本屬性 url、user、password -->
<property name="jdbcUrl" value="${url}" />
<property name="user" value="${username}" />
<property name="password" value="${password}" />
連接池中的具體屬性的值通過${數據庫參數名稱}來獲取,然後運行項目是就會出現以下bug提示:
java.sql.SQLException: Access denied for user 'wqh'@'localhost' (using password: YES)
數據庫拒絕訪問,我表示很蛋疼,因爲數據庫的用戶名爲root,而且也經過測試,通過root是可以連接到數據庫的,爲什麼出來的是本機名wqh?
後來經過查詢,在Spring完成注入時是用 "${..}" 方式獲取值完成注入的。而通過這種表達式也能直接獲取到JVM系統屬性。
因爲在系統中也有個username屬性,這時系統變量覆蓋了Properties中的值,這時取得username的值爲系統的用戶名Administrator(wqh),密碼爲properties中的password去查詢數據庫,此時用戶名名和密碼並不匹配就會報錯。
解決辦法:
1、將jdbc.properties文件中的username名稱換爲其他不衝突的字符,比如user。
2、在Spring配置文件中修改成:<context:property-placeholder location="classpath:/jdbc.properties" system-properties-mode="FALLBACK / NEVER"/>
添加一個system-properties-mode屬性
該屬性有三個值:FALLBACK --- 默認值,不存在時覆蓋
NEVER --- 不覆蓋
OVERRIDE --- 覆蓋
非常感謝這位大兄弟:https://www.cnblogs.com/tongxuping/p/7081656.html