MyBatis конфигурация аннотации автопроводное поле null - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь создать консольное приложение myBatis и избавиться от многократного использования одного и того же кода для инициализации сеанса, выполнения коммитов и транзакций. Этот код дает мне «Null Pointer Value» в поле «sm» в классе Annotations_Example. Что я делаю не так? С инициализацией в классе все работает нормально. Но теперь у него есть NPE.

Класс источника данных

public class DataSourceStudent_Mapper {

        @Bean
     public Student_mapper getDataSource() {
            String user = "postgres";
             String password = "postgres";
             String databasenameURL = "jdbc:postgresql://localhost:5432/postgres";
             String dbDriver = "org.postgresql.Driver";
             DataSource dataSource = new org.apache.ibatis.datasource.pooled.PooledDataSource(
                     dbDriver, databasenameURL, user, password);
             TransactionFactory transactionFactory = new JdbcTransactionFactory();
             Environment environment = new Environment("development",
                     transactionFactory, dataSource);
             Configuration configuration = new Configuration(environment);
             SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
                     .build(configuration);

             SqlSession session = sqlSessionFactory.openSession();
             session.getConfiguration().addMapper(Student_mapper.class);

            return session.getMapper(Student_mapper.class);
            }

        }

Основной класс

public class Annotations_Example {

    @Autowired
    public Student_mapper sm;

    public static void main(String args[]) throws IOException {

        Student student = new Student();

        student.setName("zara");
        student.setBranch("EEE");
        student.setEmail("zara@gmail.com");
        student.setPercentage(90);
        student.setPhone(123412341);

        sm.insert(student);

        sm.getMaxId();

        session.commit();
        session.close();



    }

}

1 Ответ

1 голос
/ 02 марта 2020

Вам нужно правильно инициализировать Spring.
Если вы хотите быстрое решение, попробуйте Spring Boot и MyBatis-Spring-Boot-Starter .

Предполагая, что вы знакомы с Maven , вам нужно внести несколько изменений в ваш pom. xml.

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-dependencies</artifactId>
      <version>2.2.5.RELEASE</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>
<dependencies>
  <dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.1</version>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
  </dependency>
  <dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
  </dependency>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <scope>test</scope>
  </dependency>
</dependencies>
<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
      <version>2.2.5.RELEASE</version>
      <executions>
        <execution>
          <goals>
            <goal>repackage</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

Основной класс будет выглядеть примерно так: следует:

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import mapper.Student_mapper;

@SpringBootApplication
@MapperScan("mapper")
public class Application implements CommandLineRunner {

  @Autowired
  private Student_mapper sm;

  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }

  @Override
  public void run(String... args) throws Exception {
    ...
    sm.insert(student);
    ...
  }
}

В аннотации @MapperScan необходимо указать пакет, содержащий ваши сопоставители.
Затем вы сможете вводить сопоставители, используя @Autowired.

Хотя в этом нет необходимости, рекомендуется добавить следующую строку в application.properties.

spring.main.web-application-type=NONE

С указанным выше значением. xml, mvn package создаст исполняемый JAR файл (с java -jar).

Вот исполняемый файл демонстрационный проект .

...