2016-02-03 36 views
0

我有以下问题:当我连接使用的MyBatis到DB我得到一个NPE。空指针异常,同时连接到数据库使用的MyBatis

这里是设置连接类:

public class SetDBConnection { 

    private Mapper mapper; 
    private SqlSession session; 
    private Configuration configuration; 

    public SetDBConnection() { 


     configuration = new Configuration(); 
     configuration.setJdbcTypeForNull(JdbcType.VARCHAR); 
     configuration.setLogImpl(Slf4jImpl.class); 
     configuration.setDefaultExecutorType(ExecutorType.REUSE); 
     configuration.addMapper(Mapper.class); 

     Properties properties = null; 
     try { 
      properties = readProperties(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     configuration.setVariables(properties); 

    } 


    public Mapper openSession() { 

     SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); 
     session = sqlSessionFactory.openSession(); 

     mapper = session.getMapper(Mapper.class); 
     return mapper; 
    } 

    public void closeSession() { 
     session.commit(); 
     session.close(); 
    } 

    private Properties readProperties() throws IOException { 
     Properties properties = new Properties(); 
     InputStream inputStream = getClass().getClassLoader() 
       .getResourceAsStream("connection.properties"); 


     if (inputStream != null) { 
      properties.load(inputStream); 
     } else { 
      throw new FileNotFoundException("property file not found in the classpath"); 
     } 
     inputStream.close(); 

     return properties; 
    } 
} 

在这里,我把它和尝试插入数据 SetDBConnection康恩=新SetDBConnection();

Person p = new Person(); 
    p.setName("Alex"); 
    p.setLastName("Bondar"); 
    p.setTelephone("+79267157256"); 
    p.setPersonalId("777-216"); 
    Mapper mapper=conn.openSession(); 
    try { 
     System.out.println("All set to go"); 
     mapper.saveOrUpdatePerson(p); 
    } finally { 
     conn.closeSession(); 
    } 

堆栈跟踪如下:

Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException: 
### Error opening session. Cause: java.lang.NullPointerException 
### The error may exist in org/abondar/experimental/mybatisdemo/mappers/Mapper.java (best guess) 
### Cause: java.lang.NullPointerException 
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) 
    at org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSessionFromDataSource(DefaultSqlSessionFactory.java:100) 
    at org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSession(DefaultSqlSessionFactory.java:47) 
    at org.abondar.experimental.mybatisdemo.SetDBConnection.openSession(SetDBConnection.java:51) 
    at org.abondar.experimental.mybatisdemo.Main.main(Main.java:19) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 
Caused by: java.lang.NullPointerException 
    at org.apache.ibatis.session.defaults.DefaultSqlSessionFactory.openSessionFromDataSource(DefaultSqlSessionFactory.java:95) 
    ... 8 more 

什么可能是错误的,是有什么办法没有重新建立的每一个动作(选择,插入或删除)DB连接?

+2

你从哪里得到的NPE?你能发布堆栈跟踪吗? – Frank

+0

'inputStream.close();'是空校验 –

+0

@ cricket_007这不是问题的根源之外。 –

回答

3

看来你有没有环境和TransactionFactory定义。按照docs你应该以某种方式初始化MyBatis的是这样的:

DataSource dataSource = BlogDataSourceFactory.getBlogDataSource(); 
TransactionFactory transactionFactory = new JdbcTransactionFactory(); 
Environment environment = new Environment("development", transactionFactory, dataSource); 
Configuration configuration = new Configuration(environment); 
+0

但是什么是BlogDataSourceFactory? –

+0

这是本示例中使用的DataSourceFactory-Implementation。如文档中所述“您可以通过实现org.apache.ibatis.datasource.DataSourceFactory接口来插入任何第三方数据源”。基本的是,你现在有一个有效的数据源。 – Frank

0

感谢弗兰克为数据源的想法。我用默认的合并数据源,这个问题看起来要解决