SpringBoot整合Flyway(數據庫版本遷移工具)_台中搬家公司

※推薦台中搬家公司優質服務,可到府估價

台中搬鋼琴,台中金庫搬運,中部廢棄物處理,南投縣搬家公司,好幫手搬家,西屯區搬家

簡介

在團隊開發當中,有可能每個人都是使用自己本地的數據庫。當數據庫的表或者字段更新時,往往需要告知團隊的其他同事進行更新。
Flyway數據庫版本遷移工具,目的就是解決該問題而誕生的(我自己想的)。每當我們更新數據庫的時候,只需要添加SQL文件到指定目錄中。Flyway會在數據庫創建一個表,專門記錄已更新的SQL文件。當我們下次執行時則不會執行已記錄並且執行成功的SQL文件。

整合

maven

現在的Flyway的最新版本已經到了6.4.2。我用的是6.3.3。

<!-- https://mvnrepository.com/artifact/org.flywaydb/flyway-core -->
<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
    <version>6.3.3</version>
</dependency>

application配置

搞定了Flyway的依賴后,修改一下SpringBoot的application.yml或application.xml配置。

spring:
  flyway:
    url: jdbc:mysql://192.168.138.132:3306/hotel-server?useUnicode=true&characterEncoding=UTF-8 
    user: johnson 
    password: 123456 
    table: flyway_schema_history
    enabled: true
    locations: classpath:db/migration
    clean-disabled: false

flyway配置詳解

url:連接數據庫的Url 默認為spring.datasource.url
user:連接數據庫的賬號 默認為spring.datasource.username
password:連接數據庫的密碼 默認為spring.datasource.password
table:自定義數據庫版本管理表 默認為 flyway_schema_history
enabled:是否開啟 默認為開啟
locations:SQL文件存放路徑 默認 classpath:db/migration

SQL文件

上面的locations參數配置的SQL文件存放路徑為 classpath:db/migration,classpath對應的目錄就是resources目錄,創建后的目錄如下圖:

※台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!

還在煩惱搬家費用要多少哪?台中大展搬家線上試算搬家費用,從此不再擔心「物品怎麼計費」、「多少車才能裝完」

SQL文件如上圖,SQL文件名必須為V1.0.x__xxx.sql(注意:這裏的下劃線為兩個_,我也是掉坑了才知道),這樣可以對應SQL更新的版本號。啟動了SpringBoot項目后,就會自動幫你執行SQL文件,可以看到數據庫版本控製表中生成的數據:

clean操作

Flyway的clean操作:徹底清除已配置的架構,它將有效地為您提供一個全新的起點。所有對象(表,視圖,過程等)都將被刪除。

spring:
  flyway:
    clean-on-validation-error: true
    clean-disabled: false

clean-on-validation-error:發生驗證的錯誤時是否執行clean操作(如SQL執行失敗),默認false,生產中必須使用false。
clean-disabled:是否禁用clean操作,默認false,生產中必須使用true

如果我們設置 clean-on-validation-error = true,clean-disabled = false。
當我們的SQL文件執行失敗,在數據庫版本控製表flyway_schema_history會添加一條失敗的記錄,success字段為0,此時並不會執行clean操作。
當把SQL文件修改正確並執行完后,此時flyway_schema_history會把失敗記錄的success字段由0改為1。並且會執行clean操作!!!!!整個數據庫的表裡面的數據都被清空了!(除非你在SQL文件中添加了insert操作)
其實在開發環境我也是不建議使用clean,畢竟填數據也是要時間的。。。

總結

團隊開發當中的必備工具啊!不過生產環境當中記得把clean-disabled改為true

個人博客網址: https://colablog.cn/

如果我的文章幫助到您,可以關注我的微信公眾號,第一時間分享文章給您

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※推薦台中搬家公司優質服務,可到府估價

台中搬鋼琴,台中金庫搬運,中部廢棄物處理,南投縣搬家公司,好幫手搬家,西屯區搬家

掄牆鞭死5歲童 養母求處囚終身_網頁設計公司

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

新聞出處: 蘋果日報   記者:孫友廉、黃哲民

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。



毆打虐待養子致死的樊女,遭求處無期徒刑。資料照片

