springboot項目啟動時初始化數據庫(只執行一次)


  先說結論。

  cloud項目中spring.data.sql屬性可以做到項目每次啟動時,都執行相應的sql,但這不夠個性化。

  通過DataSourceInitializer自定義來實現,具體代碼:

  

@Configuration
@Slf4j
public class DataSourceInitializer {


    @javax.annotation.Resource(name = "dataSourceFirst")
    private DataSource dataSource;

    @Value("classpath:db/xx.sql")
    private Resource ddl;
    @Value("classpath:db/data.sql")
    private Resource dml;

    @Bean
    public DataSourceInitializer dataSourceInitializer(final DataSource dataSource) {
        final DataSourceInitializer initializer = new DataSourceInitializer();
        // 設置數據源
        initializer.setDataSource(dataSource);
        initializer.setDatabasePopulator(databasePopulator());
        return initializer;
    }

    private DatabasePopulator databasePopulator() {
        final ResourceDatabasePopulator populator = new ResourceDatabasePopulator();

        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

        try {
            Map map = jdbcTemplate.queryForMap("select count(1) from xx");
        } catch (DataAccessException e) {
            log.warn("初始化腳本報錯:" + e.getMessage());
            // 報錯,表不存在,初次導入,執行相關腳本
            populator.addScripts(ddl);
//            populator.addScripts(dml);
        } catch (Exception e) {
            log.warn("初始化腳本報錯:" + e.getMessage());
        }


        return populator;
    }






}

  大體就是這樣,然后DML的sql,放到服務器上會有新的報錯,我就用了比較簡單的方式,放到Java里執行,CommandLineRunner,通過這個類,一樣的判斷,這樣就可以初始化相關的只執行一次,不用每次都覆蓋了。

  這個我斷斷續續找了幾天都沒找到,可能是因為這個需求比較少見吧。寫這個文章前我突然想到,sql里似乎也可以做到,create if not exsit就可以……怪不得前兩天沒發現別人這么寫,

  但這個寫法多少也有點用吧,linux執行有的會亂碼,導致執行失敗,很怪。

  最后,springcloud真牛啊,大部分功能都約定了,怪不得Java開發這么好干呢。而且從這個問題能發現,應該是所有屬性都可以自定義實現的!真是學到了。

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM