it-roy-ru.com

Весенний ботинок. Запустите сценарии SQL и получите данные при запуске приложения.

Я разрабатываю приложение для весенней загрузки. На данный момент некоторые из моих конфигов жестко запрограммированы (например, свойства Hystrix).

Поэтому я хотел бы получить эти конфиги во время запуска приложения или сразу после этого. 

Возможно ли это сделать с помощью пружинной загрузки? Я имею в виду запустить скрипт SQL при запуске и получить данные.

Как свойства/конфиги должны быть получены и сохранены в моем приложении?

Я использую MyBatis и Oracle DB.

12
Laurynas

По умолчанию Spring-Boot загружает data.sql и/или data-${platform}.sql.

Однако имейте в виду, что скрипт будет загружаться при каждом запуске, поэтому я думаю, что имеет больше смысла (по крайней мере, для производства), просто иметь значения, уже присутствующие в базе данных, а не вставляться повторно при каждом запуске. Я лично использовал инициализацию базы данных только для целей тестирования/разработки при использовании базы данных памяти. Тем не менее, это функция, предоставляемая Spring-Boot. 

источник: spring-boot-howto-database-initialization :

Spring JDBC имеет функцию инициализации источника данных. Spring Boot включает он по умолчанию загружает SQL из стандартных расположений schema.sql и data.sql (в корне пути к классам). Кроме того Spring Boot будет загрузить файлы схемы - $ {platform} .sql и data - $ {platform} .sql (если присутствует).

src/main/resources/data-Oracle.sql:

insert into...
insert into...
  • Вы можете определить платформу с помощью: spring.datasource.platform=Oracle.
  • Вы можете изменить имя сценария sql для загрузки с помощью: spring.datasource.data=myscript.sql.
  • Помимо data.sql Spring-boot также загружает schema.sql (перед data.sql).
  • Вы также можете иметь логику «обновить или вставить» в ваших data.sql: Oracle sql: update, если существует, иначе вставить
21
alexbt

Если вы хотите вставить данные, основанные на некоторой бизнес-логике, я бы порекомендовал вам использовать прослушиватель событий. Таким образом, в основном при запуске приложения «OnApplicationEvent», так как он аннотирован @EventListener, будет вызываться автоматически.

Кроме того, так как в вашем случае вам нужно получить данные, вы просто используете объект хранилища, чтобы получить данные.

Вот один пример:

@Component
public class OnApplicationStartUp {

   @Autowired
   private ServiceRepository repository;


   @EventListener
   public void onApplicationEvent(ContextRefreshedEvent event) {

       //Write your business logic here.
       if (repository.findAll().size() <= 0) {
           preloadData();
       }else{
           fetchData();
       }
   }

    private void preloadData() {

       List<Service> services = new ArrayList<>();
       Service someService= new Service("name", "type");
       services.add(someService);
       ...
       ...
       repository.saveAll(services);
   }
}
0
Siddharth Sachdeva

Если вы получаете из файла application.properties, вы можете использовать класс Environment . 

Autowired
private Environment environment;
...
environment.getProperty("propertyName")

или вы можете определить свой собственный файл свойств. затем вы можете получить его с помощью @PropertySource(name = "myProperties", value = "example.properties") аннотации

Вам нужно использовать аннотацию @Value, чтобы получить определенное значение из файла свойств, который вы определили. 

   @Value("${propertyNameInYourPropertFile}")
      private String url;

И вы хотите запустить что-то, когда приложение только запущено, вы можете использовать 

@EventListener(ApplicationReadyEvent.class)  with a method.

Но нужно использовать @Service или @Component Annotation, у какого класса есть метод. 

В целом,

Вы можете использовать это.

example.properties:

   url=yourValue
    userName=yourDBUserName
    password=yourDBPassword

пример класса:

  @Service
    @PropertySource(name = "myProperties", value = "example.properties")
     public class Start{

     @Value("${url}")
              private String url;
     @Value("${userName}")
              private String userName;
     @Value("${password}")
              private String password;


         //Run this method when application started
          @EventListener(ApplicationReadyEvent.class)
            public ResultSet getConnection()
            {

                //Connect to Database
                Connection connection = null;
                String QUERY="your sql query";
                try {
                    DriverManager.registerDriver(new Oracle.jdbc.driver.OracleDriver());
                    connection = DriverManager.getConnection(url, userName, password );
                } catch (SQLException e) {
                }


                //Run your query
                Statement stmt = null;
                try {
                    stmt = connection.createStatement();
                } catch (SQLException e1) {
                    e1.printStackTrace();
                }
                ResultSet rs = null;
                try {
                     rs = stmt.executeQuery(QUERY);
                } catch (SQLException e1) {
                    e1.printStackTrace();
                }

                return rs;
            }

    }
0
Cocuthemyth