Mybatis找不到jdbc.properties中的變數的錯誤:{jdbc_driverClassName}不起作用,的解決方案
阿新 • • 發佈:2018-12-22
Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: java.sql.SQLException: Error setting driver on UnpooledDataSource. Cause: java.lang.ClassNotFoundException: Cannot find class: ${jdbc_driverClassName}
### The error may exist in ./mapper/UserMapper.xml
### The error may involve org.mybatis.mapper.UserMapper.selectByPrimaryKey
### The error occurred while executing a query
### Cause: java.sql.SQLException: Error setting driver on UnpooledDataSource. Cause: java.lang.ClassNotFoundException: Cannot find class: ${jdbc_driverClassName}
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:23)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:107)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:98)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:62)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:63)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:43)
at com.sun.proxy.$Proxy0.selectByPrimaryKey(Unknown Source)
at maven_mybatis.Main.main(Main.java:30)
Caused by: java.sql.SQLException: Error setting driver on UnpooledDataSource. Cause: java.lang.ClassNotFoundException: Cannot find class: ${jdbc_driverClassName}
at org.apache.ibatis.datasource.unpooled.UnpooledDataSource.initializeDriver(UnpooledDataSource.java:211)
at org.apache.ibatis.datasource.unpooled.UnpooledDataSource.doGetConnection(UnpooledDataSource.java:190)
at org.apache.ibatis.datasource.unpooled.UnpooledDataSource.doGetConnection(UnpooledDataSource.java:186)
at org.apache.ibatis.datasource.unpooled.UnpooledDataSource.getConnection(UnpooledDataSource.java:88)
at org.apache.ibatis.datasource.pooled.PooledDataSource.popConnection(PooledDataSource.java:373)
at org.apache.ibatis.datasource.pooled.PooledDataSource.getConnection(PooledDataSource.java:82)
at org.apache.ibatis.transaction.jdbc.JdbcTransaction.openConnection(JdbcTransaction.java:131)
at org.apache.ibatis.transaction.jdbc.JdbcTransaction.getConnection(JdbcTransaction.java:58)
at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:271)
at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:69)
at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:56)
at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:259)
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:132)
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:105)
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:81)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:104)
... 6 more
————————————————————————
解決方案:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
<configuration><!-- 這個configuration的C必須小寫,因為dtd裡面的configuration是小寫的。 -->
<properties resource="./conf/jdbc.properties"/> <!--沒錯,就是加入這句,後面的${}的變數名才能用-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc_driverClassName}"/>
<property name="url" value="${jdbc_url}"/>
<property name="username" value="${jdbc_username}"/>
<property name="password" value="${jdbc_password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="./mapper/UserMapper.xml"/>
</mappers>
</configuration>
————————其中:mapper和Model都是自動生成的,自動生成,見(18)節文章【有道筆記】。
Properties的載入順序
Properties的載入順序
Mybatis對於properties的載入順序按照以下順序:
1) 首先Mybatis會找到配置檔案中的properties中的內容,例如上面的username=chenzw以及上面的password=1258577,在解析XML檔案中的相關物件中的記錄的就是配置檔案中的properties中的內容。
2) 然後,Mybatis會找到Properties節點屬性resource指向的內容,例如在上面的Demo中,該屬性指向的內容為jdbc.properties檔案,Mybatis就會解析上面的內容,然後得到Properties檔案的內容,這個時候,會發現password發生了衝突,有兩個不同值的password屬性,這裡,一定要記住Mybatis會以本次發現的為準,將password檔案修改為7758521.
3)其實,這裡的配置的所有的引數都會以一個記錄的屬性值作為引數傳遞給相關的方法來執行的,呼叫的方法在Mybatis的API文件中有描述如下:
SqlSessionFactoryfactory = sqlSessionFactoryBuilder.build(reader, props);
SqlSessionFactoryfactory = sqlSessionFactoryBuilder.build(reader, environment, props);
所以,如果在引數中發生了變化,就等於考狀元的時候,在最後一步被人頂替了,前面做了啥驚天動地的事情,都成了無用功。