福特將在2020年之前投資45億美元開發純電動車

美國福特汽車公司將在2020年之前集中投資45億美元用於純電動汽車的開發。

這是迄今為止福特面向純電動車領域的最大一筆投資。該公司將首先在2016年下半年上市新 款純電動車“福克斯”,續航距離約160公里,可進行高速充電,30分鐘就可充滿電池的約80%。包括混合動力、插電式混動(PHV)、純電動產品在內, 計畫在2020年之前推出13款產品。

車輛投放對象市場除美國和歐洲外,還設想了今後純電動領域的市場有望擴大的臺灣、韓國、中國大陸等亞洲地區。尤其是中國大陸的大氣污染嚴重,不排放尾氣的純電動享受政府的優厚補貼。福特在2013年之前一直與豐田汽車共同開展面向皮卡的混合動力技術,但此次似乎準備獨自開發。

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

【其他文章推薦】

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

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

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

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

非洲南部乾旱嚴重 農民欠收動物死亡

摘錄自2020年2月20日公視報導

近幾年非洲南部遭遇嚴重的乾旱,降雨量每況愈下,雨季也一年比一年短,導致農民無法收成。連當地的動物都因為沒有水可以喝,數量減少一大半。有專家認為,這種情況可能將成為常態。

在過去的五年間,非洲南部平均氣溫上升的速度是全球的兩倍,從南非、辛巴威到尚比亞,到處都在缺水。雨季一年比一年短,受害最深的就是靠天吃飯的農夫。

尚比亞的一個村莊收成僅剩往年3成,農民欲哭無淚。而在南非,有農夫失去6成的牲畜,綿羊生產後沒有羊奶可餵養孩子,農夫只能忍痛拋棄剛出生的小羊。

另一方面,高度仰賴野生動物生態的觀光業,也因為動物大量死亡而遭受衝擊。位於南非的生態觀光地點——格魯伯斯普,已經有大量的水牛、河馬和條紋羚消失。原本這個地區的年降雨量平均250毫米,但是現在要五年才有這個數量。

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

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

台灣海運大陸貨務運送流程

兩岸物流進出口一站式服務

每天3分鐘操作系統修鍊秘籍(17):進程間通信(3):套接字

套接字

套接字(Socket)用於協調不同計算機上的進程間通信,也就是基於網絡的通信。當然,也可以在本機上使用套接字進行進程間的通信。

套接字通信的方式非常多,有Unix域套接字、TCP套接字、UDP套接字、鏈路層套接字等等。但最常用的肯定是TCP套接字。所以,這裏介紹下TCP Socket通信方式,稍後再單獨介紹Unix域套接字。

TCP Socket用於客戶端、服務端的基於TCP協議的通信,所以在客戶端和服務端均需要創建一個套接字。創建TCP套接字時會返回這個套接字的文件描述符,可通過這個文件描述符對套接字進行讀和寫操作。

對比一下,當一個程序需要對一個磁盤文件同時進行讀寫操作(在命令行下似乎沒有找到這種命令,但通過編程方式是很容易實現的)時,由於只通過單個文件描述符同時負責讀和寫,很可能需要通過不斷移動文件指針的方式來改變讀寫的位置,否則數據很容易錯亂。

而TCP套接字也是通過單個文件描述符進行讀寫套接字的,為了保證讀和寫的位置不錯亂,操作系統在內核空間為每個TCP套接字維護了兩個buffer空間,一個buffer用於寫、一個buffer用於讀。提供讀的buffer空間稱為recv buffer,提供寫的buffer空間稱為send buffer,它們統稱為socket buffer

所以,服務端和客戶端通過兩個套接字通信就簡單了,一端向send buffer寫數據,該buffer的數據會通過已經建立好的TCP連接發送到另一端的recv buffer,於是另一端只需從recv buffer中讀數據即可實現不同計算機上的進程間通信。過程如圖。

Unix域套接字

Unix域套接字是套接字的一種,用於本機進程間通信,一般用來實現雙向通信的管道。Unix域套接字是比網絡套接字輕量級且高效的多,因為它不涉及網絡通信,不需要監聽連接,不需要綁定地址,不需要關心協議類型,等等。

創建Unix域套接字后返回兩個文件描述符,這兩個文件描述符均對套接字可讀、可寫,從而實現全雙工的雙向通信。

