前言
数据库版本: mysql Ver 14.14 Distrib 5.7.34, for linux-glibc2.12 (x86_64) using EditLine wrapper
java版本: java version “1.8.0_141”
idea工具版本 2021.2.3
在下载了mybits3.5.10 版本的源码(https://github.com/mybatis/mybatis-3)
配置了 config.xml 后
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://ip:port/mybits?useUnicode=true"/> //ip:port 为自己的端口,数据库连接正常的
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
启动项目报以下错误
### Error querying database. Cause: java.sql.SQLException: Error setting driver on UnpooledDataSource. Cause: java.lang.ClassNotFoundException: Cannot find class: com.mysql.jdbc.Driver
### The error may exist in org/apache/ibatis/test/UserMapper.xml
### The error may involve org.apache.ibatis.test.testMapper.test
### The error occurred while executing a query
### Cause: java.sql.SQLException: Error setting driver on UnpooledDataSource. Cause: java.lang.ClassNotFoundException: Cannot find class: com.mysql.jdbc.Driver
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:153)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:145)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:76)
at org.apache.ibatis.test.testController.main(testController.java:42)
Caused by: java.sql.SQLException: Error setting driver on UnpooledDataSource. Cause: java.lang.ClassNotFoundException: Cannot find class: com.mysql.jdbc.Driver
at org.apache.ibatis.datasource.unpooled.UnpooledDataSource.initializeDriver(UnpooledDataSource.java:244)
at org.apache.ibatis.datasource.unpooled.UnpooledDataSource.doGetConnection(UnpooledDataSource.java:223)
at org.apache.ibatis.datasource.unpooled.UnpooledDataSource.doGetConnection(UnpooledDataSource.java:219)
at org.apache.ibatis.datasource.unpooled.UnpooledDataSource.getConnection(UnpooledDataSource.java:95)
at org.apache.ibatis.datasource.pooled.PooledDataSource.popConnection(PooledDataSource.java:432)
at org.apache.ibatis.datasource.pooled.PooledDataSource.getConnection(PooledDataSource.java:89)
at org.apache.ibatis.transaction.jdbc.JdbcTransaction.openConnection(JdbcTransaction.java:139)
at org.apache.ibatis.transaction.jdbc.JdbcTransaction.getConnection(JdbcTransaction.java:61)
at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:337)
at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:86)
at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62)
at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:325)
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:89)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:151)
... 4 more
Process finished with exit code 1
解决办法
网上给出的方法大多能解决 spring集成mybits暴露的错误
- “com.mysql.jdbc.Driver” 中 少引号 或者 多空格
- maven引入的 mysql:mysql-connector-java 版本问题 与 mybits 不兼容,源码下载默认引入的8.0.27
- 通过配置Data Sources Drivers 中的Drivers 驱动
尝试过以上方法的笔者,都不行。最主要的问题日志已经告诉,找不到类,虽然maven引入了, idea左边的external libraries 也有maven的mysql,可就是ClassLoader 加载不了类,这个类没有。
既然读取不到maven引入的 ,那就自己引入到 external libraries
File -->Project Settings -->Libraries --> + --> java --> C:\Users\XXX.m2\repository\mysql\mysql-connector-java\8.0.27\mysql-connector-java-8.0.27.jar
引入之后运行 就正常了
结果上面一段红色 需要将
<property name="driver" value="com.mysql.jdbc.Driver"/>
改为
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
于是困扰半天的问题就解决了,可以愉快的调试源码了
附上代码
mybitsconfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.207.136:3306/mybits?useUnicode=true"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="org/apache/ibatis/test/UserMapper.xml"/>
</mappers>
</configuration>
testController
public class testController {
public static void main(String[] args) {
String resource = "org/apache/ibatis/test/mybitsconfig.xml";
Reader reader;
try {
reader = Resources.getResourceAsReader(resource);
SqlSessionFactory sqlMapper = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sqlMapper.openSession();
try {
Map<String,Object> map = session.selectOne("org.apache.ibatis.test.testMapper.test", 1);
System.out.println(map.get("_id").toString() + ":" + map.get("name").toString());
} finally {
session.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
testMapper
public interface testMapper {
Map<String,Object> test();
}
testMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.apache.ibatis.test.testMapper">
<select id="test" resultType="map">
select _id, name from user limit 1
</select>
</mapper>