新北市樊姓女子因曾凌虐年幼養子,今 年5月,遭法院判刑確定,不料,今年9月,她竟再持水管鞭打5歲養子,更腳踹、手掐養子下體,還抓養子頭去撞牆,致養子傷重死亡。板橋地檢署痛斥樊女手段 殘忍,虐待成性,昨依殺人罪起訴,求處無期徒刑,也請法院繼續羈押獲准。

曾遭判刑仍未悔悟

33 歲的樊女與夫因無法生育,陸續領養1子1女,前年7月起,樊女便常以年僅3歲的養子隨地便溺、不受管教等理由,多次毆打養子,造成他身體、生殖器等多處受 傷;8月10日,更打傷養子頭部,造成長約11公分的撕裂傷,今年5月才遭台灣高等法院依傷害罪判刑4月,得易科罰金12萬元,緩刑5年,緩刑期間交付保 護管束確定。

不料樊女仍未悔悟,今年9月14日,在觀護人探視輔導3天後,竟再持水管鞭打養子,還手捏下體,腳踹胸腹,將養子推倒在地,再抓養子 頭去撞牆;樊女見養子沒反應也未送醫,直到丈夫下班發現,連忙開車載養子、樊女,前去警局報案,樊夫到警局便大喊:「誰會CPR?趕快救救我兒子!」但養 子已氣絕身亡。

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

俄童生吞42個磁鐵 嚇壞母親_如何寫文案

※別再煩惱如何寫文案,掌握八大原則!

什麼是銷售文案服務?A就是幫你撰寫適合的廣告文案。當您需要販售商品、宣傳活動、建立個人品牌,撰寫廣告文案都是必須的工作。

新聞出處: 蘋果日報  

俄羅斯一名1歲又4個月大的男童,在上周二被母親發現生吞42個磁鐵,緊急送醫後,醫師從男童體內取出磁鐵,目前男童恢復狀況良好。

據了解,日前男童的母親發現,貼在冰箱上的磁鐵不翼而飛,

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。

懷疑是兒子為了好玩,將磁鐵拿走。這名母親的猜測無誤,磁鐵確實被男童拿走,但母親之後驚覺男童竟把磁鐵吃下肚,將男童送醫。醫師表示,他們從男童肚裡取出42個磁鐵。


俄國1歲4個月大男童生吞42個磁鐵,嚇壞母親。翻自網路

醫師也說,這或許是他執業以來遇到的「紀錄」,也呼籲家長注意將小東西放在兒童拿不到的地方。

※教你寫出一流的銷售文案?

銷售文案是什麼?A文案是廣告用的文字。舉凡任何宣傳、行銷、販賣商品時所用到的文字都是文案。在網路時代,文案成為行銷中最重要的宣傳方式,好的文案可節省大量宣傳資源,達成行銷目的。

3歲男童掉入15米深井底 鑽繩套成功自救_網頁設計公司

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

當全世界的人們隨著網路時代而改變向上時您還停留在『網站美醜不重要』的舊有思維嗎?機會是留給努力改變現況的人們,別再浪費一分一秒可以接觸商機的寶貴時間!

新聞出處:北京新浪網    





放大圖
看更多圖片

  本報訊(記者 陳海峰 通訊員 馬世華 文圖) 本報商丘訊 柘城縣梁庄鄉一名3歲男孩在捉蝴蝶時,不慎掉入15米深的機井中。由於井口直徑僅40厘米,救援人員根本無法下井。消防官兵衹好將救援繩子打結,慢慢放入井內,現場指導落井孩子自己操作,半個小時後,孩子被救上來。經醫生檢查,小孩衹受了些擦傷,無生命危險。

  3歲娃掉入15米深機井里

  3月11日下午,提起兒子掉入井里的那一幕,柘城縣梁庄鄉的劉先生仍然心有余悸。

  據他介紹,3月8日下午,兒子和鄰居的一個同齡孩子出去玩耍,誰知,一會兒兩人便不見了蹤影。正在家人尋找時,鄰居的孩子跑回來說他兒子在捉蝴蝶時,掉進了麥地的井里。

  “我一路找一路喊我兒子名字,聽到他的哭聲,立即趕過去,看到兒子正在井下,水淹到孩子胸口處。”劉先生說,他趕緊撥打了119。

  接到求助電話後,柘城縣消防官兵迅速趕赴現場。

  消防員在現場看到,該機井直徑約40厘米,深約15米,水面距離地面約14米。借著燈光觀察,可見男孩上半身卡在井下水面之上,情況萬分危急。

  消防員指導協助

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