同樣的,為了避免使用單個文件描述符同時讀、寫造成的數據錯亂,Unix域套接字也有兩個buffer空間。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

台灣海運大陸貨務運送流程

兩岸物流進出口一站式服務

Asciinema:你的所有操作都將被錄製

如何實現類似於Jumpserver koko一樣的終端錄製回放功能呢?本文介紹一個神器

asciinema 是一款開源免費的終端錄製工具,它可以將命令行輸入輸出的任何內容加上時間保存在文件中,同時還提供方法在終端或者web瀏覽器中進行回放

asciinema的錄製和播放都是基於文本的,相比傳統的video有很多好處,例如錄製文件體積小,在播放的過程中可以暫停複製其中的文本內容等等

同時asciinema還提供了一個網站,你如果願意還可以將錄製的內容上傳至進行展示,也可以在這裏找到很多有趣的終端錄像

asciinema由以下三個子項目構成:

  1. asciinema:基於命令行的終端會話記錄器
  2. asciinema.org:提供API供上傳錄像和展示的網站
  3. javascript player:用於在web上播放錄像的js播放器

asciinema的安裝和使用都非常簡單,一起來看看吧

安裝

asciinema為python開發,可以直接通過apt-getyum或者pip進行安裝

# apt-get install asciinema

安裝完成后查看版本

# asciinema --version
asciinema 2.0.2

asciinema有v1和v2兩個版本,差異較大,咖啡君使用了v2,以下所有內容也基於v2演示

asciinema有5個參數,分別為錄製:rec,播放:play,以文件形式查看錄製內容:cat,上傳文件到asciinema.org網站:upload、asciinema.org賬號認證:auth,本文主要說明recplay的使用

錄製

# asciinema rec ops-coffee.cast

有幾個參數可以使用:

--stdin 表示啟用標準輸入錄製,意思是通常情況下linux輸入密碼類的信息都不會显示,如果開啟了這個選項,可以記錄鍵盤輸出的密碼,但這個功能官方似乎還沒有支持,加了后看不到效果

--append 添加錄製到已存在的文件中

--raw 保存原始STDOUT輸出,無需定時信息等

--overwrite 如果文件已存在,則覆蓋

-c 要記錄的命令,默認為$SHELL

-e 要捕獲的環境變量列表,默認為SHELL,TERM

-t 後跟数字,指定錄像的title

-i 後跟数字,設置錄製時記錄的最大空閑時間

-y 所有提示都輸入yes

-q 靜默模式,加了此參數在進入錄製或者退出錄製時都沒有提示

輸入exit或按ctrl+D組合鍵退出錄製

播放

# asciinema play ops-coffee.cast 

有兩個參數可以使用:

-s 後邊跟数字,表示用幾倍的速度來播放錄像

-i 後邊跟数字,表示在播放錄像時空閑時間的最大秒數

在播放的過程中你可以通過空格來控制暫停或播放,也可以通過ctrl+c組合鍵來退出播放,當你按空格鍵暫停時,可以通過.號來逐幀显示接下來要播放的內容

文件

asciinema推薦的文件後綴是.cast,當然linux是不關心文件後綴的,你用什麼都可以,推薦按規範使用.cast,文件內容大概如下

# cat ops-coffee.cast
{"version": 2, "width": 237, "height": 55, "timestamp": 1572646909, "env": {"SHELL": "/bin/bash", "TERM": "linux"}, "title": "ops-coffee"}
[0.010014, "o", "root@onlinegame:~# "]
[1.296458, "o", "exit"]
[1.976439, "o", "\r\n"]
[1.976532, "o", "exit\r\n"]

cast文件主要有兩部分組成,位於第一行的一個字典,這裏叫header

{
    "version": 2,
    "width": 237,
    "height": 55,
    "timestamp": 1572646909,
    "env": {
        "SHELL": "/bin/bash",
        "TERM": "linux"
    },
    "title": "ops-coffee"
}

header很簡單,字段的意思分別為:version版本,width和height分別表示錄製窗口的寬高,timestamp錄製開始的時間戳,env錄製時指定的-e參數設置,title錄製時指定的-t參數設置

接下來的都是固定格式的內容,實際上就是IO流信息

[0.010014, "o", "root@onlinegame:~# "]

每一行都是由三部分組成的一個列表

