先看错误信息
Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException:
### Error opening session. Cause: java.lang.NullPointerException
### Cause: java.lang.NullPointerException
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:23)
at org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSessionFromDataSource(DefaultSqlSessionFactory.java:88)
at org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSession(DefaultSqlSessionFactory.java:43)
at com.swj.util.DbUtil.openSession(DbUtil.java:30)
at com.swj.test.Test.main(Test.java:13)
Caused by: java.lang.NullPointerException
at org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSessionFromDataSource(DefaultSqlSessionFactory.java:83)
... 3 more
先找到错误的信息是在factory.openSession()这里,以为是factory没有拿到,输出了下factory发现是有对象存在的,
就很奇怪。- -应该是哪里配置错了 看下配置文件 和获取SqlSession的地方
<?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>
<properties resource="jdbc.properties"></properties>
<typeAliases>
<typeAlias type="com.swj.model.Person" alias="Person"/>
</typeAliases>
<environments default="database">
<environment id="database">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED0">
<property name="driver" value="${driver_}"/>
<property name="url" value="${url_}"/>
<property name="username" value="${username_}"/>
<property name="password" value="${password_}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/swj/dao/PersonMapper.xml"/>
</mappers>
</configuration>
package com.swj.util;
import java.io.IOException;
import java.io.Reader;
import java.nio.charset.Charset;
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 DbUtil {
private static SqlSessionFactory factory;
private DbUtil(){}
static{
try {
Resources.setCharset(Charset.forName("utf-8"));
Reader reader = Resources.getResourceAsReader("mybatis.xml");
factory = new SqlSessionFactoryBuilder().build(reader,"oracle");
} catch (IOException e) {
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}
}
public static SqlSession openSession(){
return factory.openSession();
}
public static void close(SqlSession session){
if(session!=null){
session.close();
}
}
}
找了半天- -发现是在配置文件里的环境名字是database,而获取factory时传入的环境是oracle,开始以为是用的什么数据库传的就是数据库的名称- -