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

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


- 这是一个在运行MyBatis相关测试时出现的错误错误信息表明在查询数据库时出现问题,原因是在设置 UnpooledDataSource 的驱动时出错,进一步原因是不到类 ${jdbc.driver} 。 2. 具体错误点分析: -  ClassNotFoundException 部分: - 错误信息 java.lang.ClassNotFoundException: Cannot find class:${jdbc.driver} 表示程序试图加载一个类,但是不到。这里的 ${jdbc.driver} 看起来像是一个占位符,在实际应用中,应该是通过配置文件等方式替换为真实的JDBC驱动类名,比如 com.mysql.jdbc.Driver (针对MySQL数据库)。这很可能是配置文件没有正确加载或者占位符没有被正确替换,导致程序把 ${jdbc.driver} 当成了一个实际的类名去加载,所以报不到类的错误。 -  SQLException 部分: -  java.sql.SQLException: Error setting driver on UnpooledDataSource 是由于前面的 ClassNotFoundException 导致的。因为不到JDBC驱动类,所以在 UnpooledDataSource 上设置驱动时就抛出了SQL异常。 - MyBatis相关部分: -  ### Error querying database.  说明MyBatis在执行数据库查询操作时出错。 ### The error may exist in org/dongyong/dao/StudentMapper.java (best guess)  提示错误可能存在于 StudentMapper.java 文件中, ### The error may involve org.dongyong.dao.StudentMapper.selectByPrimaryKey 表明可能涉及到 selectByPrimaryKey 这个方法, ### The error occurred while executing a query 明确是在执行查询时出现错误。这些信息结合起来看,就是在 StudentMapper 的 selectByPrimaryKey 方法执行查询时,由于JDBC驱动加载问题导致出错。具体解决思路
最新发布
03-29
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!--<context:component-scan base-package="com.tjise.bean"/>--> <!-- 加载数据库连接信息的属性文件 --> <context:property-placeholder location="classpath:jdbc-config.properties"/> <!-- 配置Druid数据源的Bean --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!-- 配置SessionFactory的Bean --> <bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 注入数据源 --> <property name="dataSource" ref="dataSource"/> <!-- 指定MyBatis配置文件的位置 --> <property name="configLocation" value="classpath:mybatis.xml"/> <!-- 给实体类起别名 --> <property name="typeAliasesPackage" value="com.tjise.entity"/> </bean> <!-- 配置mapper接口的扫描器,将Mapper接口的实现类自动注入到IoC容器中 实现类Bean的名称默认为接口类名的首字母小写 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- basePackage属性指定自动扫描mapper接口所在的包 --> <property name="basePackage" value="com.tjise.mapper"/> </bean> </beans>
03-23
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值