2016-02-03 1 views
0

У меня возникает следующая проблема: когда я подключаюсь к db с помощью MyBatis, я получаю NPE.Исключение Nullpointer при подключении к БД с использованием 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(); 
    } 

StackTrace является следующее:

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-Реализация. Как указано в документах «Вы можете подключить любой сторонний DataSource, реализуя интерфейс org.apache.ibatis.datasource.DataSourceFactory». Существенно, что на данный момент у вас есть действительный DataSource. – Frank

0

Благодаря Frank для DataSource идеи. Я использовал пул данных dataSource по умолчанию, и эта проблема будет решена.