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的加载顺序
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);
所以,如果在参数中发生了变化,就等于考状元的时候,在最后一步被人顶替了,前面做了啥惊天动地的事情,都成了无用功。