透過資料庫的網站架設建置,建立公司的形象或購物系統,並提供最人性化的使用介面,讓使用者能即時接收到相關的資訊

  孩子自救成功

  消防官兵迅速利用壓縮氣瓶向井底輸送新鮮空氣,並對落井小孩持續喊話:“小朋友,不要怕,叔叔馬上救妳上來。”

  由於井口太窄,救援人員無法下井。於是,救援人員制訂了三個救援方案:一是利用井下救援鉤進行救援﹔二是利用結繩法打套進行救援﹔三是利用挖掘機挖土救援。

  由於孩子被卡在井壁內,救援器材無法展開,第一個救援方案未能成功﹔此時,救援人員調來了一台大型挖掘機,第三個方案和第二個方案同時進行。

  救援人員將繩索打個套,慢慢放入井內,接近落井小孩,同時向其喊話:“小朋友,不要害怕,叔叔馬上就救妳上來,妳配合一下,把妳的雙手合在一塊,伸入繩圈,然後抓住繩圈上面的繩結。小朋友,不要害怕,慢慢來,妳馬上就能上來了。”

  聽到消防人員的喊話後,小孩將手套入繩套中,救援人員慢慢地收緊繩子。但剛向上提升約兩米,小孩的頭部被井壁突出部分卡住,無法繼續上升。哇哇的哭聲又從井底傳出。

  “小朋友,不要怕,妳馬上就能出來了,請按照叔叔說的做,把妳的頭慢慢地向前趴,向妳手臂的方向……”消防隊員小心翼翼地拉著繩子,耐心地向孩子喊話。

  聽到喊話,小孩的情緒好轉,並按照消防隊員的方法將頭慢慢靠近自己的手臂,經過一番努力,落井小孩終於通過了那段狹窄的井壁,慢慢地被拉了上來。

  劉先生夫婦看到孩子被救了上來,一把抱住孩子,哭了起來。經醫生檢查,孩子的臉部和右腳部有些擦傷,生命體征完好。

(原標題:真能!3歲娃15米深井底鑽繩套自救)

詳全文 3歲男童掉入15米深井底 鑽繩套成功自救-兩岸新聞-新浪新聞中心 http://news.sina.com.tw/article/20130312/9135110.html

※想知道最厲害的網頁設計公司嚨底家"!

RWD(響應式網頁設計)是透過瀏覽器的解析度來判斷要給使用者看到的樣貌

泳池變態男猥褻小六童 還說:你可以摸我_網頁設計

※台北網頁設計公司這麼多該如何選擇?

網動是一群專業、熱情、向前行的工作團隊,我們擁有靈活的組織與溝通的能力,能傾聽客戶聲音,激發創意的火花,呈現完美的作品

※推薦評價好的iphone維修中心

擁有專業的維修技術團隊,同時聘請資深iphone手機維修專家,現場說明手機問題,快速修理,沒修好不收錢

台中出現泳池變態男,竟然在公共浴室洗澡時,伸手撫摸旁邊小六男童的下體,甚至還開口跟他說「你也可以摸我的」,男童嚇得大聲叫阿公,男子這才趕緊收拾東西離開,看到男童追了出來,他還警告男童不准跟著他。事後男童身心受傷,跟媽媽哭訴後,家人趕緊帶著他報警,並且調閱監視器,揪出這名泳池色狼。

游泳池浴室,卡其色上衣、綠色短褲男子匆忙跑了出來,快步離開,後面1名男童顧不得頭髮還濕濕的,也跟著衝出來找人,原來這名男子,竟然在游泳池浴室伸手猥褻他!

受害男童母親說:「電話中他就開始哭了,整個崩潰大哭,然後就跟我講說,他摸我的小鳥,然後我把他手撥開。」

男童身心靈受傷,事後打電話給媽媽時崩潰大哭,家人這才知道,他在游泳池遭到猥褻。8日傍晚,這名小六男童跟阿公一起到豐原這間游泳池游泳,結束後在大眾澡堂淋浴時,1名男子突然伸手抓他下體,還告訴他說「你也可以摸我的啊」,男童嚇得大叫阿公求救,男子才嚇得匆忙離開,看到男童跑出浴室,還轉頭警告他不准跟上來。