第一部分為一個浮點數,表示輸入輸出這一行內容所花的時間

第二部分似乎是一個固定的字符串,沒有找到說明做什麼用的

第三部分就是具體的輸入輸出的內容

這個文件格式設計還是非常優雅的,開頭header聲明,後邊具體內容,如果中途因為任何意外導致錄像終止,也不會丟失整個錄像,而且還可以append增加錄像,這在需要長時間暫停錄製時非常有用,更重要的是可以流式讀取,幾乎很少佔用內存,不需要把整個錄像文件都放在內存中,對長時間的錄製播放更友好

自動錄製審計日誌

如果你有經歷過嚴格的IT審計,或者有用到堡壘機,就會知道操作過程是需要記錄並加入審計的,如果你有因為不知道是誰操作了什麼導致了數據被刪而背鍋的經歷,就會知道對操作過程的記錄有多麼的重要,接下來以一個簡單的案例來介紹asciinema有什麼樣的實用價值

如果希望能夠將linux服務器上devuser的所有操作過程都記錄下來,以備後續審計使用,該如何實現呢?

非常簡單,只需要在devuser用戶的家目錄下添加.bash_profile文件即可,內容如下:

$ cat ~/.bash_profile 
export LC_ALL=en_US.UTF-8
/usr/local/bin/asciinema rec /tmp/$USER-$(date +%Y%m%d%H%M%S).log -q

添加export LC_ALL=en_US.UTF-8的原因是有可能系統會報錯asciinema needs a UTF-8 native locale to run. Check the output of locale command.

rec命令進行錄製時添加了-q參數,這樣在進入或者退出時都不會有任何關於asciinema的提示,使用簡單方便

這樣devuser用戶每次登陸就會自動開啟一個錄像,如果需要審計或檢查操作,只需要回放錄像就可以了

你可能會說history命令一樣可以記錄用戶操作,asciinema有什麼優勢呢?asciinema不僅可以記錄用戶的輸入,還可以記錄系統的輸出,也就是說history只能記錄執行的命令,而asciinema還可以記錄執行的結果,怎麼樣,是不是很方便,趕緊試試吧

相關文章推薦閱讀:

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

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

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

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

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

小三通物流營運型態?

※快速運回,大陸空運推薦?

日本密室會議干預審查 火山灰影響核電廠 安全堪虞

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

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

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

台灣海運大陸貨務運送流程

兩岸物流進出口一站式服務

阿拉伯世界首座核電廠 准運轉

摘錄自2020年2月18日聯合新聞網報導

阿拉伯聯合大公國17日宣布,已向阿拉伯世界第一座核電廠「巴拉卡核電廠」四個機組中的一個核發運轉執照,開啟歷史新頁。

巴拉卡核電廠坐落在波斯灣沿岸、首都阿布達比西方,原定2017年底服役,但數度延後,官方說是要符合安全標準和政府規範。阿布達比政府上月說,巴拉卡核電廠將在數月內運轉。

全球最大石油出口國沙烏地阿拉伯曾說,打算建造16個核電機組,但一直沒實現。巴拉卡核電廠由韓國電力公社主導的企業集團建造,耗資244億美元(約台幣7300億元)。如果四個機組都全速運轉,將能產生5600百萬瓦的電力,能滿足阿聯全國四分之一的電力需求。

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

【其他文章推薦】

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

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

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

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

小三通物流營運型態?

※快速運回,大陸空運推薦?

全球批評升溫 日本將收緊燃煤發電設備出口條件

摘錄自2020年2月25日中央社報導

日本環境大臣小泉進次郎(Shinjiro Koizumi)今(25日)表示,日本收緊出口燃煤發電設備條件的審查報告將在6月底前發布。

路透社報導,在日本政府支持印尼、越南興建燃煤發電廠及日本蓋新的燃煤發電廠,引起全球批評後,小泉進次郎做上述宣布。小泉進次郎在記者會上表示,這項討論將為日本於12月籌劃的新基礎設施出口政策勾勒輪廓。

在現行政策下,當有國家或如果有國家需要選擇以燃煤作為發電來源,並向日本請求提供高效能的燃煤發電技術時,日本將會支持。

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

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

台灣海運大陸貨務運送流程

兩岸物流進出口一站式服務

預防全球災難 末日種子庫收6萬新種子樣本

