最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot數(shù)據(jù)庫初始化datasource配置方式

 更新時間:2022年12月22日 11:53:52   作者:一灰灰  
這篇文章主要為大家介紹了SpringBoot數(shù)據(jù)庫初始化datasource配置方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

I. 項目搭建

在我們的日常業(yè)務開發(fā)過程中,如果有db的相關操作,通常我們是直接建立好對應的庫表結構,并初始化對應的數(shù)據(jù),即更常見的情況下是我們在已有表結構基礎之下,進行開發(fā);

但是當我們是以項目形式工作時,更常見的做法是所有的庫表結構變更、數(shù)據(jù)的初始、更新等都需要持有對應的sql變更,并保存在項目工程中,這也是使用liqubase的一個重要場景;

將上面的問題進行簡單的翻譯一下,就是如何實現(xiàn)在項目啟動之后執(zhí)行相應的sql,實現(xiàn)數(shù)據(jù)庫表的初始化?

本文將作為初始化方式的第一篇:基于SpringBoot的配置方式實現(xiàn)的數(shù)據(jù)初始化

1. 依賴

首先搭建一個標準的SpringBoot項目工程,相關版本以及依賴如下

本項目借助SpringBoot 2.2.1.RELEASE + maven 3.5.3 + IDEA進行開發(fā)

開一個web服務用于測試

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
</dependencies>

本文使用MySql數(shù)據(jù)庫, 版本8.0.31

2. 配置

注意實現(xiàn)初始化數(shù)據(jù)庫表操作的核心配置就在下面,重點關注

配置文件: resources/application.yml

# 默認的數(shù)據(jù)庫名
database:
  name: story
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/${database.name}?useUnicode=true&amp;characterEncoding=UTF-8&amp;useSSL=false&amp;serverTimezone=Asia/Shanghai
    username: root
    password:
    initialization-mode: always
    platform: mysql
    separator: ;
    data: classpath:config-data.sql
    #data-username: root
    #data-password:
    schema: classpath:config-schema.sql # schema必須也存在,若只存在data,data中的sql也不會被執(zhí)行
# springboot 2.5+ 版本使用下面這個
#  sql:
#    init:
#      mode: always
#      data-location: classpath:config-data.sql
#      schema-location: classpath:init-schema.sql
logging:
  level:
    root: info
    org:
      springframework:
        jdbc:
          core: debug

上面的配置中,相比較于普通的數(shù)據(jù)庫鏈接配置,多了幾個配置項

  • spring.datasource.initialization-mode: 取值為 always,改成其他的會導致sql不會被執(zhí)行
  • spring.datasource.platform: mysql
  • spring.datasource.seprator: ; 這個表示sql之間的分隔符
  • spring.datasource.data: classpath:config-data.sql 取值可以是數(shù)組,這里存的是初始化數(shù)據(jù)的sql文件地址
  • spring.datasource.data-username: 上面data對應的sql文件執(zhí)行用戶名
  • spring.datasource.data-password: 上面data對應的sql文件執(zhí)行用戶密碼
  • spring.datasource.schema: classpath:config-schema.sql 取值也可以是數(shù)組,這里存的是初始化表結構的sql文件地址

3. 初始化sql

上面指定了兩個sql,一個是用于建表的ddl,一個是用于初始化數(shù)據(jù)的dml

resources/config-schema.sql 文件對應的內(nèi)容如下

