Jadual Kandungan
SpringBoot bermula dan memulakan pelaksanaan skrip sql
Mari kita lihat kod sumber dahulu
Mari sahkan dua kaedah ini di bawah
Projek SpringBoot melaksanakan fail sql yang ditentukan semasa permulaan
1 🎜>
Rumah Java javaTutorial Bagaimana SpringBoot memulakan dan memulakan pelaksanaan skrip sql

Bagaimana SpringBoot memulakan dan memulakan pelaksanaan skrip sql

May 13, 2023 am 10:58 AM
sql springboot

    SpringBoot bermula dan memulakan pelaksanaan skrip sql

    Bagaimana jika kita mahu melaksanakan beberapa skrip sql apabila projek bermula, SpringBoot menyediakan kita dengan ini fungsi, anda boleh melaksanakan skrip apabila memulakan projek SpringBoot Mari kita lihat.

    Mari kita lihat kod sumber dahulu

    Bagaimana SpringBoot memulakan dan memulakan pelaksanaan skrip sql

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    boolean createSchema() {

        //会从application.properties或application.yml中获取sql脚本列表

        List<Resource> scripts = this.getScripts("spring.datasource.schema", this.properties.getSchema(), "schema");

        if (!scripts.isEmpty()) {

            if (!this.isEnabled()) {

                logger.debug("Initialization disabled (not running DDL scripts)");

                return false;

            }

     

            String username = this.properties.getSchemaUsername();

            String password = this.properties.getSchemaPassword();

            //运行sql脚本

            this.runScripts(scripts, username, password);

        }

        return !scripts.isEmpty();

    }

    private List<Resource> getScripts(String propertyName, List<String> resources, String fallback) {

        if (resources != null) {

            //如果配置文件中配置,则加载配置文件

            return this.getResources(propertyName, resources, true);

        } else {

            //指定schema要使用的Platform(mysql、oracle),默认为all

            String platform = this.properties.getPlatform();

            List<String> fallbackResources = new ArrayList();

            //如果配置文件中没配置,则会去类路径下找名称为schema或schema-platform的文件

            fallbackResources.add("classpath*:" + fallback + "-" + platform + ".sql");

            fallbackResources.add("classpath*:" + fallback + ".sql");

            return this.getResources(propertyName, fallbackResources, false);

        }

    }

    private List<Resource> getResources(String propertyName, List<String> locations, boolean validate) {

        List<Resource> resources = new ArrayList();

        Iterator var5 = locations.iterator();

     

        while(var5.hasNext()) {

            String location = (String)var5.next();

            Resource[] var7 = this.doGetResources(location);

            int var8 = var7.length;

     

            for(int var9 = 0; var9 < var8; ++var9) {

                Resource resource = var7[var9];

                //验证文件是否存在

                if (resource.exists()) {

                    resources.add(resource);

                } else if (validate) {

                    throw new InvalidConfigurationPropertyValueException(propertyName, resource, "The specified resource does not exist.");

                }

            }

        }

        return resources;

    }

    Salin selepas log masuk

    Daripada kod sumber, secara kasar kita tahu maksudnya SpringBoot akan mencari fail skrip laluan kelas secara lalai, tetapi Hanya fail skrip dengan nama skema atau platform skema yang ditentukan boleh diletakkan di bawah laluan kelas Jika kita ingin membahagikan berbilang fail skrip, maka kaedah ini tidak sesuai, maka kita perlu menambahnya application.properties atau application.yml Pergi ke senarai skrip konfigurasi Bolehkah operasi skrip permulaan ini dikawal dalam fail konfigurasi Ya, terdapat atribut mod permulaan, yang boleh ditetapkan kepada tiga nilai sentiasa dilakukan , dan terbenam hanya memulakan pangkalan data memori (nilai lalai), seperti h3, dsb., tidak sekali-kali bermakna tiada permulaan dilakukan.

    1

    2

    3

    4

    5

    6

    7

    spring:

      datasource:

        username: root

        password: liuzhenyu199577

        url: jdbc:mysql://localhost:3306/jdbc

        driver-class-name: com.mysql.cj.jdbc.Driver

        initialization-mode: always

    Salin selepas log masuk

    Mari sahkan dua kaedah ini di bawah

    1 Letakkan fail skrip skema atau platform skema secara lalai

    Bagaimana SpringBoot memulakan dan memulakan pelaksanaan skrip sql

    1

    CREATE TABLE IF NOT EXISTS department (ID VARCHAR(40) NOT NULL, NAME VARCHAR(100), PRIMARY KEY (ID));

    Salin selepas log masuk

    Lihat. Pangkalan data tidak mempunyai jadual jabatan. Seterusnya, kami memulakan program

    Bagaimana SpringBoot memulakan dan memulakan pelaksanaan skrip sql

    Selepas memulakan, kami melihat sekali lagi dan melaksanakan

    Bagaimana SpringBoot memulakan dan memulakan pelaksanaan skrip sql

    2. Tentukan berbilang skrip sql dalam fail konfigurasi

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    spring:

      datasource:

        username: root

        password: liuzhenyu199577

        url: jdbc:mysql://localhost:3306/jdbc

        driver-class-name: com.mysql.cj.jdbc.Driver

        initialization-mode: always

        schema:

          - classpath:department.sql

          - classpath:department2.sql

          - classpath:department3.sql

    Salin selepas log masuk

    Bagaimana SpringBoot memulakan dan memulakan pelaksanaan skrip sql

    Tiga skrip sql ialah penyata sisipan

    1

    2

    3

    INSERT INTO department (ID,NAME) VALUES (&#39;1&#39;,&#39;2&#39;)

    INSERT INTO department (ID,NAME) VALUES (&#39;2&#39;,&#39;3&#39;)

    INSERT INTO department (ID,NAME) VALUES (&#39;3&#39;,&#39;4&#39;)

    Salin selepas log masuk

    Tiada data dalam jadual sekarang. Seterusnya kita mulakan program

    Bagaimana SpringBoot memulakan dan memulakan pelaksanaan skrip sql

    Selepas memulakannya, kita lihat semula dan terdapat tiga keping data dalam jadual

    Bagaimana SpringBoot memulakan dan memulakan pelaksanaan skrip sql

    Ia adalah langkah untuk SpringBoot memulakan dan memulakan skrip sql

    Projek SpringBoot melaksanakan fail sql yang ditentukan semasa permulaan

    1 🎜>

    Apabila projek dimulakan, laksanakan fail yang ditentukan dahulu Apabila anda memerlukan pernyataan SQL, anda boleh menambah fail SQL yang perlu dilaksanakan dalam folder sumber Pernyataan SQL dalam fail boleh menjadi skrip DDL atau DML skrip, dan kemudian tambahkan konfigurasi yang sepadan pada konfigurasi, seperti berikut:

    1

    2

    3

    spring:

      datasource:

        schema: classpath:schema.sql # schema.sql中一般存放的是DDL脚本,即通常为创建或更新库表的脚本 data: classpath:data.sql # data.sql中一般是DML脚本,即通常为数据插入脚本

    Salin selepas log masuk

    2 Jalankan berbilang fail sql

    Kedua-dua spring.datasource.schema dan spring.datasource.data menyokong menerima senarai. , jadi apabila anda perlu melaksanakan berbilang fail sql, anda boleh menggunakan konfigurasi berikut:

    1

    2

    3

    spring:

      datasource:

        schema: classpath:schema_1.sql, classpath:schema_2.sql data: classpath:data_1.sql, classpath:data_2.sql 或 spring: datasource: schema: - classpath:schema_1.sql - classpath:schema_2.sql data: - classpath:data_1.sql - classpath:data_2.sql

    Salin selepas log masuk

    3 Persekitaran berjalan yang berbeza melaksanakan skrip yang berbeza

    Secara amnya, terdapat berbilang persekitaran berjalan, seperti pembangunan. , ujian, pengeluaran, dsb. SQL yang biasanya perlu dilaksanakan dalam persekitaran operasi yang berbeza akan berbeza. Untuk menyelesaikan masalah ini, kad bebas boleh digunakan.

    Buat folder untuk persekitaran yang berbeza

    Buat folder yang sepadan dengan persekitaran berbeza dalam folder sumber, seperti dev/, sit/, prod/.

    Konfigurasi

    application.yml

    1

    2

    3

    4

    spring:

      datasource:

        schema: classpath:${spring.profiles.active:dev}/schema.sql

        data: classpath:${spring.profiles.active:dev}/data.sql

    Salin selepas log masuk

    Nota: ${} wildcard menyokong nilai lalai. Contohnya, ${spring.profiles.active:dev} dalam konfigurasi di atas, sebelum koma bertitik adalah untuk mengambil nilai atribut spring.profiles.active, dan apabila nilai atribut tidak wujud, nilai selepas koma bertitik digunakan, iaitu dev.

    bootstrap.yml

    1

    2

    3

    spring:

      profiles:

        active: dev # dev/sit/prod等。分别对应开发、测试、生产等不同运行环境。

    Salin selepas log masuk

    Peringatan: Sifat spring.profiles.active biasanya dikonfigurasikan dalam bootstrap.yml atau bootstrap.properties.

    4. Menyokong pangkalan data yang berbeza

    Oleh kerana sintaks pangkalan data yang berbeza adalah berbeza, untuk mencapai fungsi yang sama, pernyataan SQL bagi pangkalan data yang berbeza mungkin berbeza, jadi mungkin terdapat berbilang salinan sql fail. Apabila anda perlu menyokong pangkalan data yang berbeza, anda boleh menggunakan konfigurasi berikut:

    1

    2

    3

    4

    5

    spring:

      datasource:

        schema: classpath:${spring.profiles.active:dev}/schema-${spring.datasource.platform}.sql

        data: classpath:${spring.profiles.active:dev}/data-${spring.datasource.platform}.sql

        platform: mysql

    Salin selepas log masuk

    Peringatan: Nilai lalai atribut platform ialah 'semua', jadi hanya gunakan konfigurasi di atas apabila bertukar antara pangkalan data yang berbeza, kerana nilai lalai Dalam kes ini, but spring secara automatik akan mengesan pangkalan data yang sedang digunakan.

    Nota: Pada masa ini, mengambil persekitaran yang dibenarkan dev sebagai contoh, fail berikut mesti wujud dalam folder sumber/dev/: schema-mysql.sql dan data-mysql.sql.

    5. Elakkan Perangkap

    5.1 Perangkap

    Apabila terdapat prosedur atau fungsi yang disimpan dalam fail sql yang dilaksanakan, ralat akan dilaporkan semasa memulakan projek itu.

    Sebagai contoh, terdapat keperluan sekarang: apabila projek bermula, imbas jadual tertentu Apabila bilangan rekod dalam jadual ialah 0, masukkan berbilang rekod apabila lebih daripada 0, langkaunya.

    Skrip fail schema.sql adalah seperti berikut:

    1

    2

    3

    4

    5

    6

    -- 当存储过程`p1`存在时,删除。

    drop procedure if exists p1;

      

    -- 创建存储过程`p1`

    create procedure p1()

    begin declare row_num int; select count(*) into row_num from `t_user`; if row_num = 0 then INSERT INTO `t_user`(`username`, `password`) VALUES (&#39;zhangsan&#39;, &#39;123456&#39;); end if; end; -- 调用存储过程`p1` call p1(); drop procedure if exists p1;

    Salin selepas log masuk

    Mulakan projek dan laporkan ralat atas sebab berikut:

    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'create procedure p1() begin declare row_num int' at line 1

    大致的意思是:'create procedure p1() begin declare row_num int'这一句出现语法错误。刚看到这一句,我一开始是懵逼的,吓得我赶紧去比对mysql存储过程的写法,对了好久都发现没错,最后看到一篇讲解spring boot配置启动时执行sql脚本的文章,发现其中多了一项配置:spring.datasource.separator=$$。然后看源码发现,spring boot在解析sql脚本时,默认是以';'作为断句的分隔符的。看到这里,不难看出报错的原因,即:spring boot把'create procedure p1() begin declare row_num int'当成是一条普通的sql语句。而我们需要的是创建一个存储过程。

    5.2 解决方案

    修改sql脚本的断句分隔符。如:spring.datasource.separator=$$。然后把脚本改成:

    1

    2

    3

    4

    5

    6

    -- 当存储过程`p1`存在时,删除。

    drop procedure if exists p1;$$

      

    -- 创建存储过程`p1`

    create procedure p1()

    begin declare row_num int; select count(*) into row_num from `t_user`; if row_num = 0 then INSERT INTO `t_user`(`username`, `password`) VALUES (&#39;zhangsan&#39;, &#39;123456&#39;); end if; end;$$ -- 调用存储过程`p1` call p1();$$ drop procedure if exists p1;$$

    Salin selepas log masuk

    5.3 不足

    因为sql脚本的断句分隔符从';'变成'$$',所以可能需要在DDL、DML语句的';'后加'$$',不然可能会出现将整个脚本当成一条sql语句来执行的情况。比如:

    1

    2

    3

    4

    5

    6

    7

    8

    -- DDL

    CREATE TABLE `table_name` (

      -- 字段定义

      ...

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;$$

      

    -- DML

    INSERT INTO `table_name` VALUE(...);$$

    Salin selepas log masuk

    Atas ialah kandungan terperinci Bagaimana SpringBoot memulakan dan memulakan pelaksanaan skrip sql. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan Laman Web ini
    Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

    Alat AI Hot

    Undresser.AI Undress

    Undresser.AI Undress

    Apl berkuasa AI untuk mencipta foto bogel yang realistik

    AI Clothes Remover

    AI Clothes Remover

    Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

    Undress AI Tool

    Undress AI Tool

    Gambar buka pakaian secara percuma

    Clothoff.io

    Clothoff.io

    Penyingkiran pakaian AI

    AI Hentai Generator

    AI Hentai Generator

    Menjana ai hentai secara percuma.

    Artikel Panas

    Repo: Cara menghidupkan semula rakan sepasukan
    1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
    2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
    Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
    4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

    Alat panas

    Notepad++7.3.1

    Notepad++7.3.1

    Editor kod yang mudah digunakan dan percuma

    SublimeText3 versi Cina

    SublimeText3 versi Cina

    Versi Cina, sangat mudah digunakan

    Hantar Studio 13.0.1

    Hantar Studio 13.0.1

    Persekitaran pembangunan bersepadu PHP yang berkuasa

    Dreamweaver CS6

    Dreamweaver CS6

    Alat pembangunan web visual

    SublimeText3 versi Mac

    SublimeText3 versi Mac

    Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

    Apakah perbezaan antara HQL dan SQL dalam rangka kerja Hibernate? Apakah perbezaan antara HQL dan SQL dalam rangka kerja Hibernate? Apr 17, 2024 pm 02:57 PM

    HQL dan SQL dibandingkan dalam rangka kerja Hibernate: HQL (1. Sintaks berorientasikan objek, 2. Pertanyaan bebas pangkalan data, 3. Keselamatan jenis), manakala SQL mengendalikan pangkalan data secara langsung (1. Piawaian bebas pangkalan data, 2. Boleh laku kompleks pertanyaan dan manipulasi data).

    Penggunaan operasi bahagian dalam Oracle SQL Penggunaan operasi bahagian dalam Oracle SQL Mar 10, 2024 pm 03:06 PM

    "Penggunaan Operasi Bahagian dalam OracleSQL" Dalam OracleSQL, operasi bahagi ialah salah satu operasi matematik yang biasa. Semasa pertanyaan dan pemprosesan data, operasi pembahagian boleh membantu kami mengira nisbah antara medan atau memperoleh hubungan logik antara nilai tertentu. Artikel ini akan memperkenalkan penggunaan operasi pembahagian dalam OracleSQL dan memberikan contoh kod khusus. 1. Dua cara operasi bahagi dalam OracleSQL Dalam OracleSQL, operasi bahagi boleh dilakukan dalam dua cara berbeza.

    Perbandingan dan perbezaan sintaks SQL antara Oracle dan DB2 Perbandingan dan perbezaan sintaks SQL antara Oracle dan DB2 Mar 11, 2024 pm 12:09 PM

    Oracle dan DB2 ialah dua sistem pengurusan pangkalan data hubungan yang biasa digunakan, setiap satunya mempunyai sintaks dan ciri SQL tersendiri. Artikel ini akan membandingkan dan membezakan antara sintaks SQL Oracle dan DB2, dan memberikan contoh kod khusus. Sambungan pangkalan data Dalam Oracle, gunakan pernyataan berikut untuk menyambung ke pangkalan data: CONNECTusername/password@database Dalam DB2, pernyataan untuk menyambung ke pangkalan data adalah seperti berikut: CONNECTTOdataba

    Apakah yang dimaksudkan dengan atribut identiti dalam SQL? Apakah yang dimaksudkan dengan atribut identiti dalam SQL? Feb 19, 2024 am 11:24 AM

    Apakah Identity dalam SQL? Contoh kod khusus diperlukan Dalam SQL, Identity ialah jenis data khas yang digunakan untuk menjana nombor penambahan automatik. Ia sering digunakan untuk mengenal pasti setiap baris data dalam jadual. Lajur Identiti sering digunakan bersama dengan lajur kunci utama untuk memastikan setiap rekod mempunyai pengecam unik. Artikel ini akan memperincikan cara menggunakan Identiti dan beberapa contoh kod praktikal. Cara asas untuk menggunakan Identity ialah menggunakan Identit semasa membuat jadual.

    Penjelasan terperinci tentang fungsi Set tag dalam teg SQL dinamik MyBatis Penjelasan terperinci tentang fungsi Set tag dalam teg SQL dinamik MyBatis Feb 26, 2024 pm 07:48 PM

    Tafsiran teg SQL dinamik MyBatis: Penjelasan terperinci tentang penggunaan teg Set MyBatis ialah rangka kerja lapisan kegigihan yang sangat baik Ia menyediakan banyak teg SQL dinamik dan boleh membina pernyataan operasi pangkalan data secara fleksibel. Antaranya, tag Set ialah tag yang digunakan untuk menjana klausa SET dalam kenyataan UPDATE, yang sangat biasa digunakan dalam operasi kemas kini. Artikel ini akan menerangkan secara terperinci penggunaan teg Set dalam MyBatis dan menunjukkan kefungsiannya melalui contoh kod tertentu. Apakah itu Set tag Set tag digunakan dalam MyBati

    Analisis perbandingan dan perbezaan antara SpringBoot dan SpringMVC Analisis perbandingan dan perbezaan antara SpringBoot dan SpringMVC Dec 29, 2023 am 11:02 AM

    SpringBoot dan SpringMVC adalah kedua-dua rangka kerja yang biasa digunakan dalam pembangunan Java, tetapi terdapat beberapa perbezaan yang jelas antara mereka. Artikel ini akan meneroka ciri dan penggunaan kedua-dua rangka kerja ini dan membandingkan perbezaannya. Mula-mula, mari belajar tentang SpringBoot. SpringBoot telah dibangunkan oleh pasukan Pivotal untuk memudahkan penciptaan dan penggunaan aplikasi berdasarkan rangka kerja Spring. Ia menyediakan cara yang pantas dan ringan untuk membina bersendirian, boleh dilaksanakan

    Bagaimana untuk menyelesaikan ralat 5120 dalam SQL Bagaimana untuk menyelesaikan ralat 5120 dalam SQL Mar 06, 2024 pm 04:33 PM

    Penyelesaian: 1. Semak sama ada pengguna log masuk mempunyai kebenaran yang mencukupi untuk mengakses atau mengendalikan pangkalan data, dan pastikan pengguna mempunyai kebenaran yang betul 2. Semak sama ada akaun perkhidmatan SQL Server mempunyai kebenaran untuk mengakses fail yang ditentukan atau folder, dan pastikan akaun Mempunyai kebenaran yang mencukupi untuk membaca dan menulis fail atau folder 3. Semak sama ada fail pangkalan data yang ditentukan telah dibuka atau dikunci oleh proses lain, cuba tutup atau lepaskan fail, dan jalankan semula pertanyaan 4 . Cuba sebagai pentadbir Jalankan Studio Pengurusan seperti dsb.

    Bagaimana untuk menggunakan pernyataan SQL untuk pengagregatan data dan statistik dalam MySQL? Bagaimana untuk menggunakan pernyataan SQL untuk pengagregatan data dan statistik dalam MySQL? Dec 17, 2023 am 08:41 AM

    Bagaimana untuk menggunakan pernyataan SQL untuk pengagregatan data dan statistik dalam MySQL? Pengumpulan data dan statistik merupakan langkah yang sangat penting semasa melakukan analisis dan statistik data. Sebagai sistem pengurusan pangkalan data perhubungan yang berkuasa, MySQL menyediakan pelbagai fungsi pengagregatan dan statistik, yang boleh melaksanakan pengagregatan data dan operasi statistik dengan mudah. Artikel ini akan memperkenalkan kaedah menggunakan pernyataan SQL untuk melaksanakan pengagregatan data dan statistik dalam MySQL, dan menyediakan contoh kod khusus. 1. Gunakan fungsi COUNT untuk mengira Fungsi COUNT adalah yang paling biasa digunakan

    See all articles