日本風災後核廢棄物外流 空拍機搜索仍大批失蹤

文:宋瑞文(媽媽監督核電廠聯盟特約撰述)

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

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

※帶您來看台北網站建置台北網頁設計,各種案例分享

Nikola 氫電皮卡概念車 Badger 登場,續航將近一千公里,你信嗎?

電動車新創 Nikola 推出全新電動皮卡概念車 Badger,同時採用電池動力與氫燃料電池,續航里程高達 960 公里,零到一百加速只要 2.9 秒,問題是還有多少人相信他們?

超狂電動車新創 Nikola Motor(尼古拉)再次發出豪語,他們全新的皮卡車 Badger,將可以擁有傲視全球的 600 英哩續航力(約 960 公里),並且輸出高達 906 馬力,扭力也是兇猛的 1328 牛頓米。而且這台新車將採用雙動力模式,能夠以電池動力行駛,里程就已經有 300 英哩(約 480 公里),還可以再用氫燃料電池行駛額外的 300 英哩(480 公里),來吸引沒辦法充氫氣的族群。

Badger 的官方數據非常嚇人,完全樂勝競爭對手。

這輛新車的規格完全足以跟 Tesla Cybertruck、Rivian R1T 和電動悍馬車相抗衡,同時還有超越對手的續航力,Nikola 將在今年 9 月的技術大會上展示這輛全新的 Badger。

然而,Nikola 最不缺乏的就是漂亮的數據與規格,他們最需要的是一款真正能夠銷售的「產品」。Nikola 跟 Tesla 同樣用偉大科學家為名,也同樣喜歡講大話,但是 Tesla 在 2004 年到 2007 年總共進行了 3 輪募資,總金額約 6,500 萬美元。2006 年 Tesla 推出第一台原型車 Roadster,並且開始接單,2008 年第一季交車。儘管在初期有許多瑕疵,但至少他們把產品做出來也賣了出去。

但是 Nikola 的吸金功力遠遠超越它的前輩,他們光是 2017 年第一輪就募到 1.1 億美元後,目前已經進行了四輪募資,最新一輪的投資者包含 Bosch(博世)、Hanhwa(韓華技佳) 和 CNH(凱斯紐環球),金額超過 5 億,也讓它的募資總金額超過十億美元。

大廠領投加上跨時代的高科技,或許還要感謝 Tesla 的成功故事,讓這家連原型車都還沒做出來的車廠,就能拿下超過十億美元的資金。

Nikola 氫燃料電池卡車頭 TRE,直接和 Tesla Semi 打對台。

今年 9 月,Nikola 將舉辦 Nikola World 2020 大會,原先預定在這場大會上展示的,是他們新的氫燃料電池,根據之前官方釋出的消息,將能夠讓電動車續航力高達 1,200 公里,卡車甚至能高達 1,600 公里,讓所有人都嚇傻了。如今又新增這台氫電皮卡車 Badger 也要在 9 月展示,到底真相如何,屆時就能分曉。

如果 Nikola 真的掌握了革命性的技術,那麼未來發展很有機會超越特斯拉,成為商用市場的電動車小霸王;相反的,如果 Nikola 沒辦法兌現這些承諾,那就成了電動車界的 Theranos,對整體產業發展產生負面衝擊。

(合作媒體:。首圖來源:)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

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

※帶您來看台北網站建置台北網頁設計,各種案例分享

遷移桌面程序到MS Store(11)——應用SVG圖標

在傳統桌面程序中,對圖標的使用大多是直接嵌入JPG或者PNG的圖片。在祖傳的1366×768分辨率下,並沒有什麼問題。相對於手機硬件的突飛猛進,也側面反映了PC行業的落寞和桌面程序開發的不思進取。用360衛士的群眾並不能倒推PC行業的升級。反倒是水果公司雙高的利潤和口碑讓人很是眼饞。加之某軟跳出來教豬隊友做硬件。現在倒是有些起色,1080p的屏幕已是標配,4k也算常見。那麼傳統桌面程序在升級過程中,就會遇到今天要討論的,如何解決高分辨率下圖標模糊的問題。