事後家人帶著男童報警,調閱監視器,男童一眼就認出猥褻男子。警方依照車牌,將他約談到案到案,男子坦承有對男童伸手,被依妨害性自主罪名,函送法辦。

※網頁設計最專業,超強功能平台可客製化

窩窩以「數位行銷」「品牌經營」「網站與應用程式」「印刷品設計」等四大主軸,為每一位客戶客製建立行銷脈絡及洞燭市場先機。

游泳池誤倒不明液體冒白煙 19名幼童急送醫_貨運

※智慧手機時代的來臨,RWD網頁設計為架站首選

網動結合了許多網際網路業界的菁英共同研發簡單易操作的架站工具,及時性的更新,為客戶創造出更多的網路商機。

中和景新國小委外由游泳池晚間發生誤混液體,造成多名幼童不適,環保署人員趕抵檢查現地。(吳家詮翻攝)

新北景新國小外包游泳池,晚間發生誤倒入不明液體,早成多名在場幼童身體不適。(圖摘自Google Map)

新北市中和區景新國小旁一處私人游泳池,晚間現場疑似救生員誤將不明液體倒入泳池產生白煙,造成現場場19名小朋友噁心嘔吐,送新北雙和醫院急救。

※評比南投搬家公司費用收費行情懶人包大公開

搬家價格與搬家費用透明合理,不亂收費。本公司提供下列三種搬家計費方案,由資深專業組長到府估價,替客戶量身規劃選擇最經濟節省的計費方式

 

消防局初步了解,現場為伊藤萬游泳晚上6時50分至8時為學校的游泳課程,因工作人員誤將強酸(氯)及強鹼(消毒水)加在一起,故產生化學作用冒煙,引起上課學生身體不適,小朋友分屬不同學校參加游泳課程,目前送醫計有18名,有1名為家長自行送往醫院,消防局救護車載運10女8男(18名),均送往雙和醫院。

 

雙和醫院稍晚表示,另有5名泳池的教練也因身體不適,陸續到院檢查治療。

※回頭車貨運收費標準

宇安交通關係企業,自成立迄今,即秉持著「以誠待人」、「以實處事」的企業信念

家長疏忽?6歲童飯店獨棟villa泳池溺水 送醫救回_網頁設計公司

※南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

搬家費用:依消費者運送距離、搬運樓層、有無電梯、步行距離、特殊地形、超重物品等計價因素後,評估每車次單

台東縣池上鄉一家五星級渡假村今天傍晚驚傳6歲男童險溺斃別墅型飯店水池,消防人員趕抵,男童已無生命跡象,經送往關山慈濟醫院急救,才恢復心跳和呼吸,住院觀察中。

救護人員緊急將溺水男童送往關山慈濟醫院,經搶救恢復生命跡象。(記者陳賢義翻攝)

※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

透過選單樣式的調整、圖片的縮放比例、文字的放大及段落的排版對應來給使用者最佳的瀏覽體驗,所以不用擔心有手機版網站兩個後台的問題,而視覺效果也是透過我們前端設計師優秀的空間比例設計,不會因為畫面變大變小而影響到整體視覺的美感。

男童溺水水池位於飯店獨棟villa外。(記者陳賢義翻攝)

這起溺水意外發生在今天傍晚5點26分左右,台東縣消防局勤指中心獲報,池上鄉一家五星級渡假村,有個6歲小朋友在飯店房間水池溺水,溺者已救出水池,立即出動池上消防分隊及通報關山高救隊馳援,抵達現場發現是飯店獨棟villa,男童已無生命跡象,施予救護處置,旋即送往關山慈濟急救。

消防單位說,事發當時,男童家長也在附近,可能是疏於注意,才會導致意外發生。警方則說,男童經搶救,恢復心跳和呼吸,但仍須住院觀察,家長是否涉及兒少法或相關刑責,須再調查釐清。

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

節能減碳愛地球是景泰電動車的理念,是創立景泰電動車行的初衷,滿意態度更是服務客戶的最高品質,我們的成長來自於你的推薦。

誇張!女童泳池溺水瀕死 媽媽低頭玩手機渾不知_租車

※超省錢租車方案

商務出差、學生出遊、旅遊渡假、臨時用車!GO 神州租賃有限公司!合法經營、合法連鎖、合法租賃小客車!

