web-dev-qa-db-ja.com

春のブーツ。 SQLスクリプトを実行し、アプリケーションの起動時にデータを取得します

私はスプリングブートアプリケーションを開発しています。現時点では、私の設定の一部はハードコーディングされています(例:Hystrixプロパティ)。

したがって、アプリケーションの起動時またはその直後にこれらの構成を取得したいと思います。

スプリングブーツを使用してそれを行うことは可能ですか?起動時にSQLスクリプトを実行してデータを取得します。

アプリケーションでプロパティ/構成を取得して保存する方法

MyBatisとOracle DBを使用しています。

16
Laurynas

デフォルトでは、Spring-Bootはdata.sqlおよび/またはdata-${platform}.sql

ただし、スクリプトは起動のたびに読み込まれるので、起動時に再挿入するのではなく、データベースに既に存在する値を保持する方が理にかなっています(少なくとも運用環境では)。 個人的には、メモリデータベースを使用するときにtest/devの目的でデータベースの初期化のみを使用しました。それでも、これはSpring-Bootが提供する機能です。

ソース: spring-boot-howto-database-initialization

Spring JDBCにはDataSource初期化機能があります。 Spring Bootはデフォルトでそれを有効にし、標準の場所schema.sqlおよびdata.sql(クラスパスのルート)からSQLをロードします。さらに、Spring Bootはschema-$ {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:存在する場合は更新、そうでない場合は挿入
29
alexbt

何らかのビジネスロジックに基づいてデータを挿入する場合は、イベントリスナーを使用することをお勧めします。そのため、@ EventListenerメソッドで注釈が付けられているため、基本的にアプリケーションの起動時に「OnApplicationEvent」が自動的に呼び出されます。

また、データを取得する必要がある場合と同様に、リポジトリオブジェクトを使用してデータも取得するだけです。

次に例を示します。

@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);
   }
}
1

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)
_

ただし、クラスにメソッドがある@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