Bagaimana SpringBoot memulakan dan memulakan pelaksanaan skrip sql
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
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; }
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.
spring: datasource: username: root password: liuzhenyu199577 url: jdbc:mysql://localhost:3306/jdbc driver-class-name: com.mysql.cj.jdbc.Driver initialization-mode: always
Mari sahkan dua kaedah ini di bawah
1 Letakkan fail skrip skema atau platform skema secara lalai
CREATE TABLE IF NOT EXISTS department (ID VARCHAR(40) NOT NULL, NAME VARCHAR(100), PRIMARY KEY (ID));
Lihat. Pangkalan data tidak mempunyai jadual jabatan. Seterusnya, kami memulakan program
Selepas memulakan, kami melihat sekali lagi dan melaksanakan
2. Tentukan berbilang skrip sql dalam fail konfigurasi
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
Tiga skrip sql ialah penyata sisipan
INSERT INTO department (ID,NAME) VALUES ('1','2') INSERT INTO department (ID,NAME) VALUES ('2','3') INSERT INTO department (ID,NAME) VALUES ('3','4')
Tiada data dalam jadual sekarang. Seterusnya kita mulakan program
Selepas memulakannya, kita lihat semula dan terdapat tiga keping data dalam jadual
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:spring: datasource: schema: classpath:schema.sql # schema.sql中一般存放的是DDL脚本,即通常为创建或更新库表的脚本 data: classpath:data.sql # data.sql中一般是DML脚本,即通常为数据插入脚本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:
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.sql3 Persekitaran berjalan yang berbeza melaksanakan skrip yang berbezaSecara 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.ymlspring: datasource: schema: classpath:${spring.profiles.active:dev}/schema.sql data: classpath:${spring.profiles.active:dev}/data.sqlNota: ${} 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
spring: profiles: active: dev # dev/sit/prod等。分别对应开发、测试、生产等不同运行环境。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:
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: mysqlPeringatan: 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:-- 当存储过程`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 ('zhangsan', '123456'); end if; end; -- 调用存储过程`p1` call p1(); drop procedure if exists p1;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=$$。然后把脚本改成:
-- 当存储过程`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 ('zhangsan', '123456'); end if; end;$$ -- 调用存储过程`p1` call p1();$$ drop procedure if exists p1;$$
5.3 不足
因为sql脚本的断句分隔符从';'变成'$$',所以可能需要在DDL、DML语句的';'后加'$$',不然可能会出现将整个脚本当成一条sql语句来执行的情况。比如:
-- DDL CREATE TABLE `table_name` ( -- 字段定义 ... ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;$$ -- DML INSERT INTO `table_name` VALUE(...);$$
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!

JVM melaksanakan ciri-ciri Wora Java melalui tafsiran bytecode, API bebas platform dan pemuatan kelas dinamik: 1. Bytecode ditafsirkan sebagai kod mesin untuk memastikan operasi silang platform; 2. Perbezaan sistem operasi abstrak API standard; 3. Kelas dimuatkan secara dinamik pada masa runtime untuk memastikan konsistensi.

Versi terbaru Java berkesan menyelesaikan masalah khusus platform melalui pengoptimuman JVM, penambahbaikan perpustakaan standard dan sokongan perpustakaan pihak ketiga. 1) Pengoptimuman JVM, seperti ZGC Java11 meningkatkan prestasi pengumpulan sampah. 2) Penambahbaikan perpustakaan standard, seperti sistem modul Java9 yang mengurangkan masalah berkaitan platform. 3) Perpustakaan pihak ketiga menyediakan versi yang dioptimumkan platform, seperti OpenCV.

Proses pengesahan bytecode JVM termasuk empat langkah utama: 1) Periksa sama ada format fail kelas mematuhi spesifikasi, 2) mengesahkan kesahihan dan ketepatan arahan bytecode, 3) melakukan analisis aliran data untuk memastikan keselamatan jenis, dan 4) mengimbangi ketelitian dan prestasi pengesahan. Melalui langkah -langkah ini, JVM memastikan bahawa hanya selamat, bytecode yang betul dilaksanakan, dengan itu melindungi integriti dan keselamatan program.

Java'splatformindependenceAllowsApplicationStoranyoperatingsystemwithajvm.1) singlecodebase: writeandcompileonceforallplatforms.2) Easyupdates: UpdateTecodeForsimulteUseUlyDeployment.3)

Kemerdekaan platform Java terus dipertingkatkan melalui teknologi seperti JVM, kompilasi JIT, penyeragaman, generik, ekspresi Lambda dan Projectpanama. Sejak tahun 1990-an, Java telah berkembang dari JVM asas kepada JVM moden berprestasi tinggi, memastikan konsistensi dan kecekapan kod di platform yang berbeza.

Bagaimanakah Java mengurangkan masalah khusus platform? Java melaksanakan platform bebas melalui JVM dan perpustakaan standard. 1) Gunakan bytecode dan JVM untuk abstrak perbezaan sistem operasi; 2) Perpustakaan standard menyediakan API silang platform, seperti laluan fail pemprosesan kelas Paths, dan pengekodan aksara pemprosesan kelas charset; 3) Gunakan fail konfigurasi dan ujian pelbagai platform dalam projek sebenar untuk pengoptimuman dan debugging.

Java'splatformindependenceEnhancesMicroservicesarchitectureByOfferingDeploymentflexability, konsistensi, skalabilitas, andPortability.1) DeploymentflexabilityAllowsMicroserviceStorunonAnanyplatformWithAjvm.2) ConsistencyAcsServicSservicesSimpliesDevelanDanDevelan

GraalVM meningkatkan kemerdekaan platform Java dalam tiga cara: 1. 2. Persekitaran Runtime Bebas, menyusun program Java ke dalam fail boleh laku tempatan melalui GraalvmnativeImage; 3. Pengoptimuman Prestasi, Graal Compiler menjana kod mesin yang cekap untuk meningkatkan prestasi dan konsistensi program Java.


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

SecLists
SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Dreamweaver Mac版
Alat pembangunan web visual