一種解決方案是按最高的分辨率提供圖片。這種適合較大的圖片,比如背景啥的。另一種就是今天要討論的,針對當前流行的、扁平化圖標的解決方案。

 從本篇的標題可以看出,我們希望應用SVG矢量圖來適應各種分辨率的情況。以WPF程序為例,首先要面對的問題是,WPF並不支持像嵌入JPG/PNG圖標這樣,直接使用SVG圖標。大動干戈的引用第三方library通過自定義類型來支持SVG並不是本文的目的。這裏我們要介紹如何通過字體文件,進而在WPF或UWP中使用SVG圖標的方式。

雖然WPF不支持直接使用SVG文件,但是Windows是支持矢量字體的。而我們的目的就是要將圖標以字體的形式在WPF程序中显示。具體使用的字體TrueType,則是由微軟和蘋果共同開發的字體類型標準,該字體文件的擴展名是.ttf。

接下來我們依然是通過Sample工程來說明。首先給出GitHub的地址:

首先我們打開WpfAppWithPNGs工程,圖標的使用代碼如下:

        <Image Grid.Row="0" Grid.Column="0"  Width="32" Height="32" Source="Resources/Airplane_Off.png" ></Image>
        <Image Grid.Row="0" Grid.Column="1"  Width="64" Height="64" Source="Resources/Airplane_On.png" ></Image>
        <Image Grid.Row="0" Grid.Column="2"  Width="96" Height="96" Source="Resources/Bluetooth_Off.png"  ></Image>
        <Image Grid.Row="0" Grid.Column="3"  Width="128" Height="128" Source="Resources/Bluetooth_On.png"  ></Image>

 

這裏主要有兩個問題,因為我們默認提供的是32×32的圖標,因此除了第一列Width和Height設置為32的圖標,其他的圖標都存在模糊的問題。第二個問題是針對圖標的每一種顏色,都需要對應提供不同的圖標文件(圖中的例子需要有灰色和藍色兩份文件)。相對的SVG圖標僅僅需要一份文件。即可在程序中動態設定不同的顏色了。

這裏先給出最終WPF項目中,對SVG圖標的引用的代碼,然後我們再進行詳細解釋。對應的工程名為WpfAppWithFontIcons。

        <TextBlock Grid.Row="0" Grid.Column="0" Text="{x:Static local:FontIcons.airplane_mode_circ}"   Foreground="Gray"  FontSize="32" ></TextBlock>
        <TextBlock Grid.Row="0" Grid.Column="1" Text="{x:Static local:FontIcons.airplane_mode_circ}"  Foreground="{StaticResource dellBlue}"  FontSize="64" ></TextBlock>
        <TextBlock Grid.Row="0" Grid.Column="2" Text="{x:Static local:FontIcons.bluetooth_inactive}"   Foreground="Orange"  FontSize="96" ></TextBlock>
        <TextBlock Grid.Row="0" Grid.Column="3" Text="{x:Static local:FontIcons.bluetooth_inactive}"    Foreground="Brown"  FontSize="128" ></TextBlock>

代碼最大的不同應該是由<Image/>標籤更改為<TextBlock/>標籤,這是因為我們是通過ttf字體文件,曲線救國的方式來使用SVG圖標。

具體的步驟如下:

準備SVG圖標文件,將這些文件打包成一整個ttf字體文件。打包的方式有很多種,通常我使用的是IcoMoon的免費解決方案。地址如下:

通過這個網站選擇SVG圖標文件上傳,打包生成一個zip文件。解壓後文件夾結構如下圖:

ttf文件在fonts文件夾中,實際使用時,需要作為資源文件,添加到WPF工程中。點擊圖中的demo.html會打開一個本地網頁,可用於查找ttf文件中包含的SVG圖標,以及對應的unicode。實際我們是通過對unicode的引用來显示SVG圖標的。

完整的project結構如下圖,Fonts文件夾是手動添加用來放置ttf文件。ttf文件名字都是根據項目需要來取,並不固定。