摘錄自2020年2月25日中央社報導

挪威北極圈內的「末日種子庫」今(25日)預計將收到來自世界各地的6萬個種子樣本。這個全球最大農作物儲藏庫為了保護作物免於全球性災難,而囤積各類種子。

這些種子將寄存在挪威斯瓦巴群島(Svalbard)內斯匹次柏根島(Spitsbergen Island)朗葉比(Longyearbyen)附近的深山中,距離北極點(North Pole)約1000公里。

法新社報導,掌管種子庫的作物信託基金(Crop Trust)執行長施密茲(Stefan Schmitz)說:「隨著氣候變遷和生物多樣性喪失的速度增加,針對瀕臨滅絕作物的拯救工作產生新的急迫性。」

最新運送的一批將讓種子庫藏提升至約105萬種,這些種子放置在種子庫的三座地窖,這個種子庫被譽為糧食作物的「諾亞方舟」。

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

【其他文章推薦】

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

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

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

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

小三通物流營運型態?

※快速運回,大陸空運推薦?

氣候風險應納入企業稽核 全球會計師公會聯盟發起倡議

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

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

【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

台灣海運大陸貨務運送流程

兩岸物流進出口一站式服務

HNU_團隊項目_數據庫框架Mybatis_環境配置和樣例,IDEA項目搭建四——使用Mybatis實現Dao層

前言

數據庫從最傳統的JDBC連接方式和數據庫池化技術Hibernate的使用,再到Mybatis的快捷輕量級操作,技術迭代的速度飛快。

在了解了基礎的理論和方法后,學習前沿編程框架、工具,我認為是一種必然的趨勢。

再不看看外面,可能真的要落伍了~

之後,我借團隊項目開發的機會,學習了Mybatis框架,和大家分享一下經驗,願意和大家共同進步!

 

正文

從零開始

參考: 

1. 下載Mybatis的,並且導入

  點擊連接,選擇下載Mybatis的jar包。這裡有三個文件,基礎使用的話,下載第一個mybatis-3.5.3.zip即可,如果需要查看源碼的話,建議將Source code也下載下來,Windows使用zip,Ubuntu使用tar.gz;

  Eclipse導入只要build puth即可,IDEA的話,在File->Project Structure里導入jar;(建議在項目內建一個lib文件夾,便於遷移)

  只是數據庫部分的話,以下兩個包便足夠了。

 

 

2. 新建Java Web Application,編寫數據庫配置文件

文件名可以自定義,我設置的是Mybatis.xml。但是要放到src的根目錄下,這一點要注意。

注意

url的配置信息中 ” & ” 符號無法解析,需要變為 “ & “;

映射文件路徑以 “ / ”作為文件夾,從src作為根目錄進行訪問;

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE configuration
 3         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 4         "http://mybatis.org/dtd/mybatis-3-config.dtd">
 5 <!--上面一段是非常重要的,有了這一段,xml的配置就擁有了自動補全,這也是考量Mybatis包是否導入成功的一個方面;-->
 6 <configuration>
 7 <!--    可以兼容多種數據庫,配置多個environment,default為當前配置-->
 8     <environments default="mysql">
 9         <environment id="mysql">
10             <transactionManager type="JDBC"/>
11 <!--            使用數據庫池化技術,詳細可以看官方文檔-->
12             <dataSource type="POOLED">
13                 <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
14                 <property name="url" value="jdbc:mysql://localhost:3306/databaseName?useUnicode=true&amp;serverTimezone=GMT%2B8&amp;characterEncoding=utf-8"/>
15                 <property name="username" value=username"/>
16                 <property name="password" value="password"/>
17             </dataSource>
18         </environment>
19     </environments>
20 <!--    映射文件路徑,需要告訴數據庫,要執行哪些操作,以及數據庫實體類和字段的對應關係,接下來進行解釋-->
21     <mappers>
22         <mapper resource="main/mapper/UserMapper.xml"/>
23     </mappers>
24 </configuration>

 

3. 編寫執行SQL語句的SqlSessionFactory

  可以編寫工具類或者工廠類,避免代碼重複。我這裏設置的是DBTools.java

 1 package main.dao;
 2 
 3 import org.apache.ibatis.io.Resources;
 4 import org.apache.ibatis.session.SqlSession;
 5 import org.apache.ibatis.session.SqlSessionFactory;
 6 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 7 
 8 import javax.annotation.Resource;
 9 import java.io.IOException;
