电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

springboot 啟動(dòng)時(shí)初始化數(shù)據(jù)庫的步驟

瀏覽:10日期:2023-03-31 11:45:32
問題描述

在spring-boot啟動(dòng)時(shí),希望能執(zhí)行相應(yīng)的sql文件來初始化數(shù)據(jù)庫。

使用配置文件初始化數(shù)據(jù)庫

可以在spring-boot的配置文件application.yml中設(shè)置要初始化的sql文件。這是最簡單的方法,只需要添加屬性就可以實(shí)現(xiàn)。

首先設(shè)置spring.datasource.initialization-mode=always表示任何類型數(shù)據(jù)庫都進(jìn)行數(shù)據(jù)庫初始化,默認(rèn)情況下,spring-boot會(huì)自動(dòng)加載data.sql或data-${platform}.sql文件來初始化數(shù)據(jù)庫。可以通過設(shè)置不同的數(shù)據(jù)庫平臺(tái)來改變啟動(dòng)的腳本名稱。

例如設(shè)置spring.datasource.platform=mysql,就會(huì)加載data-mysql.sql的數(shù)據(jù)庫腳本。把數(shù)據(jù)庫腳本文件放在resources路徑下即可。

如果項(xiàng)目使用的是flyway管理數(shù)據(jù)庫的話,可以直接在flyway路徑下添加一個(gè)新版本的sql文件,flyway也會(huì)自動(dòng)執(zhí)行sql文件并記錄版本信息。

通過代碼初始化數(shù)據(jù)庫

如果通過配置文件不能滿足需求,可以通過代碼來初始化數(shù)據(jù)庫。只需要提供DataSourceInitializer這個(gè)bean,spring-boot啟動(dòng)時(shí)就會(huì)根據(jù)DataSourceInitializer來初始化數(shù)據(jù)庫了。

@Beanpublic DataSourceInitializer dataSourceInitializer(final DataSource dataSource) { ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator(); resourceDatabasePopulator.addScript(new ClassPathResource('/data.sql')); DataSourceInitializer dataSourceInitializer = new DataSourceInitializer(); dataSourceInitializer.setDataSource(dataSource); dataSourceInitializer.setDatabasePopulator(resourceDatabasePopulator); return dataSourceInitializer;}

在此基礎(chǔ)上,我們可以自定義注解,通過獲取注解上的sql文件路徑,來達(dá)到通過注解初始化數(shù)據(jù)庫目的,這樣更方便簡潔。首先定義注解InitDataSource:

/** * 用于補(bǔ)充:Hibernate無法自動(dòng)創(chuàng)建視圖的缺陷。 * 系統(tǒng)啟動(dòng)時(shí)(hibernate根據(jù)entity創(chuàng)建完基本的數(shù)據(jù)表后),開始執(zhí)行本注解下的sql文件中的SQL語言。 * 使用方法: * @InitDataSource('sql文件路徑(相對(duì)于resources路徑下)') ---- 注解到對(duì)應(yīng)的類上 * 比如:@InitDataSource('db/view/createView.sql)') * 使用示例請(qǐng)參見:ResourceApplication.java * 預(yù)了解詳細(xì)的實(shí)現(xiàn)過程請(qǐng)參考:WebConfig.java 的 dataSourceInitializer方法 * @author huangtingxiang */@Target({ElementType.TYPE}) // 該注解用于類上 @Retention(RetentionPolicy.RUNTIME) // 在運(yùn)行時(shí)起作用 @Component public @interface InitDataSource { String[] value(); }

然后通過ClassPathScanningCandidateComponentProvider這個(gè)類來掃描spring組件上InitDataSource注解的值,將值取出,添加到DataSourceInitializer的初始化腳本中:

@Bean public DataSourceInitializer dataSourceInitializer(final DataSource dataSource) { ResourceDatabasePopulator resourceDatabasePopulator = new ResourceDatabasePopulator(); // 掃描com.mengyunzhi.measurement 包 找到InitDataSource注解的類(注解需使用到實(shí)現(xiàn)類上) ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false); provider.addIncludeFilter(new AnnotationTypeFilter(InitDataSource.class)); //添加包含的過濾信息 for (BeanDefinition beanDef : provider.findCandidateComponents('com.mengyunzhi.measurement')) { Class<?> cl = null; try { cl = Class.forName(beanDef.getBeanClassName()); InitDataSource initDataSource = cl.getAnnotation(InitDataSource.class); String[] sqlFiles = initDataSource.value(); for (String sql: sqlFiles) { // 如果sql文件存在 加入數(shù)據(jù)庫初始化中 否則拋出異常終止執(zhí)行 ClassPathResource resource = new ClassPathResource('/' + sql); if (resource.exists()) { resourceDatabasePopulator.addScript(resource); } else { throw new DataSourceInitializerException('未找到資源文件:' + sql, cl); } } } catch (ClassNotFoundException e) { e.printStackTrace(); } } DataSourceInitializer dataSourceInitializer = new DataSourceInitializer(); dataSourceInitializer.setDataSource(dataSource); dataSourceInitializer.setDatabasePopulator(resourceDatabasePopulator); return dataSourceInitializer; }

這樣一來,只需要在spring-boot類上使用@InitDataSource({'data.sql'})注解,就可以自動(dòng)進(jìn)行數(shù)據(jù)庫的初始化操作了。

以上就是springboot 啟動(dòng)時(shí)初始化數(shù)據(jù)庫的步驟的詳細(xì)內(nèi)容,更多關(guān)于springboot 初始化數(shù)據(jù)庫的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 布袋除尘器-单机除尘器-脉冲除尘器-泊头市兴天环保设备有限公司 布袋除尘器|除尘器设备|除尘布袋|除尘设备_诺和环保设备 | 臻知网大型互动问答社区-你的问题将在这里得到解答!-无锡据风网络科技有限公司 | 全自动固相萃取仪_高通量真空平行浓缩仪-勤业永为 | 上海宿田自动化设备有限公司-双面/平面/单面贴标机 | 雨燕360体育免费直播_雨燕360免费NBA直播_NBA篮球高清直播无插件-雨燕360体育直播 | 不锈钢螺丝 - 六角螺丝厂家 - 不锈钢紧固件 - 万千紧固件--紧固件一站式采购 | 电加热导热油炉-空气加热器-导热油加热器-翅片电加热管-科安达机械 | 威海防火彩钢板,威海岩棉复合板,威海彩钢瓦-文登区九龙岩棉复合板厂 | 塑胶跑道_学校塑胶跑道_塑胶球场_运动场材料厂家_中国塑胶跑道十大生产厂家_混合型塑胶跑道_透气型塑胶跑道-广东绿晨体育设施有限公司 | 旋振筛_不锈钢旋振筛_气旋筛_旋振筛厂家—新乡市大汉振动机械有限公司 | 菲希尔X射线测厚仪-菲希尔库伦法测厚仪-无锡骏展仪器有限责任公司 | 刑事律师_深圳著名刑事辩护律师_王平聚【清华博士|刑法教授】 | 天津仓库出租网-天津电商仓库-天津云仓一件代发-【博程云仓】 | 手机存放柜,超市储物柜,电子储物柜,自动寄存柜,行李寄存柜,自动存包柜,条码存包柜-上海天琪实业有限公司 | 必胜高考网_全国高考备考和志愿填报信息平台 | 合肥活动房_安徽活动板房_集成打包箱房厂家-安徽玉强钢结构集成房屋有限公司 | 沙盘模型公司_沙盘模型制作公司_建筑模型公司_工业机械模型制作厂家 | 东莞市踏板石餐饮管理有限公司_正宗桂林米粉_正宗桂林米粉加盟_桂林米粉加盟费-东莞市棒子桂林米粉 | 河南空气能热水器-洛阳空气能采暖-洛阳太阳能热水工程-洛阳润达高科空气能商行 | 沈飞防静电地板__机房地板-深圳市沈飞防静电设备有限公司 | 滚筒烘干机_转筒烘干机_滚筒干燥机_转筒干燥机_回转烘干机_回转干燥机-设备生产厂家 | 重庆磨床过滤机,重庆纸带过滤机,机床伸缩钣金,重庆机床钣金护罩-重庆达鸿兴精密机械制造有限公司 | 蓝莓施肥机,智能施肥机,自动施肥机,水肥一体化项目,水肥一体机厂家,小型施肥机,圣大节水,滴灌施工方案,山东圣大节水科技有限公司官网17864474793 | 涂层测厚仪_漆膜仪_光学透过率仪_十大创新厂家-果欧电子科技公司 | 深圳VI设计-画册设计-LOGO设计-包装设计-品牌策划公司-[智睿画册设计公司] | 光泽度计_测量显微镜_苏州压力仪_苏州扭力板手维修-苏州日升精密仪器有限公司 | 煤矿支护网片_矿用勾花菱形网_缝管式_管缝式锚杆-邯郸市永年区志涛工矿配件有限公司 | 周口市风机厂,周鼓风机,河南省周口市风机厂 | 涂层测厚仪_漆膜仪_光学透过率仪_十大创新厂家-果欧电子科技公司 | 垃圾压缩设备_垃圾处理设备_智能移动式垃圾压缩设备--山东明莱环保设备有限公司 | 超声波焊接机,振动摩擦焊接机,激光塑料焊接机,超声波焊接模具工装-德召尼克(常州)焊接科技有限公司 | 济南玻璃安装_济南玻璃门_济南感应门_济南玻璃隔断_济南玻璃门维修_济南镜片安装_济南肯德基门_济南高隔间-济南凯轩鹏宇玻璃有限公司 | 纸箱抗压机,拉力机,脂肪测定仪,定氮仪-山东德瑞克仪器有限公司 | 智成电子深圳tdk一级代理-提供TDK电容电感贴片蜂鸣器磁芯lambda电源代理经销,TDK代理商有哪些TDK一级代理商排名查询。-深圳tdk一级代理 | 氟塑料磁力泵-不锈钢离心泵-耐腐蚀化工泵厂家「皖金泵阀」 | DDoS安全防护官网-领先的DDoS安全防护服务商 | 玉米深加工机械,玉米加工设备,玉米加工机械等玉米深加工设备制造商-河南成立粮油机械有限公司 | 氨水-液氨-工业氨水-氨水生产厂家-辽宁顺程化工| 江苏南京多语种翻译-专业翻译公司报价-正规商务翻译机构-南京华彦翻译服务有限公司 | 广州中央空调回收,二手中央空调回收,旧空调回收,制冷设备回收,冷气机组回收公司-广州益夫制冷设备回收公司 | Q361F全焊接球阀,200X减压稳压阀,ZJHP气动单座调节阀-上海戎钛 |