中國河南洛陽近日發生一起離譜案件,一名女童在一處游泳池內游泳,卻發生溺水意外。但誇張的是,她的母親在泳池邊只顧著玩手機,完全不知道自己的孩子已經溺水,隨後有另外一名女泳客發現異狀,立刻救起女童,但女童被救起時,一度失去意識和呼吸。

據中國《看看新聞》報導,事發在本月14日下午,這名女童到泳池玩耍,卻發生溺水意外,但她的媽媽只在泳池邊不斷低頭玩手機,完全不知道自己的女兒出事了。隨後另一名女泳客、高中老師陶曉峰發現了異狀,感覺水底下有人,她立刻將孩子救起,並馬上進行心肺復甦術。

陶曉峰本身也有救生員資格,

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

有別於一般網頁架設公司,除了模組化的架站軟體,我們的營業主軸還包含:資料庫程式開發、網站建置、網頁設計、電子商務專案開發、系統整合、APP設計建置、專業網路行銷。

她立刻為孩子進行急救,但女童一度失去意識和呼吸。但令人驚訝的是,女童的母親只顧著低頭玩手機,完全不知道自己的女兒身陷危險,甚至瀕臨死亡邊緣。等到女童的母親回過神時,才發現女童沒有了意識,在現場大哭。陶曉峰也說,現場由於游泳的人太多,再加上水也不太清澈,「當時感覺水下是一個小孩」。出於本能意識,陶曉峰立刻潛水並將溺水女童拉出水面。

就在陶曉峰急救的同時,消防隊及救難隊也獲報趕抵現場,並將女童送醫急救。經治療好,女童已無大礙,目前正持續接受治療當中。

誇張!女童泳池溺水瀕死,媽媽低頭玩手機渾不知。翻自畫面
女童被救起時一度失去意識和呼吸。翻自畫面
經治療好,女童已無大礙,目前正持續接受治療當中。翻自畫面

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

日本、大陸,發現這些先進的國家已經早就讓電動車優先上路,而且先進國家空氣品質相當好,電動車節能減碳可以減少空污

沒有救生員且泳池違建 林口幼兒園1童險溺斃_包裝設計

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網動廣告出品的網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上她。

新北市林口區某幼兒園上午傳學童溺水意外,經新北市教育局及工務局查證,園方違法將戶外遊樂區改建為室內游泳池,且依規定應配置至少1名救生員,事發當時卻僅有2名老師在場,是同學發現女童漂浮在水面上,園方才驚覺不對勁,立即將溺水的女童送醫急救,目前仍在加護病房觀察中。

溺水的4歲薛姓女童母親表示,因為這間幼兒園在地方上頗有知名度,3天前才將女兒送去就讀,昨天老師還提醒家長要幫小朋友準備泳衣、泳圈,沒想到今天早上才剛送女兒去上學,11點就接到園方電話說女兒溺水送醫。

幼兒園涂姓園長不願回應事發當時是否沒有救生員在場才導致意外;但據瞭解,意外發生當下泳池沒有救生員,只有2名老師在場看顧,同學看到女童嗆水後浮在泳池中,才馬上跟老師說,老師立即下水將女童拉上岸。

※產品缺大量曝光嗎?你需要的是一流包裝設計!

窩窩觸角包含自媒體、自有平台及其他國家營銷業務等,多角化經營並具有國際觀的永續理念。

新北市教育局指出,校方游泳池應參照教育部體育署「游泳池管理規範」,而據規範中,業者應以該水池總面積而設有救生員親自在場執行,最少要配置一名。此外,事發當時師生比是1比18,不符合中班規範1比15。

工務局也表示,經相關使用執照調閱,發現該幼兒園僅標示戶外遊戲場的範圍,周邊沒有期間建築物構造,但勘驗現場卻有游泳池,確定游泳池屬於違建,又涉及公共安全問題,將要求幼兒園立即拆除游泳池。

但張姓幼兒園負責人出面卻否認泳池違建,只是對家長表示抱歉,很遺憾發生這樣的意外,「我們這都一切合法經營,沒有違建,已經經營30年。目前在做的,是盡最大的努力讓小朋友在長庚醫院受到最好的醫療照顧。」

發生意外的幼兒園,是林口地區唯一一間設有游泳池的幼兒園,卻傳出溺水且泳池違建。記者巫鴻瑋/翻攝
園方否認泳池違建,更不願回應當時沒有救生員在游泳池邊的問題。記者巫鴻瑋/翻攝

※南投搬家公司費用需注意的眉眉角角,別等搬了再說!