10 import java.io.InputStream;
11 
12 /*
13 Comet_Fei
14 2019/11/17
15 */
16 public class DBTools
17 {
18     private static SqlSessionFactory sqlSessionFactory;
19 
20     static
21     {
22         try
23         {
24             //輸入流讀取文件 Resources Mybatis的自帶加載類
25             InputStream config = Resources.getResourceAsStream("mybatis.xml");
26             //工廠設計模式
27             sqlSessionFactory = new SqlSessionFactoryBuilder().build(config);
28         }
29         catch (IOException e)
30         {
31             e.printStackTrace();
32         }
33     }
34 
35     //創建可以執行映射文件sql的sqlsession
36     public static SqlSession getSqlSession()
37     {
38         return sqlSessionFactory.openSession();
39     }
40 }

 

4. 編寫表對應的實體類User.java

 此處可用IDEA的pojo快捷操作,生成對應實體;

package main.pojo;


public class User {

    private String userPhoneNumber;private String userName;private String userPassword;public User(String userPhoneNumber, String userName, String userPassword) {
        this.userPhoneNumber = userPhoneNumber;
        this.userName = userName;
        this.userPassword = userPassword;
    }

    public String getUserPhoneNumber() {
        return userPhoneNumber;
    }

    public void setUserPhoneNumber(String userPhoneNumber) {
        this.userPhoneNumber = userPhoneNumber;
    }public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }public String getUserPassword() {
        return userPassword;
    }

    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
    }

    @Override
    public String toString() {
        return "User{" +
                "userPhoneNumber='" + userPhoneNumber + '\'' +
                ", userName='" + userName + '\'' +
                ", userPassword='" + userPassword + '\'' +
                '}';
    }
}

 

 

5. 編寫實體管理類映射接口UserMapper.java

  UserMapper接口和Mybatis的映射xml文件相對應,便於操作和使用

 

 1 package main.mapper;
 2 
 3 import main.pojo.User;
 4 
 5 import java.util.List;
 6 
 7 /*
 8 Comet_Fei
 9 2019/11/17
10 */
11 public interface UserMapper
12 {
13     int addUser(User user);
14     User getUser(String userPhoneNumber);
15     int deleteUser(String userPhoneNumber);
16     int setPassword(User user);
17     List<User> listUser();
18 
19 }

 

5. 編寫映射文件UserMapper.xml

  這類文件非常重要,會將數據庫表和Java代碼的pojo(bean)進行映射,極大的簡化了操作步驟,減小代碼量。

參數說明:

  • resultMap是數據庫表和實體的Map映射設置,在使用時,只要加入 resultMap=”userResultMap” 參數即可,如select語句;
  • parameterType是傳入的參數類型,如果傳入參數較多的話,可以使用實體類傳參,但是要寫明實體類全路徑;(還沒有學習複雜語句,所以這裏只是簡單介紹)
  • resultType是返回值類型,但是不能和resultMap同時存在;
  • 傳參方式如代碼所示,用  ${ } 標識參數,和接口一致;
  • namespace是全路徑,訪問到當前對應Map的接口文件;
  • 注意傳參的數據類型,如果是字符型或者String,需要用單引號包含,如: ‘${userName}’ 
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="main.mapper.UserMapper">
    <resultMap id="userResultMap" type="main.pojo.User">
        <result property="userPhoneNumber" column="user_phone_number"/>
        <result property="headPictureId" column="head_pictureId"/>
        <result property="rolePowerId" column="role_power_id"/>
        <result property="userName" column="user_name"/>
        <result property="userPersonalAutograph" column="user_personal_autograph"/>
        <result property="userPassword" column="user_password"/>
        <result property="userSex" column="user_sex"/>
        <result property="userEmail" column="user_email"/>
        <result property="userAddress" column="user_address"/>
        <result property="userUploadNumbers" column="user_upload_numbers"/>
    </resultMap>

    <!--    添加用戶-->
    <insert id="addUser" parameterType="main.pojo.User">
        INSERT INTO user(user_phone_number, user_name, user_password)
        VALUES ('${userPhoneNumber}', '${userName}', '${userPassword}');
    </insert>
    <!--    刪除用戶-->
    <delete id="deleteUser" parameterType="String">
        DELETE FROM user WHERE user_phone_number = '${userPhoneNumber}';
    </delete>

    <!--    獲得賬號為user_phone_number的用戶-->
    <select id="getUser" resultMap="userResultMap">
        SELECT * FROM user WHERE user_phone_number = '${userPhoneNumber}';
    </select>

    <!--    獲得用戶列表-->
    <select id="listUser" resultType="main.pojo.User">
        SELECT * FROM user;
    </select>

    <!--    找回密碼-->
    <update id="setPassword" parameterType="main.pojo.User">
        UPDATE user SET user_password = ${userPassword} WHERE user_phone_number = '${userPhoneNumber}';
    </update>

