SpringBoot自動(dòng)初始化數(shù)據(jù)庫的方法分享
前言
我們?cè)陧?xiàng)目中應(yīng)該經(jīng)常遇到過初始化數(shù)據(jù)的場(chǎng)景,特別是項(xiàng)目部署或者交付的時(shí)候,需要建表、初始化數(shù)據(jù)等,那我們一般可能在部署前,提前在DB中執(zhí)行SQL,那么有什么方式可以在項(xiàng)目啟動(dòng)的時(shí)候自動(dòng)初始化數(shù)據(jù)庫呢?SpringBoot為我們提供了幾種快捷的方式。
JPA映射初始化
如果我們?cè)陧?xiàng)目中用到了jpa,那就初始化數(shù)據(jù)庫表結(jié)構(gòu)就比較簡(jiǎn)單,因?yàn)槲覀兊念惥完P(guān)聯(lián)的表名和字段,我們可以通過配置:
spring.jpa.generate-ddl = true
來開啟自動(dòng)生成DDL,又或者直接指定hibernate配置:
# none:不處理
# validate:只校驗(yàn)表是否和實(shí)體類對(duì)應(yīng)
# update:更新表結(jié)構(gòu),但是它只會(huì)新增,不會(huì)刪除
# create:先drop再創(chuàng)建
# create-drop:和create不同的是應(yīng)用關(guān)閉時(shí)會(huì)drop表,一般會(huì)在單元測(cè)試時(shí)使用
spring.jpa.hibernate.ddl-auto = none / validate / update / create / create-drop
spring.jpa.hibernate.ddl-auto
的默認(rèn)值是變化的,如果我們用了內(nèi)嵌數(shù)據(jù)庫,那么默認(rèn)值是create-drop
,如果沒有,那么就是none
,即不做任何操作。
如果我們指定了spring.jpa.hibernate.ddl-auto
那么就沒有必要再使用spring.jpa.generate-ddl
了,不要混用兩個(gè)配置。
初始化腳本
上面所說的數(shù)據(jù)庫初始化依賴于我們的ORM框架,而且它只能初始化表結(jié)構(gòu),如果有數(shù)據(jù)需要初始化就無法實(shí)現(xiàn)了,SpringBoot也考慮到了這一點(diǎn),因此我們還可以能過初始化腳本來進(jìn)行數(shù)據(jù)庫初始化,比如我們定義一個(gè)SQL腳本如下:
CREATE TABLE IF NOT EXISTS t_user ( id bigint auto_increment primary key comment 'id', name varchar(64) default '' not null comment '姓名', age int default 0 not null comment '年齡', description varchar(128) default '' not null comment '描述', ) COMMENT '用戶'; -- 插入默認(rèn)用戶 INSERT IGNORE INTO t_user (name, age, description) VALUES ('admin', 10, '');
腳本名稱為:schema-mysql.sql
,那么我們就可以通過配置來在項(xiàng)目啟動(dòng)時(shí),自動(dòng)執(zhí)行上面的SQL腳本:
# 指定對(duì)應(yīng)的數(shù)據(jù)庫平臺(tái),可以取值all或者指定的平臺(tái) spring.sql.init.platform = mysql # 指定SQL初始化模式,取值always / never / embedded # embedded則是只在使用嵌入式DB時(shí)才執(zhí)行 # 如果不需要執(zhí)行初始化腳本,那么可以設(shè)置值為 never spring.sql.init.mode = always
SpringBoot在啟動(dòng)時(shí),會(huì)自動(dòng)在classpath下尋找schema-${platform}.sql
或data-${platform}.sql
文件并執(zhí)行。
@Sql注解
這種方式只能用于單元測(cè)試,在單元測(cè)試時(shí)通過@Sql
注解來指定測(cè)試前后需要執(zhí)行的腳本,具體可以查看:《SpringBoot單元測(cè)試實(shí)踐——數(shù)據(jù)隔離篇》
總結(jié)
上面介紹了幾種SpringBoot中在項(xiàng)目運(yùn)行前初始化數(shù)據(jù)庫的方式,那么我們?cè)趯?shí)際生產(chǎn)環(huán)境中會(huì)使用嗎?我的回答是看場(chǎng)景:
- 一般情況下,不會(huì)使用,因?yàn)槿绻且粋€(gè)長(zhǎng)期運(yùn)行的服務(wù),除了第一次部署需要初始化,后續(xù)更多的是表結(jié)構(gòu)的變更,比如增加、刪除字段,那么對(duì)于這種操作,是比較謹(jǐn)慎的,特別是大表,更多的是采用在線改表的方式進(jìn)行。
- 但是對(duì)于一些特定的場(chǎng)景還是有價(jià)值的,比如乙方的項(xiàng)目交付,我一個(gè)項(xiàng)目可能需要交付給很多地方,而且后續(xù)也沒什么變更,那么通過這種方式可以簡(jiǎn)化部署流程。
- 還有一種場(chǎng)景是邊緣部署,可能我們的項(xiàng)目需要在邊緣側(cè)部署,可能部署的數(shù)量也非常多,且是持續(xù)的,那么使用這種方式也可以提升效率,簡(jiǎn)化流程。
到此這篇關(guān)于SpringBoot自動(dòng)初始化數(shù)據(jù)庫的方法分享的文章就介紹到這了,更多相關(guān)SpringBoot初始化數(shù)據(jù)庫內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot優(yōu)雅接收前端請(qǐng)求參數(shù)的詳細(xì)過程
這篇文章主要介紹了SpringBoot如何優(yōu)雅接收前端請(qǐng)求參數(shù),我們可以通過@RequestParm注解去綁定請(qǐng)求中的參數(shù),將(查詢參數(shù)或者form表單數(shù)據(jù))綁定到controller的方法參數(shù)中,本文結(jié)合示例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下2023-06-06Spring自動(dòng)裝配之方法、構(gòu)造器位置的自動(dòng)注入操作
這篇文章主要介紹了Spring自動(dòng)裝配之方法、構(gòu)造器位置的自動(dòng)注入操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08SpringBoot項(xiàng)目從18.18M瘦身到0.18M的實(shí)現(xiàn)
本文主要介紹了SpringBoot項(xiàng)目從18.18M瘦身到0.18M的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01SpringCloud中的Feign服務(wù)間的調(diào)用詳解
這篇文章主要介紹了SpringCloud中的Feign服務(wù)間的調(diào)用詳解,Feign 是一個(gè)聲明式的 REST 客戶端,它能讓 REST 調(diào)用更加簡(jiǎn)單,Feign 供了 HTTP 請(qǐng)求的模板,通過編寫簡(jiǎn)單的接口和插入注解,就可以定義好 HTTP 請(qǐng)求的參數(shù)、格式、地址等信息,需要的朋友可以參考下2024-01-01Spring 單元測(cè)試中如何進(jìn)行 mock的實(shí)現(xiàn)
這篇文章主要介紹了Spring 單元測(cè)試中如何進(jìn)行 mock的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12并行Stream與Spring事務(wù)相遇會(huì)發(fā)生什么?
這篇文章主要介紹了并行Stream與Spring事務(wù)相遇會(huì)發(fā)生什么?文章主要解決實(shí)戰(zhàn)中的Bug及解決方案和技術(shù)延伸,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-05-05簡(jiǎn)單了解如何在spring中使用RabbitMQ
這篇文章主要介紹了簡(jiǎn)單了解如何在spring中使用RabbitMQ,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12