ttf字體文件需要以<FontFamily/>的形式添加到項目的<Resources/>節點中。然後再通過<Style/>指定給<TextBlock/>。當然不在<Resources/>節點定義Style,而是在每個<TextBlock/>中指定FontFamily屬性也是可以的。有關XAML的語法細節,回字的四種寫法什麼的,這裏略過不提。

    <Window.Resources>
        <FontFamily x:Key="Fonticon">/Fonts/rcc-fonticon-ribbon-v2.ttf#rcc-fonticon-ribbon-v2</FontFamily>
        <Style TargetType="TextBlock">
            <Setter Property="FontFamily" Value="{StaticResource Fonticon}" ></Setter>
        </Style>
        <SolidColorBrush x:Key="dellBlue">#007DB8</SolidColorBrush>
    </Window.Resources>

這裏說明一下“/Fonts/rcc-fonticon-ribbon-v2.ttf#rcc-fonticon-ribbon-v2”值的定義,#前面的是文件路徑,#後面的是font name,查看的方法是雙擊ttf文件,參考下圖。

在定義好FontFamily之後,我們並不推薦直接將unicode寫到XAML或.cs文件中。因為在XAML中,你需要如下編寫:

<TextBlock Grid.Row="0" Grid.Column="0" Text="&#xe900;" Foreground="Gray"  FontSize="32" ></TextBlock>

而在C#代碼中,又需要以下面這種格式:

textBlockAirplane.Text = "\ue900"

兩種不統一的格式會在將來修改時帶來極大的困難,特別是圖標被多處引用時,全局的查找替換根本就是噩夢。此外,毫無意義的unicode值的可讀性根本等於0。正常人類無法將”&#xe900;”,”\ue900″和Airplane的圖標聯繫起來。

我推薦的做法是生成一個FontIcons Class,以string類型屬性的形式暴露出來。這樣可以獲得IDE智能語法提示的支持,更新時也僅需修改這個Class,Find All Reference更是方便無比。同時無論在XAML文件,還是C#代碼中,我們看到的都是統一的“FontIcons.airplane_mode_circ”。

    public static class FontIcons
    {
        public static string airplane_mode_circ { get; } = "\ue900";
        public static string bluetooth_inactive { get; } = "\ue901";
        public static string brightness { get; } = "\ue902";
        public static string brightness_inactive { get; } = "\ue903";
        public static string browse_inactive { get; } = "\ue904";
        public static string camera { get; } = "\ue905";
    }

那麼我們是不是需要手工來編寫FontIcons Class呢?大哥我們是能把午飯(我不愛喝咖啡)轉換成Code的生物啊!當然是寫個小工具來自動生成了。在Sample庫中,參考IcoMoonReader工程,只需將IcoMoon生成的.svg文件(icomoon.zip解壓后的fonts文件夾里)丟在IconMoonReader.exe同級目錄,即可生成相應代碼。

 其實只有一個方法啦,使用時需要注意具體的文件名是否正確。

            using (var stream = new FileStream("rcc-fonticon-ribbon-v2.svg", FileMode.Open))
            {
                using (var reader = new StreamReader(stream))
                {
                    var pattern = "unicode(\\S)*\\sglyph-name(\\S)*\"";
                    var input = reader.ReadToEnd();
                    foreach (Match match in Regex.Matches(input, pattern))
                    {
                        pattern = "\"\\S*\"";
                        var list = new List<string>();
                        foreach (var result in Regex.Matches(match.Value, pattern))
                        {
                            list.Insert(0, result.ToString());
                        }
                        var name = list[0].Replace("\"", "").Replace("-","_");
                        var code = list[1].Replace("&#x", "\\u").Replace(";", "");
                        Console.WriteLine($"public static string {name} {{ get; }} = {code};");
                    }
                }
            }

把生成的C#字符串定義貼到具體工程的FontIcons Class(名字隨意)。