上新台中搬家公司提供您一套專業有效率且人性化的辦公室搬遷、公司行號搬家及工廠遷廠的搬家服務

OkHttp,一次無奈的使用_網頁設計公司

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

台中景泰電動車行只是一個單純的理由,將來台灣的環境,出門可以自由放心的深呼吸,讓空氣回歸自然的乾淨,減少污染,留給我們下一代有好品質無空污的優質環境

一次使用OKHTTP的心痛歷程

最近由於一些不得已的原因,接觸到了OKHttp,說起來也挺Dan疼的,之前同事將生產附件上傳地址配置成了測試地址,還好數量不多,沒有造成太大的影響,況且的是這位同事又離職了,當時只能在心中
默默的問候了他N遍,當然問候完了之後,也不得不繼續數據同步的工作。

OKHTTP官方地址:okHttp

本文源地址:一次使用OKHTTP的心痛歷程

介紹

由於OkHttp官網的介紹十分詳細,這裏只能貼上一段翻譯過後的introduce:

HTTP是現代應用網絡的一種方式。這就是我們交換數據和媒體的方式。高效地使用HTTP可以讓你的東西更快地加載並節省帶寬。

OkHttp是一個高效的Http客戶端,在默認的情況下:

  • HTTP / 2支持允許對同一主機的所有請求共享一個套接字。
  • 連接池可減少請求延遲(如果HTTP / 2不可用)。
  • 透明的GZIP縮小了下載大小。
  • 響應緩存可以完全避免網絡重複請求。

不過在我使用下來,OkHttp比 apache-http 好用太多,層次結構較直觀。

使用場景

本次場景是將上傳到測試環境的文件信息,下載到本地,然後再上傳到生產環境。

解決過程如下:

  • 將錯誤數據從數據庫表中粘貼到本地新建的一個Excel文件中。(畢竟直接連接數據庫風險更大)

  • 讀取Excel內的信息,獲取文件地址。

  • 請求文件地址,獲取到流文件信息。

  • 拿到流文件信息,拼接上傳數據,上傳到新的生產環境中。

  • 上傳完成后,獲取到生產環境文件地址。

  • 獲取到生產文件地址的同時,生成更新的SQL語句。

  • 到數據庫中執行SQL語句。

    ※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

    網站的第一印象網頁設計,決定了客戶是否繼續瀏覽的意願。台北網動廣告製作的RWD網頁設計,採用精簡與質感的CSS語法,提升企業的專業形象與簡約舒適的瀏覽體驗,讓瀏覽者第一眼就愛上它。

使用過程

本次使用沒有搭建新的工程,直接再 src/test/java 目錄下新建一個Java類。

引入OKHttp的依賴:

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>3.3.1</version>
</dependency>

在引入了 okhttp 的jar包后,基本上就可以開始隨心所欲的進行自己任意喪心病狂的Http請求了。

比如,它直接同步和異步的請求:

同步GET

  private final OkHttpClient client = new OkHttpClient();

  public void run() throws Exception {
    Request request = new Request.Builder()
        .url("https://publicobject.com/helloworld.txt")
        .build();

    try (Response response = client.newCall(request).execute()) {
      if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

      Headers responseHeaders = response.headers();
      for (int i = 0; i < responseHeaders.size(); i++) {
        System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i));
      }

      System.out.println(response.body().string());
    }
  }

異步GET

 private final OkHttpClient client = new OkHttpClient();

  public void run() throws Exception {
    Request request = new Request.Builder()
        .url("http://publicobject.com/helloworld.txt")
        .build();

    client.newCall(request).enqueue(new Callback() {
      @Override public void onFailure(Call call, IOException e) {
        e.printStackTrace();
      }

      @Override public void onResponse(Call call, Response response) throws IOException {
        try (ResponseBody responseBody = response.body()) {
          if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

          Headers responseHeaders = response.headers();
          for (int i = 0, size = responseHeaders.size(); i < size; i++) {
            System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i));
          }

          System.out.println(responseBody.string());
        }
      }
    });
  }

Header信息

