wake-up-neo.com

Springstiefel Führen Sie SQL-Skripts aus und erhalten Sie Daten beim Start der Anwendung

Ich entwickle eine Springboot-Anwendung. Im Moment sind einige meiner Konfigurationen hartcodiert (z. B. Hystrix-Eigenschaften).

Daher möchte ich diese Konfigurationen auf die Startzeit meiner Anwendung oder kurz danach beziehen. 

Kann man das mit Springboot machen? Ich meine, SQL-Skript beim Start auszuführen und Daten abzurufen.

Wie sollen Eigenschaften/Konfigurationen abgerufen und in meiner Anwendung gespeichert werden?

Ich benutze MyBatis und Oracle DB.

12
Laurynas

Spring-Boot lädt standardmäßig data.sql und/oder data-${platform}.sql.

Beachten Sie jedoch, dass das Skript bei jedem Start geladen wird. Daher ist es (zumindest für die Produktion) sinnvoller, die Werte bereits in der Datenbank zu speichern und nicht bei jedem Start erneut einzufügen. Ich habe die Datenbankinitialisierung bei der Verwendung einer Speicherdatenbank nur zu Test-/dev-Zwecken verwendet. Dies ist jedoch die Funktion von Spring-Boot. 

source: spring-boot-howto-datenbankinitialisierung :

Spring JDBC verfügt über eine DataSource-Initialisierungsfunktion. Spring Boot aktiviert es standardmäßig und lädt SQL von den Standardspeicherorten schema.sql und data.sql (im Stammverzeichnis des Klassenpfads). Zusätzlich wird Spring Boot Laden Sie das Schema - $ {Plattform} .sql und die Daten - $ {Plattform} .sql-Dateien (falls vorhanden ).

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

insert into...
insert into...
  • Sie können die Plattform folgendermaßen definieren: spring.datasource.platform=Oracle.
  • Sie können den Namen des SQL-Skripts ändern, um es zu laden: spring.datasource.data=myscript.sql.
  • Zusammen mit data.sql lädt Spring-boot auch schema.sql (vor data.sql).
  • Sie könnten auch eine "Aktualisierungs- oder Einfügungs" -Logik in Ihrer data.sql: Oracle-Datei haben: update, falls vorhanden, sonst Einfügen
21
alexbt

Wenn Sie Daten basierend auf einer Geschäftslogik einfügen möchten, würde ich Ihnen empfehlen, Event Listener zu verwenden. Beim Start der Anwendung wird also "OnApplicationEvent", wie es mit der @EventListener-Methode kommentiert wird, automatisch aufgerufen.

Da Sie in diesem Fall auch die Daten abrufen müssen, verwenden Sie einfach Ihr Repository-Objekt, um auch die Daten abzurufen.

Hier ist ein Beispiel:

@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

Wenn Sie die Datei application.properties verwenden, können Sie die Umgebungsklasse . Verwenden 

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

oder Sie können Ihre eigene Eigenschaftsdatei definieren. Dann können Sie sie mit der Annotation @PropertySource(name = "myProperties", value = "example.properties") abrufen

Sie müssen die @Value-Annotation verwenden, um einen bestimmten Wert aus der von Ihnen definierten Eigenschaftendatei abzurufen. 

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

Und Sie möchten etwas starten, wenn Application gerade gestartet wird 

@EventListener(ApplicationReadyEvent.class)  with a method.

Sie müssen jedoch @Service oder @Component Annotation verwenden, welche Klasse die Methode hat. 

Total,

Sie können dies verwenden.

example.properties:

   url=yourValue
    userName=yourDBUserName
    password=yourDBPassword

beispielklasse:

  @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