這樣一個優秀的解決方案如果僅支持WPF,那又談何遷移到MS Store呢?實際上這套機制放到UWP工程中也是可以的。雖然UWP可以通過SvgImageSource屬性原生支持SVG了,但我們的這套方案在圖標的應用方面毫不遜色,甚至可以說更為方便。具體的例子可以參考AppWithFontIcon工程。在這個UWP的工程中,除了放ttf文件的位置我換到了現成的Assets文件夾,幾乎沒有改變。

        <TextBlock Grid.Row="0" Grid.Column="0" Text="{x:Bind local:FontIcons.airplane_mode_circ}"   Foreground="Gray"  FontSize="32" ></TextBlock>
        <TextBlock Grid.Row="0" Grid.Column="1" Text="{x:Bind local:FontIcons.airplane_mode_circ}"  Foreground="{StaticResource dellBlue}"  FontSize="64" ></TextBlock>
        <TextBlock Grid.Row="0" Grid.Column="2" Text="{x:Bind local:FontIcons.bluetooth_inactive}"   Foreground="Orange"  FontSize="96" ></TextBlock>
        <TextBlock Grid.Row="0" Grid.Column="3" Text="{x:Bind local:FontIcons.bluetooth_inactive}"    Foreground="Brown"  FontSize="{x:Bind DynamicFontSize(),Mode=OneWay,FallbackValue=128}" ></TextBlock>

因為UWP沒有了x:static關鍵字,所以我換成了x:Bind。換成x:Bind之後甚至可以動態的響應值的變化。比如我在這裏把FontSize做了一個x:bind到DynamicFontSize()方法,讓字體隨着界面改變,動態的變大變小。雖然並沒有什麼卵用……但是Demo的時候可以增加點噱頭……

本篇到此結束,照例貼上Github地址:

感謝耐着性子看到這裏的同學!

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

【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

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

※帶您來看台北網站建置台北網頁設計,各種案例分享

北海道核電站少報一半污染

摘錄自2019年12月26日共同社報導

日本北海道電力公司周二(24日)發布消息稱,公司自1988年起就一直向周邊地方政府少報「泊核電站」向大氣排放的放射性氣體廢棄物數值,長期只報告實際數值的一半。

「泊核電站」位於北海道古宇郡泊村,自1988年至2012年間運作。日本北海道電力公司會定期向日本原子能規制廳、北海道政府及泊村等報告放射性氣體廢棄物排放量。不過,該公司在煙囪採集樣本時,一直忽略樣本會因混入空氣而被稀釋一半,結果一直採用錯誤數值。

共同社報導,這是因該公司的操作手冊中,遺漏了需要修正數值的記述。北海道電力公司副社長阪井一郎為事件道歉,但公司稱排放仍未超出安全標準。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

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

※帶您來看台北網站建置台北網頁設計,各種案例分享

建立通用MRV機制 讓碳排計算公平且透明

文:范馨心(InnoEnergy永續能源工程與管理碩士學程)

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

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

※帶您來看台北網站建置台北網頁設計,各種案例分享

特斯拉上海工廠獲當局協助,預計 2/10 復工

電動車龍頭特斯拉(Tesla)股價近期出現戲劇性走勢,3、4 日連續兩天以 2 位數速度暴漲,5 日則受中國交車進度料延遲的消息影響,股價重挫逾 17%。不過,中國官員 8 日表示,將盡全力協助企業復工,特斯拉上海工廠將於 10 日恢復生產。

路透社 8 日報導,中國各地工廠的農曆新年假期停工時間,原定 1 月 30 日結束,但由於新型冠狀病毒肺炎疫情嚴峻,中國政府緊急要求企業及工廠延長停工至 2 月 9 日,以防堵疫情擴散。

2 月 4 日,特斯拉全球副總裁陶琳在個人微博表示,原定春節後 2 月初的交車計畫將會暫緩,疫情好轉後會盡力補上交車進度。受此消息影響,5 日特斯拉股價大跌 17.18%,創公司史上第二高單日跌幅,僅次 2012 年 1 月 13 日的 19.33%。

對此,上海市人民政府新聞發言人徐威表示,針對特斯拉等重點企業在復工過程遇到的實際困難,當局將盡全力協調,幫助企業儘快恢復正常生產。

報導指出,特斯拉上海工廠耗資 20 億美元,是特斯拉旗下首座海外工廠,受中國政府大力支持。工廠去年 10 月開始生產,並於今年 1 月舉辦首批中國製 Model 3 交車儀式。

7 日特斯拉股價下跌 0.12%,收 748.07 美元。3 日及 4 日,特斯拉股價分別飆漲 19.89%、13.73%,使股價衝上 887.06 美元,但隨後回吐漲幅,5 日重挫 17.18% 至 734.70 美元。

