Mybatis找不到jdbc.properties中的变量的错误:{jdbc_driverClassName}不起作用,的解决方案

本文介绍了Mybatis加载properties文件的顺序,当遇到{jdbc_driverClassName}等变量未生效的问题时,可以参照此顺序排查。首先,Mybatis会读取配置文件中的properties内容;其次,解析Properties节点resource指定的外部文件,如jdbc.properties,此时如果有冲突,以新发现的为准。最后,这些参数会被传递给相关方法执行,确保配置正确才能避免最后时刻的努力付诸东流。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);

所以,如果在参数中发生了变化,就等于考状元的时候,在最后一步被人顶替了,前面做了啥惊天动地的事情,都成了无用功。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值