</mapper>

 

 

6. 最後是操作層(DAO)UserDao.java

  因為操作層有特定的業務,這裏只是一個示意而已。java裏面的main函數可以進行局部測試,便於和前端、控制器(servlet)等對接。

 1 package main.dao;
 2 
 3 import main.mapper.UserMapper;
 4 import main.pojo.User;
 5 import org.apache.ibatis.session.SqlSession;
 6 
 7 import java.io.IOException;
 8 
 9 /*
10 Comet_Fei
11 2019/11/17
12 */
13 public class UserDao {
14 //    定義dao內的sqlSession和映射接口mapper
15     private SqlSession sqlSession;
16     private UserMapper mapper;
17 
18     public UserDao()
19     {
20 //        通過工廠,初始化session;通過特有getMapper設置映射接口
21         sqlSession = DBTools.getSqlSession();
22         mapper = sqlSession.getMapper(UserMapper.class);
23     }
24 
25     //添加用戶 成功1 失敗0
26     public int addUser(String userPhoneNumber, String userPassword) throws IOException
27     {
28         //用戶的 手機號,姓名(默認手機號),密碼
29         User user = new User(userPhoneNumber,userPhoneNumber, userPassword);
30         int result = mapper.addUser(user);
31         sqlSession.commit();
32         System.out.println(result);
33         return result;
34     }
35 
36     //用戶登錄 短信 成功2;失敗0
37     public int right(String userPhoneNumber)
38     {
39         int result;
40         User user = mapper.getUser(userPhoneNumber);
41         if(user != null)
42         {
43             result = 2;//登錄成功
44         }
45         else
46         {
47             result = 0;//登錄失敗
48         }
49         sqlSession.commit();
50         return result;
51     }
52 
53     //用戶登錄 手機 密碼 成功2;密碼錯誤1;手機號錯誤0
54     public int right(String userPhoneNumber, String userPassword)
55     {
56         int result;
57         User user = mapper.getUser(userPhoneNumber);
58         if((user != null)&&(userPassword.equals(user.getUserPassword())))
59         {
60             result = 2;//登錄成功
61         }
62         else if(user != null)
63         {
64             result = 1;//密碼錯誤
65         }
66         else
67         {
68             result = 0;//此手機號未註冊
69         }
70         sqlSession.commit();
71         return result;
72     }
73 
74     //刪除用戶 成功是1,不成功是0
75     public int deleteUser(String userPhoneNumber)
76     {
77         int result = mapper.deleteUser(userPhoneNumber);
78         sqlSession.commit();
79         return result;
80     }
81 
82     //重設密碼
83     public int setPassword(String userPhoneNumber, String userPassword)
84     {
85         User user = new User(userPhoneNumber, userPhoneNumber, userPassword);
86         return mapper.setPassword(user);
87     }
88     public static void main(String[] args) throws IOException {
89         UserDao dao = new UserDao();
90 //        System.out.println(dao.deleteUser("111")); //刪除用戶
91 //        dao.addUser("111","111");// 添加用戶
92 //        System.out.println(dao.right("11"));//短信登錄;
93 //        System.out.println(dao.right("111","111"));//短信登錄;
94         System.out.println(dao.setPassword("111","111"));
95     }
96 }

 

以上為全部內容,之後還會寫一些關於IDEA操作上的快捷鍵,如,IDEA如何連接數據庫、快速生成pojo實體類等的博客。

如果運行異常,歡迎留言交流,共同進步!

這裏特別感謝博客: 

 

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

台灣海運大陸貨務運送流程

兩岸物流進出口一站式服務