web-dev-qa-db-fra.com

Botte de printemps. Exécuter des scripts SQL et obtenir des données au démarrage de l'application

Je développe une application de démarrage de printemps. Pour le moment, certaines de mes configurations sont codées en dur (propriétés Hystrix, par exemple).

Je voudrais donc avoir ces configs sur mon heure de démarrage d’application ou juste après. 

Est-il possible de le faire avec une botte à ressort? Je veux dire exécuter un script SQL au démarrage et obtenir des données.

Comment les propriétés/configurations doivent-elles être récupérées et stockées dans mon application?

J'utilise MyBatis et Oracle DB.

12
Laurynas

Par défaut, Spring-Boot charge data.sql et/ou data-${platform}.sql.

Cependant, gardez à l'esprit que le script serait chargé à chaque démarrage. Je pense donc qu'il est plus logique (du moins pour la production) de ne conserver que les valeurs déjà présentes dans la base de données et de ne pas les réinsérer à chaque démarrage. Personnellement, je n'ai utilisé l'initialisation de la base de données qu'à des fins de test/dev avec une base de données en mémoire. Pourtant, c'est la fonctionnalité fournie par Spring-Boot. 

source: initialisation-comment-initialiser-base-de-données-de-printemps :

Spring JDBC possède une fonction d'initialisation de source de données. Spring Boot active par défaut et charge SQL à partir des emplacements standard schema.sql et data.sql (dans la racine du classpath). De plus, Spring Boot sera chargez le schéma - $ {plate-forme} .sql et data - $ {plate-forme} .sql (si présent).

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

insert into...
insert into...
  • Vous pouvez définir la plate-forme avec: spring.datasource.platform=Oracle.
  • Vous pouvez modifier le nom du script SQL pour le charger avec: spring.datasource.data=myscript.sql.
  • En plus de data.sql, Spring-boot charge également schema.sql (avant data.sql).
  • Vous pouvez également avoir une logique de «mise à jour ou d’insertion» dans votre data.sql: Oracle SQL: update s’il existe, sinon insérer
21
alexbt

Si vous souhaitez insérer des données basées sur une logique métier, je vous recommande d’utiliser Event Listener. Donc, fondamentalement, au démarrage de l'application, "OnApplicationEvent", comme il est annoté avec la méthode @EventListener, sera appelé automatiquement.

De plus, comme dans votre cas, vous devez obtenir les données, vous utilisez simplement votre objet de référentiel pour obtenir également les données.

Voici un exemple:

@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

Si vous obtenez du fichier application.properties, vous pouvez utiliser la classe d'environnement . 

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

ou vous pouvez définir votre propre fichier de propriétés.Vous pouvez ensuite en obtenir avec l'annotation @PropertySource(name = "myProperties", value = "example.properties")

Vous devez utiliser l'annotation @Value pour obtenir une valeur spécifique à partir du fichier de propriétés que vous avez défini. 

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

Et vous voulez commencer quelque chose quand l’application vient de démarrer, vous pouvez utiliser 

@EventListener(ApplicationReadyEvent.class)  with a method.

Mais vous devez utiliser @Service ou @Component Annotation, dont Class a la méthode. 

Totalement,

Vous pouvez utiliser ceci.

example.properties:

   url=yourValue
    userName=yourDBUserName
    password=yourDBPassword

exemple de classe:

  @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