光 2020 年初以來,特斯拉股價已瘋狂上漲 78.82%,但也引來泡沫效應的疑慮聲浪。CNBC 8 日報導,據 FactSet 數據,目前約 45% 華爾街分析師給予特斯拉股票「賣出」評級,比率創歷來新高,僅 19% 分析師給予「買進」評級,「持有」評級則佔 36%。

券商 Needham 分析師 Rajvindra Gill 5 日出具研究報告,對特斯拉給出「遜於大盤」評級。他指出,從未見過股價上漲如此快速,投資人對過去基本面或成長紀錄卻鮮少關注的現象,反映特斯拉股票的「非理性繁榮」(Irrational exuberance)達到歷史新高。

(本文內文由  授權使用;首圖來源:)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

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

※帶您來看台北網站建置台北網頁設計,各種案例分享

「每日五分鐘,玩轉 JVM」:GC 概覽

前言

GC(Garbage Collection)是我們在學習 JVM 的過程中不可避免的一道坎,接下來,我們就來系統的學習一下 GC。

做一件事情之前,我們一定要去知道我們為什麼要去做,這裏不僅僅指 GC,更適用我們日常的學習和生活,知其然,知其所以然,方能百戰不殆。

下面我們先去了解為什麼要有 GC,以及 GC 在 JVM 中扮演了一個什麼樣的角色,起到了什麼的作用?

為什麼要有 GC

用過 C++ 的同學可能知道,對象所佔的內存在程序結束運行之前一直被佔用,在明確釋放之前不能分配給其它對象。如果我們不去手動的清除這些無用的對象,內存很快就被佔滿,而在 JVM 中,GC 所起到的作用就是一個清道夫,它可以幫助我們去判定哪些對象是無用對象怎麼進行垃圾收集,以及決定內存分代和內存分配的策略**。

可能有同學會問了,既然我們的 JVM 會給我們做 GC 的工作,我們為什麼還要去學習 GC 呢,一切交給 JVM 不好嗎?當然,在我們的日常情況下,我們一般不會去關心 GC 的一些細節,但是當我們遇到內存泄露,內存溢出,高併發瓶頸的時候,我們就需要去對 GC 開刀,進行更為細緻的監控和調節。

內存泄露:指程序中己動態分配的堆內存由於某種原因程序未釋放或無法釋放,造成系統內存的浪費,導致程序運行速度減慢甚至系統崩潰等嚴重後果。

內存溢出:應用系統中存在無法回收的內存或使用的內存過多,最終使得程序運行要用到的內存大於能提供的最大內存。

那麼現在問題來了,我們要進行垃圾回收,首先我們需要知道垃圾在哪

垃圾在哪

前面我們講了JVM 的運行時內存區域,知道線程可以分為線程獨佔區和線程共享區,其中線程獨佔區(程序計數器,虛擬機棧,本地方法棧)的內存生命周期是和線程保持一致,且這幾個區域分配的內存大小跟類的大小有關,也就是說,當我們的類結構固定之後,這部分的內存就不會再發生更改,且當方法或線程結束的時候,內存自然就跟隨着回收了.

而線程共享區的堆內存和方法區則不一樣,堆內存和方法區所用的內存是在編譯期間無法確定的,因為一個接口的不同實現,一個方法的不同控制條件分支所執行的代碼可能完全相反,我們只有在運行時才知道會創建哪些對象,這部分的內存的分配和回收是動態的,而我們的 GC 關注的就是該部分的內存。

打個比方來說:JVM 如果是一輛車,線程獨佔區的就像是零件,在出廠時這些零件的壽命基本上都是已知的,線程共享區就像是汽油,汽油的消耗跟我們所採用的路線有關,所以我們關注的部分就是這部分會動態變化的,比如如何開車才能更省油~

知道了垃圾在什麼位置會出現,我們下一步就需要去判定在這些區域的有哪些是垃圾~

下節預告

本節內容到這裏先告一段落,下一節我們來學習,怎麼去判定是否為垃圾~

公眾號

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

【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

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

※帶您來看台北網站建置台北網頁設計,各種案例分享