private final OkHttpClient client = new OkHttpClient();

  public void run() throws Exception {
    Request request = new Request.Builder()
        .url("https://api.github.com/repos/square/okhttp/issues")
        .header("User-Agent", "OkHttp Headers.java")
        .addHeader("Accept", "application/json; q=0.5")
        .addHeader("Accept", "application/vnd.github.v3+json")
        .build();

    try (Response response = client.newCall(request).execute()) {
      if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

      System.out.println("Server: " + response.header("Server"));
      System.out.println("Date: " + response.header("Date"));
      System.out.println("Vary: " + response.headers("Vary"));
    }
  }

POST請求流信息

public static final MediaType MEDIA_TYPE_MARKDOWN
      = MediaType.parse("text/x-markdown; charset=utf-8");

  private final OkHttpClient client = new OkHttpClient();

  public void run() throws Exception {
    RequestBody requestBody = new RequestBody() {
      @Override public MediaType contentType() {
        return MEDIA_TYPE_MARKDOWN;
      }

      @Override public void writeTo(BufferedSink sink) throws IOException {
        sink.writeUtf8("Numbers\n");
        sink.writeUtf8("-------\n");
        for (int i = 2; i <= 997; i++) {
          sink.writeUtf8(String.format(" * %s = %s\n", i, factor(i)));
        }
      }

      private String factor(int n) {
        for (int i = 2; i < n; i++) {
          int x = n / i;
          if (x * i == n) return factor(x) + " × " + i;
        }
        return Integer.toString(n);
      }
    };

    Request request = new Request.Builder()
        .url("https://api.github.com/markdown/raw")
        .post(requestBody)
        .build();

    try (Response response = client.newCall(request).execute()) {
      if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

      System.out.println(response.body().string());
    }
  }

POST請求File信息

  public static final MediaType MEDIA_TYPE_MARKDOWN
      = MediaType.parse("text/x-markdown; charset=utf-8");

  private final OkHttpClient client = new OkHttpClient();

  public void run() throws Exception {
    File file = new File("README.md");

    Request request = new Request.Builder()
        .url("https://api.github.com/markdown/raw")
        .post(RequestBody.create(MEDIA_TYPE_MARKDOWN, file))
        .build();

    try (Response response = client.newCall(request).execute()) {
      if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

      System.out.println(response.body().string());
    }
  }

Post表單提交

 private final OkHttpClient client = new OkHttpClient();

  public void run() throws Exception {
    RequestBody formBody = new FormBody.Builder()
        .add("search", "Jurassic Park")
        .build();
    Request request = new Request.Builder()
        .url("https://en.wikipedia.org/w/index.php")
        .post(formBody)
        .build();

    try (Response response = client.newCall(request).execute()) {
      if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

      System.out.println(response.body().string());
    }
  }

POST多個Body請求

  /**
   * The imgur client ID for OkHttp recipes. If you're using imgur for anything other than running
   * these examples, please request your own client ID! https://api.imgur.com/oauth2
   */
  private static final String IMGUR_CLIENT_ID = "...";
  private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");

  private final OkHttpClient client = new OkHttpClient();

  public void run() throws Exception {
    // Use the imgur image upload API as documented at https://api.imgur.com/endpoints/image
    RequestBody requestBody = new MultipartBody.Builder()
        .setType(MultipartBody.FORM)
        .addFormDataPart("title", "Square Logo")
        .addFormDataPart("image", "logo-square.png",
            RequestBody.create(MEDIA_TYPE_PNG, new File("website/static/logo-square.png")))
        .build();

    Request request = new Request.Builder()
        .header("Authorization", "Client-ID " + IMGUR_CLIENT_ID)
        .url("https://api.imgur.com/3/image")
        .post(requestBody)
        .build();

    try (Response response = client.newCall(request).execute()) {
      if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

      System.out.println(response.body().string());
    }
  }

因為使用過程中大多數都是按照官網的例子來進行,所以這次使用的代碼是類似於官方提供的例子,當然也是不太好意思貼出來,哈哈。

總結

OkHttp算得上是相見恨晚,之前一遍一遍寫 apache-http 的時候就覺得 apche 有點冗餘,就是想有一個輕量級的,比較好上手,容易懂的http-client,不過現在接觸到了 okhttp,還是得感謝那位配錯地址的兄弟。

以上更多請求例子可以訪問:OKhttp-Request-example

參考資料:

OkHttp.io

OKhttp-Request-example

OKHttp-Github

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

以設計的實用美學觀點,規劃出舒適、美觀的視覺畫面,有效提昇使用者的心理期待,營造出輕鬆、愉悅的網站瀏覽體驗。