mybatis配置的常见错误 org.apache.ibatis.exceptions.PersistenceException Unknown database Cannot find class
这里写目录标题
引言
我们在开发的过程中,或者在做毕设时,会经常使用到mybatis,用其来与数据库进行交互,我们写好了configurationx.ml,如果引用该文件呢?
引入配置文件
-
导入
mybaits架包
,如果有必要的话,可以导入源码包 -
利用
Resource.getResourceAsStream("xonfiguration.xml")
,将configuration.xml
转化为流文件 -
利用
SQLSessionFactoryBuilder.build()
来创建SQLSessionFactory
对象。 -
利用
SQLSessionFactory.opsession()
,来打开一个会话,由此来创建对数据库连接的Connection
对象。
package com.zandc.util.conn;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class DataBaseConnect {
/**
* 通过Resources.getResourceAsStream(configXml)获取输入流
* 将输入流放进SqlSessionFactoryBuilder()对象的build方法中
* 通过工厂设计模式来创建SqlSessionFactory对象
*
* @return
*/
private static SqlSessionFactory getSqlSessionfactory(){
String configXml="configuration.xml";
InputStream is=null;
try {
is=Resources.getResourceAsStream(configXml);
} catch (IOException e) {
e.printStackTrace();
}
return new SqlSessionFactoryBuilder().build(is);
}
/**
* 通过私有方法getSqlSessionfactory()创建SQLSessionFactory对象
*
* 调用openSession方法来打开一个会话
* @return
*/
public static SqlSession getConnection(){
return getSqlSessionfactory().openSession();
}
public static void main(String[] args) {
System.out.println(getConnection());
}
}
但在配置的过程中,会出现很多错误,因而,我们来探讨mybatis常见的错误。
常见错误
错误一:mapper错误
<mappers>
<mapper resource="com/zandc/jiancom/model/entity/select_data.xml" />
<mapper resource="com/zandc/jiancom/model/entity/insert_data.xml" />
<mapper resource="com/zandc/jiancom/model/entity/delete_data.xml" />
<mapper resource="com/zandc/jiancom/model/entity/update_data.xml" />
</mappers>
这是映射对数据库表操作的xml
文件。
我们需要获取的xml
的完整路径,而且xml
的名字不能写错,比如我在com/zandc/jiancom/model/entity/
路径下的select_data.xml
,如果我把select_data.xml
写成了sel_data.xml
,那么将configuration.xml
加载到运行时,会检索XML
文件,发现没有com/zandc/jiancom/model/entity/select_data.xml
路径下的文件,于是就报出了错误:
错误二: 操作数据库数据的xml文件错误
没有写mapper
我们都知道当创建一个delete_data.xml
文件,必定有一个命名空间,这是区分其他xml
的文件,如果我们把我们没有写能够映射的XML文件,也会报错:
没有引入命名空间
我们忘记引入命名空间:
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"
>
也会出现错误。
错误三:没有正确配置DataSource
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${drive}" />
<property name="ur" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
也就是说,我们应该配置DataSource,如果我们写错其中的一个配置,比如我们name="url" 写成name="ur" ,getResourceAsStream("configuration.xml")
时,解析到name
这里,发现没有没有name里面没有“ur”
这个属性,因而,就会报错。
Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException:
### Error building SqlSession.
### The error may exist in SQL Mapper Configuration
### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.datasource.DataSourceException: Unknown DataSource property: ur at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:23)
错误四:没有引入架包
我们有时候发现,configuration.xml
解析没有问题,能够通过SQLSessionFactory.openSession()
打开一个会话,但无法创建java.sql.Connection;
包下的connection
对象,这是为什么呢?
我们来看看这个错误:
Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException:
Error getting a new connection.
Cause:
java.sql.SQLException:
Error setting driver on UnpooledDataSource.
Cause:
java.lang.ClassNotFoundException:
Cannot find class: ${drive}
Cause:
java.sql.SQLException:
Error setting driver on UnpooledDataSource.
Cause:
java.lang.ClassNotFoundException:
Cannot find class: ***${drive}*** at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:23) at org.apache.ibatis.session.defaults.DefaultSqlSession.getConnection(DefaultSqlSession.java:222)
通过分析报错信息可得,找不到这个驱动类。
这也正对应了上面的分析,我们没有导入mysql架包。
当然,诸如此类错误还有:
-
Unknown database ‘jiansou’:没有正确配置数据库
-
Cannot find class: ${drive}:这里的参数名和db.properties不一致
总结
在技术的道路上,需要学会积累,这样才能走得更远。
相关文章
- 构建通过 Database.com 提供技术支持的 PhoneGap 应用程序
- 调试手机中数据库的福音:Android-Debug-Database
- SQL Server Database Encryption for GDPR Compliance with DbDefence
- PhpStorm中如何使用database工具
- BIWI Kinect Head Pose Database
- EF6 Database First (DbContext) - Change Schema at runtime
- postgres pg_stat_database视图
- 【QT】解决QSqlQuery::exec: database not open
- WINSOFT DAO Database性能
- RDS SQL Server 创建数据库关系图(Database Diagrams)
- oracle 透明网关(oracle database gateway)介绍
- [Windows Azure] Windows Azure SQL Database library
- 解决sqlite死锁示例异常database is locked
- SCVMM和SQL分别建在不同服务器上报错:Error ID 319 during database creation on remote SQL Server