Toyota Mirai 加州開放預訂 提供 3 年免費氫燃料

  全球首部量產的氫燃料電池車 (FCV):Toyota Mirai 在 7 月 20 日於美國加州率先開放預訂,不過 Toyota 已表示,在 2017 年底前,預計只會在美國銷售 3,000 輛的 Mirai ,數量並不多。   繼日本市場之後,Toyota 的氫燃料電池車即將登陸美國加州。Mirai 的最大特色在於它的動力源自氫燃料電池,不像一般電動車必須進行充電,而是以補充氫氣的方式,做為燃料電池化學變化產生電力的原料,可輸出 153hp 及 34.2kgm 的最大動力,並擁有約 480km 的續航里程,且將用完的氫氣儲存槽補充至滿只需約 3 分鐘,和目前一般大眾加油的時間相去不遠。   Mirai 在 2014 年底已經率先在日本上市,售價約新台幣 183 萬,並在上市首月就創下 1,500 輛的銷售佳績。如今 Mirai 也即將在美國加州開賣,售價 57,000 美金 (約合新台幣 178 萬元) 的售價與日本市場相去不遠。Toyota 將提供 Mirai 車主 3 年的免費氫燃料,以及 8 年的氫燃料電池系統元件保固服務。    

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

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

※帶您來看台北網站建置台北網頁設計,各種案例分享

一分鐘帶你學會利用mybatis-generator自動生成代碼!

目錄

之前的文章介紹了XML配置方式整合的過程,本文介紹下利用Mybatis-generator生成xml、dao、entity的過程。

一、MyBatis Generator簡介

MyBatis Generator是MyBatis官方提供的代碼生成器,可以生成xml、dao、entity。

官網介紹見:http://mybatis.org/generator/

二、使用方式

MyBatis Generator的使用方式有4種:

  • 命令行生成
  • Maven方式生成
  • 使用Ant任務生成
  • 使用Java代碼生成

本文將使用Intel IDEA+Maven方式生成代碼,因為集成和使用比較簡單,配置完成后直接雙擊運行即可。

三、實戰

首先新建一個SpringBoot項目spring-mybatis-generator,然後按照下面步驟操作。

  1. pom.xml中配置plugin
<!-- 引入mybatis-generator 插件 -->
<plugin>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-maven-plugin</artifactId>
    <version>1.3.2</version>
    <configuration>
        <!-- mybatis-generator的配置文件,根據情況調整位置 -->
        <configurationFile>src/main/resources/mybatis-generator.xml</configurationFile>
        <verbose>true</verbose>
        <overwrite>true</overwrite>
    </configuration>
    <executions>
        <execution>
            <id>Generate MyBatis Artifacts</id>
            <goals>
                <goal>generate</goal>
            </goals>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.2</version>
        </dependency>
    </dependencies>
</plugin>
  1. 修改mybatis-generator.xml文件

上一步pom.xml中指定了一個配置文件,所以在resources目錄下新建mybatis-generator.xml,MyBatis Generator通過這個配置文件才可以進行如下操作:

  • 如何連接到數據庫
  • 生成什麼對象,以及如何生成它們
  • 哪些表應用於對象生成

完整內容下面會有,需要注意的是。

JDBC驅動jar的路徑一定要寫絕對路徑。
JDBC驅動jar的路徑一定要寫絕對路徑。
JDBC驅動jar的路徑一定要寫絕對路徑。

重要的事情說3遍。