CREATE TABLE `user2`
(
    `id`               int unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
    `third_account_id` varchar(128) NOT NULL DEFAULT '' COMMENT '第三方用戶ID',
    `user_name`        varchar(64)  NOT NULL DEFAULT '' COMMENT '用戶名',
    `password`         varchar(128) NOT NULL DEFAULT '' COMMENT '密碼',
    `login_type`       tinyint      NOT NULL DEFAULT '0' COMMENT '登錄方式: 0-微信登錄,1-賬號密碼登錄',
    `deleted`          tinyint      NOT NULL DEFAULT '0' COMMENT '是否刪除',
    `create_time`      timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間',
    `update_time`      timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新時間',
    PRIMARY KEY (`id`),
    KEY                `key_third_account_id` (`third_account_id`),
    KEY                `user_name` (`user_name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4  COMMENT='用戶登錄表';

resources/config-data.sql 文件對應的內(nèi)容如下

INSERT INTO `user2` (id, third_account_id, `user_name`, `password`, login_type, deleted)
VALUES (2, '222222-0f85-4dd5-845c-7c5df3746e92', 'admin2', 'admin2', 0, 0);

II. 示例

1. 驗證demo

接下來上面的工作準備完畢之后,在我們啟動項目之后,正常就會執(zhí)行上面的兩個sql,我們寫一個簡單的驗證demo

@Slf4j
@SpringBootApplication
public class Application implements ApplicationRunner {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }
    @Override
    public void run(ApplicationArguments args) throws Exception {
        List list = jdbcTemplate.queryForList("select * from user2 limit 2");
        log.info("啟動成功,初始化數(shù)據(jù): {}\n{}", list.size(), list);
    }
}

00.jpg

2. 問題記錄

從上面的過程走下來,看起來很簡單,但是在實際的使用過程中,很容易遇到不生效的問題,下面記錄一下

2.1 只有初始化數(shù)據(jù)data.sql,沒有schema.sql時,不生效

當庫表已經(jīng)存在時,此時我們可能并沒有上文中的config-schema.sql文件,此時對應的配置可能是

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/${database.name}?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password:
    initialization-mode: always
    platform: mysql
    separator: ; # 默認為 ;
    data: classpath:config-data.sql
    #data-username: root
    #data-password:
    #schema: classpath:config-schema.sql # schema必須也存在,若只存在data,data中的sql也不會被執(zhí)行

如上面所示,當我們只指定了data時,會發(fā)現(xiàn)data對應的sql文件也不會被執(zhí)行;即要求schema對應的sql文件也必須同時存在

針對上面這種情況,可以考慮將data.sql中的語句,卸載schema.sql中

2.2 版本問題導致配置不生效

在SpringBoot2.5+版本,使用 spring.sql.init 代替上面的配置項

# springboot 2.5+ 版本使用下面這個
spring:
  sql:
    init:
      mode: always
      data-location: classpath:config-data.sql
      schema-location: classpath:init-schema.sql

相關的配置參數(shù)說明如下

  • spring.sql.init.enabled:是否啟動初始化的開關,默認是true。如果不想執(zhí)行初始化腳本,設置為false即可。通過-D的命令行參數(shù)會更容易控制。
  • spring.sql.init.usernamespring.sql.init.password:配置執(zhí)行初始化腳本的用戶名與密碼。這個非常有必要,因為安全管理要求,通常給業(yè)務應用分配的用戶對一些建表刪表等命令沒有權限。這樣就可以與datasource中的用戶分開管理。
  • spring.sql.init.schema-locations:配置與schema變更相關的sql腳本,可配置多個(默認用;分割)
  • spring.sql.init.data-locations:用來配置與數(shù)據(jù)相關的sql腳本,可配置多個(默認用;分割)
  • spring.sql.init.encoding:配置腳本文件的編碼
  • spring.sql.init.separator:配置多個sql文件的分隔符,默認是;
  • spring.sql.init.continue-on-error:如果執(zhí)行腳本過程中碰到錯誤是否繼續(xù),默認是false`

2.3 mode配置不對導致不生效

當配置完之后發(fā),發(fā)現(xiàn)sql沒有按照預期的執(zhí)行,可以檢查一下spring.datasource.initialization-mode配置是否存在,且值為always

2.4 重復啟動之后,報錯

同樣上面的項目,在第一次啟動時,會執(zhí)行schema對應的sql文件,創(chuàng)建表結構;執(zhí)行data對應的sql文件,初始化數(shù)據(jù);但是再次執(zhí)行之后就會報錯了,會提示表已經(jīng)存在

即初始化是一次性的,第一次執(zhí)行完畢之后,請將spring.datasource.initialization-mode設置為none

小結

本文主要介紹了項目啟動時,數(shù)據(jù)庫的初始化方式,當然除了本文中介紹的spring.datasource配置之外,還有spring.jpa的配置方式

對于配置方式不太友好的地方則在于不好自適應控制,若表存在則不執(zhí)行;若不存在則執(zhí)行;后面將介紹如何使用DataSourceInitializer來實現(xiàn)自主可控的數(shù)據(jù)初始化,以及更現(xiàn)代化一些的基于liquibase的數(shù)據(jù)庫版本管理記錄

以上就是SpringBoot數(shù)據(jù)庫初始化datasource配置方式的詳細內(nèi)容,更多關于SpringBoot datasource配置的資料請關注腳本之家其它相關文章!

相關文章

  • Java操作Mysql的方法

    Java操作Mysql的方法

    這篇文章主要介紹了Java操作Mysql的方法,實例分析了Java針對有返回結果和沒有返回結果的sql操作的相關技巧,需要的朋友可以參考下
    2015-02-02
  • Java was started but returned exit code=13問題解決案例詳解

    Java was started but returned exit code=13問題解決案例詳解

    這篇文章主要介紹了Java was started but returned exit code=13問題解決案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • shell腳本運行java程序jar的方法

    shell腳本運行java程序jar的方法

    本篇文章主要介紹了shell腳本運行java程序jar的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • SpringBoot利用validation實現(xiàn)優(yōu)雅的校驗參數(shù)

    SpringBoot利用validation實現(xiàn)優(yōu)雅的校驗參數(shù)

    數(shù)據(jù)的校驗是交互式網(wǎng)站一個不可或缺的功能,如果數(shù)據(jù)庫中出現(xiàn)一個非法的郵箱格式,會讓運維人員頭疼不已。本文將介紹如何利用validation來對數(shù)據(jù)進行校驗,感興趣的可以跟隨小編一起學習一下
    2022-06-06
  • Java String.replace()方法

    Java String.replace()方法"無效"的原因及解決方式

    這篇文章主要介紹了Java String.replace()方法"無效"的原因及解決方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Java的long和bigint長度對比詳解

    Java的long和bigint長度對比詳解

    在本文中小編給大家分享了關于Java的long和bigint長度比較的知識點內(nèi)容,有興趣的朋友們學習參考下。
    2019-07-07
  • 詳解Java目錄操作與文件操作教程

    詳解Java目錄操作與文件操作教程

    本章具體介紹了目錄操作、文件操作的基本使用方法和常用函數(shù),圖解穿插代碼實現(xiàn),感興趣的朋友來看看吧
    2022-03-03
  • Spring聲明式事務和@Aspect的攔截順序問題的解決

    Spring聲明式事務和@Aspect的攔截順序問題的解決

    本篇文章主要介紹了Spring聲明式事務和@Aspect的攔截順序問題的解決,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Java自定義過濾器和攔截器實現(xiàn)ThreadLocal線程封閉

    Java自定義過濾器和攔截器實現(xiàn)ThreadLocal線程封閉

    本文主要介紹了Java自定義過濾器和攔截器實現(xiàn)ThreadLocal線程封閉,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • java 中多線程生產(chǎn)者消費者問題詳細介紹

    java 中多線程生產(chǎn)者消費者問題詳細介紹

    這篇文章主要介紹了java 中多線程生產(chǎn)者消費者問題詳細介紹的相關資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09

最新評論

平塘县| 白朗县| 兖州市| 文水县| 阜南县| 龙里县| 海丰县| 尚义县| 贡觉县| 南召县| 通州区| 遵义县| 焦作市| 舟曲县| 错那县| 崇义县| 通河县| 兴安县| 金溪县| 元谋县| 五寨县| 芜湖市| 新密市| 阜南县| 海门市| 德安县| 繁昌县| 抚远县| 河间市| 永康市| 长汀县| 桓仁| 扎赉特旗| 南部县| 古浪县| 陇南市| 庆阳市| 高青县| 尚志市| 盐边县| 湖口县|