mybatis-generator.xml完整內容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>

    <!--JDBC驅動jar包的 絕對路徑 -->
    <!--JDBC驅動jar包的 絕對路徑 -->
    <!--JDBC驅動jar包的 絕對路徑 -->
    <classPathEntry location="C:\Users\java_suisui\.m2\repository\mysql\mysql-connector-java\5.1.39\mysql-connector-java-5.1.39.jar"/>

    <!--defaultModelType="flat" 大數據字段,不分表 -->
    <context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
        <property name="autoDelimitKeywords" value="true" />
        <property name="beginningDelimiter" value="`" />
        <property name="endingDelimiter" value="`" />
        <property name="javaFileEncoding" value="utf-8" />
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin" />

        <plugin type="org.mybatis.generator.plugins.ToStringPlugin" />

        <!-- 註釋 -->
        <commentGenerator >
            <property name="suppressAllComments" value="true"/><!-- 是否取消註釋 -->
            <property name="suppressDate" value="true" /> <!-- 是否生成註釋代時間戳-->
        </commentGenerator>

        <!--數據庫鏈接地址賬號密碼-->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/demo"
                        userId="root"
                        password="123456">
        </jdbcConnection>

        <!-- 類型轉換 -->
        <javaTypeResolver>
            <!-- 是否使用bigDecimal, false可自動轉化以下類型(Long, Integer, Short, etc.) -->
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!--生成Model類存放位置-->
        <javaModelGenerator targetPackage="com.example.springbootmybatis.generator.entity" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!-- 生成mapxml文件 -->
        <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources" >
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>

        <!-- 生成mapxml對應client,也就是接口dao -->
        <javaClientGenerator targetPackage="com.example.springbootmybatis.generator.dao" targetProject="src/main/java" type="XMLMAPPER" >
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>

        <table tableName="user" enableCountByExample="true" enableUpdateByExample="true" enableDeleteByExample="true" enableSelectByExample="true" selectByExampleQueryId="true">
            <generatedKey column="id" sqlStatement="Mysql" identity="true" />
        </table>

        <table tableName="user_role" enableCountByExample="true" enableUpdateByExample="true" enableDeleteByExample="true" enableSelectByExample="true" selectByExampleQueryId="true">
            <generatedKey column="id" sqlStatement="Mysql" identity="true" />
        </table>

    </context>
</generatorConfiguration>
  1. 生成代碼

點擊IntelIDEA右側的“Maven Projects”,找到spring-boot-mybatis-generator下面的mybatis-generator:generate,雙擊運行,日誌中出現“BUILD SUCCESS”說明代碼已生成。

運行截圖:

生成代碼截圖:

運行日誌:

[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building spring-boot-mybatis-generator 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- mybatis-generator-maven-plugin:1.3.2:generate (default-cli) @ spring-mybatis-generator ---
[INFO] Connecting to the Database
[INFO] Introspecting table user
log4j:WARN No appenders could be found for logger (org.mybatis.generator.internal.db.DatabaseIntrospector).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
[INFO] Introspecting table user_role
[INFO] Generating Record class for table user
[INFO] Generating Mapper Interface for table user
[INFO] Generating SQL Map for table user
[INFO] Generating Record class for table user_role
[INFO] Generating Mapper Interface for table user_role
[INFO] Generating SQL Map for table user_role
[INFO] Saving file UserMapper.xml
[INFO] Saving file UserRoleMapper.xml
[INFO] Saving file User.java
[INFO] Saving file UserMapper.java
[INFO] Saving file UserRole.java
[INFO] Saving file UserRoleMapper.java
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

到此利用mybatis-generator自動生成代碼已經全部介紹完成了,有問題歡迎留言溝通哦!

完整源碼地址:

推薦閱讀

限時領取免費Java相關資料,涵蓋了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo/Kafka、Hadoop、Hbase、Flink等高併發分佈式、大數據、機器學習等技術。
關注下方公眾號即可免費領取:

本文由博客一文多發平台 發布!

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

【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

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

※帶您來看台北網站建置台北網頁設計,各種案例分享

伊朗政府宣布:鈾濃縮作業不再受核協議限制

摘錄自2020年1月6日中央社德黑蘭報導

伊朗政府6日指出,將進一步縮減對於2015年核子協議的承諾,鈾濃縮作業將不再受到核子協議限制,但德黑蘭當局仍會持續跟國際原子能總署(IAEA)合作。

伊朗國營電視台報導,伊朗將不再遵守核協議中對於核子作業的任何限制,包括針對伊朗的濃縮鈾離心機數量、濃縮鈾產量、濃縮鈾純度、核子研究及研發等限制。

德黑蘭當局還指出,如果美國取消對伊朗的制裁措施,他們可以迅速取消這些違反核協議限制的舉措。

伊朗原本就預計會在週末宣布對於2015年核協議的最新立場,但恰逢美國軍方3日出動無人機在伊拉克首都巴格達擊殺伊朗革命衛隊聖城部隊(Quds Force)指揮官蘇雷曼尼(Qassem Soleimani),讓敵對情勢大幅升溫。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

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

※帶您來看台北網站建置台北網頁設計,各種案例分享