Intellj IDEA 簡易教程
目錄
Java開發IDE(Integrated Development Environment,集成開發環境),大多圖書上使用的是Eclipses或NetBeans,考慮到我們課程會涉及到Android開發,而用於Android開發的IDE Android Studio(CN)是在Intellij IDEA上構建的,所以我們上課推薦的IDE是Intellij IDEA。
Intellij IDEA是收費軟件,但對學生和老師免費,可以到這里申請免費使用。
IDEA的使用過程中要慢慢掌握常用的快捷鍵(哪個常用就刻意記憶一下,參考十大Intellij IDEA快捷鍵).IDEA的快捷鍵如下圖所示:
JDK 安裝測試
Linux下安裝JDK
- 參考「程序開發與信息安全工具箱」,下載並安裝JDK
- Linux 版JDK下載后
使用tar -xzvf jdk-8u121-linux-x64.tar.gz; mv jdk-8u121 ~/jdk
進行解壓(注意時間不同,xuxxx會不同),然后通過vi .bashrc
添加下面幾行設置環境變量:
export JAVA_HOME=~/jdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
-
參考「程序開發與信息安全工具箱」,下載並安裝Atom.
-
參考別出心裁的Linux命令學習法,使用
mkdir -p Code/20155200
(改成自己的學號)建立學習目錄。
Windows下安裝JDK
- 參考「程序開發與信息安全工具箱」,下載並安裝JDK;詳細過程參考JDK8圖解安裝
注意:安裝JDK選擇安裝目錄,安裝過程中會出現兩次安裝提示:第一次是安裝JDK,第二次是安裝Public JRE。建議JDK安裝在自己選擇的目錄中,Public JRE安裝在默認目錄中。(不能都安裝在Java文件夾的根目錄下,JDK和Public JRE安裝在同一文件夾會出錯)
-
沒有DOS命令基礎的同學先學習「Java程序設計的DOS命令基礎」,參考相關內容
-
參考「程序開發與信息安全工具箱」,下載並安裝Atom.
-
參考「程序開發與信息安全工具箱」,下載並安裝PowerCMD。參考Java程序設計的DOS命令基礎學習DOS命令的使用。
-
打開PowerCMD,使用
mkdir Code\20155200
(改成自己的學號)建立工作目錄。
macOS下安裝JDK
參考「程序開發與信息安全工具箱」,下載並安裝JDK:
測試JDK
- 進入命令行界面(shell或PowerCMD)
- 輸入
atom Hello.java
(注意把代碼保存到exp1目錄中)或vim Hello.java
(建議大家花點時間學習一下Vim)編輯Hello.java,並輸入以下代碼:
1 package ljp;
2 import java.util.Scanner;
3 public class Hello{
4 public static void main(String[] args){
5 System.out.println("Input your first name, please:");
6 Scanner s = new Scanner(System.in);
7 String name = s.next();
8 System.out.println("Hello " + name + " !");
9 }
10 }
注意代碼的第一行,這會影響到我們使用javac編譯代碼的方式。
注意代碼第二行,我們使用到Java類庫中的類時,要用import導入相關的類(你可以暫時理解為C語言中include的功能),導入路徑可以查看JDK幫助文檔,比如我們使用到了Scanner類,路徑見下圖中紅框:
3. 輸入javac -d . Hello.java
命令編譯代碼,輸入java ljp.Hello
命令運行
程序。結果如下圖所示:
注意:代碼中有package時,使用javac編譯代碼時一定要加-d參數,運行代碼時一定要加包名前綴。
IDEA 安裝測試
IDEA的安裝在Linux,Windows,macOS下安裝都差不多,我們以Windows下的安裝為例說明。
- 通過Toolbox App下載網站 下載相應平台的Toolbox App並安裝:
- 運行Toolbox App並安裝Intellj IDEA Ultimate:
- 第一次運行IDEA,會讓你選擇是否導入以前的設置,我們選擇不導入
- 插件安裝我們選擇默認安裝:
- IDEA中通過項目(Project)管理代碼,我們通過「Create New Project」新建一個項目:
- 第一次新建項目要配置JDK,選擇左邊列表中的「Java」,點擊右方的
New
按鈕:
- 選擇配置JDK:
- 選中你系統中JDK的安裝目錄:
- JDK配置成功:
- 點擊「Next」按鈕:
- 輸入項目名稱「HelloWorld」,點擊「Finish」按鈕,項目就建好了:
- 幾個常用快捷鍵,通過應用熟練掌握了:
- 按「Alt+1」顯示項目視圖:
- 用鼠標在「src」上點擊右鍵,選擇「New」->「Java Class」新建Java類:
- 輸入類名「HelloWorld」:
- 在代碼編輯窗口中輸入「psvm」,然后按「tab」,IDEA會幫我們生成main方法:
- 在代碼編輯窗口中輸入「sout」,然后按「tab」,IDEA會幫我們生成
System.out.println()
,這是使用IDE的便利之處:
- 修改代碼,讓程序輸出「Hello World!」:
- 通過「Run」->「Run...」來編譯,運行程序,建議大家觸通過實踐掌握快捷鍵「Alt+Shift+F10」:
- 選中要運行的類「Hello World」:
- 運行結果如下:
調試
程序設計中有三類錯誤:
- 編譯時錯誤:語法錯誤,初學者易犯
- 運行時錯誤:異常處理
- 邏輯錯誤:能編譯運行,但運行結果不對
邏輯錯誤是大家學習中遇到最多的錯誤,要學會通過調試(Debug)來定位邏輯錯誤,常用技能有:
- 自頂向下進行調試
- 學會設置斷點(行斷點/函數斷點/條件斷點/臨時斷點)
- 學會單步運行
- 循環的調試
- 函數(方法)的調試
- 二分法定位錯誤
- ...
在命令行中調試Java程序參考Java中使用JDB,我們在這學習在IDEA中調試程序。
- 在上面的HelloWorld項目中,新建「HelloJDB」類,輸入如下代碼:
1 public class HelloJDB {
2 public static void main(String[] args) {
3 int i = 5;
4 int j = 6;
5 int sum = add(i, j);
6 System.out.println(sum);
7
8 sum = 0;
9 for(i=0; i< 100; i++)
10 sum += i;
11
12 System.out.println(sum);
13 }
14
15 public static int add(int augend, int addend){
16 int sum = augend + addend;
17 return sum;
18 }
19}
- 調試程序首先要會設置斷點和單步運行。設置斷點比較簡單,在要設置斷點的行號旁用鼠標單擊一下就行了(或使用
Ctrl+F8
快捷鍵),如下圖所示,我們在第5行設了個斷點:
- 然后單擊菜單「Run」->「Debug...」(或使用
Alt+Shift+F9
快捷鍵)開始調試Java程序,我們可以看到程序停留在了第5行,如下圖所示:
注意,此時第5行代碼並沒有執行,我們看到變量sum的值並不是11,我們通過單步運行讓程序運行到第6行,單步運行有兩種:Step Into(快捷捷F7)和Step Over(快捷捷F8),這兩種單步運行功能在運行語句時沒有區別,在執行方法調用語句時,Step Into
會跳入方法實現,Step Over
會直接執行完方法,實際使用中我們優先使用Step Over
,只有方法執行出錯了,說明程序問題在被調用方法中,這時再回來通過Step Into
進入方法進行調試。我們單擊一下Step Over
圖標(或F8
),程序停在了第5行,這時查看變量i的值,會看到sum等於11。如下圖所示:
- 單步執行效率比較慢,如果我們感覺到第5行到第8行的代碼沒有問題了,想讓程序直接運行到第9行,怎么辦?首先我們要在第9行設置斷點,然后單擊
Resume
圖標(快捷鍵F9
),程序就運行到了第11行,如下圖所示:
- 單步執行效率比較慢還導致另外一個問題,比如一個大循環中間出了問題怎么辦?這時可以通過條件斷點解決問題。設置條件斷點,我們在第9行左邊斷點處單擊鼠標右鍵,彈出斷點屬性框,我們設置條件“i==50”,如下圖所示:
按一下F9,我們可以查看i的是50了。如下圖所示:
- 臨時斷點,斷點只中斷一次,比如我們想把第9,10行的for循環一下子運行完,我們就需要在第12行設個條件斷點。我們可以在第十二行設個斷點,然后鼠標右擊斷點:
然后點「More」或按快捷鍵Ctrl+Shift+F8
打開斷點設置窗口,選中「Remove Once hit」
也可以把光標移到第12行,兩次按快捷鍵Ctrl+Shift+F8
打開斷點設置窗口,選中「Remove Once hit」;最簡單的方法是把光標移到第12行,使用菜單「Run」->「Toggle Temporary Line Breakpoint」或使用快捷鍵Ctrl+Alt+Shift+F8
;斷點上面有個1,運行一次就消失了:
解決問題的方法也可以不使用臨時斷點,把光標移到第12行,使用菜單「Run」->「Run to Cursor」或使用快捷鍵Alt+F9
,如下圖. - 方法斷點:有時候我們懷疑某個方法出錯了,就可以設置方法斷點。把光標移到方法中的任一行,使用菜單「Run」->「Toggle Method Breakpoint」.
掌握這些調試的基本技巧可以解決大家平時遇到的大部分問題,其他調試方法可以參見參考資料。
單元測試
Java編程的學習 《積極主動敲代碼,使用JUnit學習Java》給出了學習方法。其中提到的JUnit就是Java單元測試工具。
現代軟件工程講義 2 開發技術 - 單元測試 & 回歸測試中說:
你的RP是由你的程序質量決定的。
這一章講的是兩人合作,既然程序是兩個人寫的,那就會出現一個人寫的模塊被另一個人寫的模塊調用的情況。很多誤解、疏忽都發生在兩個模塊之間。如何能讓自己寫的模塊盡量無懈可擊?單元測試就是一個很有效的解決方案。
什么是單元測試?單元測試(unit testing),是指對軟件中的最小可測試單元進行檢查和驗證。對於單元測試中單元的含義,一般來說,要根據實際情況去判定其具體含義,如Java里單元指一個類。
編程是智力活動,不是打字,編程前要把干什么、如何干想清楚才能把程序寫對、寫好。與目前不少同學一說編程就打開編輯器寫代碼不同,我希望同學們養成一個習慣,當你們想用程序解決問題時,要會寫三種碼:
- 偽代碼
- 產品代碼
- 測試代碼
我們通過一個例子說明如何寫這三種代碼。
需求:我們要在一個
MyUtil
類中解決一個百分制成績轉成“優、良、中、及格、不及格”五級制成績的功能。
我們先寫偽代碼
,偽代碼可以用漢語寫,推薦大家用英語寫,偽代碼與具體編程語言無關,不要寫與具體編程語言語法相關的語句(如用malloc分配內存
,這樣只能用C語言編程了),偽代碼
從意圖層面來解決問題,最終,偽代碼
是產品代碼
最自然的、最好的注釋。針對上面的問題,我們可以通過偽代碼這樣解決:
百分制轉五分制:
如果成績小於60,轉成“不及格”
如果成績在60與70之間,轉成“及格”
如果成績在70與80之間,轉成“中等”
如果成績在80與90之間,轉成“良好”
如果成績在90與100之間,轉成“優秀”
其他,轉成“錯誤”
簡單吧?想用編程來解決問題,首先要用偽代碼
表明自己想明白了。
有了偽代碼
,我們用特定編程語言翻譯一下,就是可用的產品代碼
了,當然,我們在這要選用Java,小菜一碟了,翻譯好的MyUtil.java
如下:
public class MyUtil{
public static String percentage2fivegrade(int grade){
//如果成績小於60,轉成“不及格”
if (grade < 60)
return "不及格";
//如果成績在60與70之間,轉成“及格”
else if (grade < 70)
return "及格";
//如果成績在70與80之間,轉成“中等”
else if (grade < 80)
return "中等";
//如果成績在80與90之間,轉成“良好”
else if (grade < 90)
return "良好";
//如果成績在90與100之間,轉成“優秀”
else if (grade < 100)
return "優秀";
//其他,轉成“錯誤”
else
return "錯誤";
}
}
我們在IDEA中建一個項目,輸入上面的代碼:
產品代碼
寫完了,如果別人要使用這個代碼,把MyUtil.java
拷給他就可以了。但是作為負責任的你,肯定會擔心自己的程序會有Bug。如果別人用自己的代碼發現一堆Bugs,那多沒面子!怎么辦?寫了產品代碼
,我們還要寫測試代碼
,證明自己的代碼沒有問題。Java編程時,程序員對類實現的測試叫單元測試
。類XXXX
的單元測試
,我們一般寫建一個XXXXTest
的類,針對MyUtil
類我們寫一個MyUtilTest.java
的測試模塊,代碼如下:
public class MyUtilTest {
public static void main(String[] args) {
// 百分制成績是50時應該返回五級制的“不及格”
if(MyUtil.percentage2fivegrade(50) != "不及格")
System.out.println("test failed!");
else
System.out.println("test passed!");
}
}
這里我們設計了一個測試用例(Test Case)
,測試用例
是為某個特殊目標而編制的一組測試輸入、執行條件以及預期結果,以便測試某個程序路徑或核實是否滿足某個特定需求。這里我們的測試輸入是“50”,預期結果是“不及格”。
在 IDEA中我們把產品代碼放在src
目錄中,把測試代碼放在test
目錄中,右鍵單擊項目,在彈出的菜單中選擇New->Directory
新建一個目錄:
輸入目錄名test
:
test
目錄中放的也是Java代碼,但IDEA不知道test
中放的是源代碼。在命令行中我們知道要設置SOURCEPATH
環境變量,在IDEA中我們右鍵單擊test
目錄,在彈出的菜單中選擇Mark Directory as->Test Sources Root
就可以了:
在IDEA中運行結果如下,測試結果符合預期:
只有一組輸入的測試是不充分的,我們把一般情況都測試一下,代碼如下:
public class MyUtilTest {
public static void main(String[] args) {
//測試正常情況
if(MyUtil.percentage2fivegrade(55) != "不及格")
System.out.println("test failed!");
else if(MyUtil.percentage2fivegrade(65) != "及格")
System.out.println("test failed!");
else if(MyUtil.percentage2fivegrade(75) != "中等")
System.out.println("test failed!");
else if(MyUtil.percentage2fivegrade(85) != "良好")
System.out.println("test failed!");
else if(MyUtil.percentage2fivegrade(95) != "優秀")
System.out.println("test failed!");
else
System.out.println("test passed!");
}
}
在Eclipse中運行結果如下,測試結果符合預期:
我們不能只測試正常情況,下面看看異常情況如何,比如輸入為負分或大於100的成績,代碼如下:
public class MyUtilTest {
public static void main(String[] args) {
//測試出錯情況
if(MyUtil.percentage2fivegrade(-10) != "錯誤")
System.out.println("test failed 1!");
else if(MyUtil.percentage2fivegrade(115) != "錯誤")
System.out.println("test failed 2!");
else
System.out.println("test passed!");
}
}
運行程序發現負分時與期望不一致,終於找到了一個bug,原因是判斷不及格時沒有要求成績大於零。我們修改MyUtil.java
,增加對負分的判斷,代碼如下:
public class MyUtil{
public static String percentage2fivegrade(int grade){
//如果成績小於0,轉成“錯誤”
if ((grade < 0))
return "錯誤";
//如果成績小於60,轉成“不及格”
else if (grade < 60)
return "不及格";
//如果成績在60與70之間,轉成“及格”
else if (grade < 70)
return "及格";
//如果成績在70與80之間,轉成“中等”
else if (grade < 80)
return "中等";
//如果成績在80與90之間,轉成“良好”
else if (grade < 90)
return "良好";
//如果成績在90與100之間,轉成“優秀”
else if (grade < 100)
return "優秀";
//如果成績大於100,轉成“錯誤”
else
return "錯誤";
}
}
再次運行測試,測試結果符合預期,如下圖所示:
測試夠了嗎?還不夠,一般代碼在邊界處最容易出錯,我們還沒有測試邊界情況,我們對輸入為“0,60,70,80,90,100”這些邊界情況進行測試的代碼如下:
public class MyUtilTest {
public static void main(String[] args) {
//測試邊界情況
if(MyUtil.percentage2fivegrade(0) != "不及格")
System.out.println("test failed 1!");
else if(MyUtil.percentage2fivegrade(60) != "及格")
System.out.println("test failed 2!");
else if(MyUtil.percentage2fivegrade(70) != "中等")
System.out.println("test failed 3!");
else if(MyUtil.percentage2fivegrade(80) != "良好")
System.out.println("test failed 4!");
else if(MyUtil.percentage2fivegrade(90) != "優秀")
System.out.println("test failed 5!");
else if(MyUtil.percentage2fivegrade(100) != "優秀")
System.out.println("test failed 6!");
else
System.out.println("test passed!");
}
}
測試結果如下:
我們發現邊界情況中輸入100時有一個Bug。我們修改MyUtil.java
,把判斷優秀的條件中包含輸入為100的情況,代碼如下:
public class MyUtil{
public static String percentage2fivegrade(int grade){
//如果成績小於0,轉成“錯誤”
if ((grade < 0))
return "錯誤";
//如果成績小於60,轉成“不及格”
else if (grade < 60)
return "不及格";
//如果成績在60與70之間,轉成“及格”
else if (grade < 70)
return "及格";
//如果成績在70與80之間,轉成“中等”
else if (grade < 80)
return "中等";
//如果成績在80與90之間,轉成“良好”
else if (grade < 90)
return "良好";
//如果成績在90與100之間,轉成“優秀”
else if (grade <= 100)
return "優秀";
//如果成績大於100,轉成“錯誤”
else
return "錯誤";
}
}
這時測試都符合預期了,我們把MyUtil.java
提供給別人使用時,心里比較有底氣了。那如何保證單元測度是充分的呢?我們的一般要求是測試代碼
要比產品代碼
多。如何寫測試,《單元測試之道》提出了Right-BICEP
的方法,大家可以參考一下。
TDD(Test Driven Devlopment, 測試驅動開發)
前面的例子,我們先寫產品代碼
,然后再寫測試代碼
,通過測試發現了一些Bugs,提高了代碼質量。這有問題嗎?軟件開發從建築中吸取了很多營養,我們看看一個砌牆的例子,如下圖:
工人是“先把牆砌好的,再用繩子測一下牆平不平,直不直,如果不平或不直拆了重砌”,還是“先用繩子給出平和直的標准,然后靠着繩子砌牆,從而保證了牆砌出來就是又平又直的”呢?答案是不言而喻的了。
拿編程做對比,我們是該“先寫產品代碼
,然后再寫測試代碼
,通過測試發現了一些Bugs,修改代碼”,還是該“先寫測試代碼
,然后再寫產品代碼
,從而寫出來的代碼就是正確的”呢?當然先寫測試代碼了。這種先寫測試代碼
,然后再寫產品代碼
的開發方法叫“測試驅動開發”(TDD)。TDD的一般步驟如下:
- 明確當前要完成的功能,記錄成一個測試列表
- 快速完成編寫針對此功能的測試用例
- 測試代碼編譯不通過(沒產品代碼呢)
- 編寫產品代碼
- 測試通過
- 對代碼進行重構,並保證測試通過(重構下次實驗練習)
- 循環完成所有功能的開發
基於TDD,我們不會出現過度設計的情況,需求通過測試用例表達出來了,我們的產品代碼
只要讓測試通過就可以了。
Java中有單元測試工具JUnit來輔助進行TDD,我們用TDD的方式把前面百分制轉五分制的例子重寫一次,體會一下有測試工具支持的開發的好處。
IDEA中使用JUnit要安裝插件,選擇File->Setting
打開設置對話框:
在設置對話框中選擇Plugins
, 單擊Install JetBrains plugin...
按鈕打開插件安裝界面:
在插件安裝對話框的搜索中輸入junit
,單擊JunitGenerator V2.0,單擊右邊綠色的Install1
按鈕安裝:
安裝完如下:
我們在IDEA中新建一個項目,然后新建一個空類MyUtil:
鼠標單擊類名會出現一個燈泡狀圖標,單擊圖標或按Alt + Entert
,在彈出的菜單中選擇Create Test
:
我們選擇創建JUnit3的測試用例 :
在test
文件件夾中出現了MyUtilTest
測試類:
我們增加第一個測試用例testNormal
,注意測試用例前一定要有注解@Test
,測試用例方法名任意,輸入以下代碼:
import org.junit.Test;
import junit.framework.TestCase;
public class MyUtilTest extends TestCase {
@Test
public void testNormal() {
assertEquals("不及格", MyUtil.percentage2fivegrade(55));
assertEquals("及格", MyUtil.percentage2fivegrade(65));
assertEquals("中等", MyUtil.percentage2fivegrade(75));
assertEquals("良好", MyUtil.percentage2fivegrade(85));
assertEquals("優秀", MyUtil.percentage2fivegrade(95));
}
}
如果TestCase
是紅色的,需要在IDEA中的項目(模塊)中加入junit.jar
包,junit.jar
包的位置可以在Everything中查找:
如上圖:junit.jar
包的位置是“C:\Users\13015\AppData\Local\JetBrains\Toolbox\apps\IDEA-U\ch-1\171.4073.35\lib\junit.jar”
我們在IDEA中選擇菜單File->Project Structure...
,
在彈出的對話框中選擇Dependancies
標簽頁,單擊+號,選擇JARs or Directories...
,輸入上面找到的“C:\Users\13015\AppData\Local\JetBrains\Toolbox\apps\IDEA-U\ch-1\171.4073.35\lib\junit.jar”。
輸入完畢,IDEA中如下圖所示:
紅色代碼說明有語法錯誤,這是因為MyUtil
中還沒有percentage2fivegrade
方法,點擊左邊的圖標可以修復這個問題:
在percentage2fivegrade()
方法中加入一行return "錯誤";
。
大家可以看到現在測試代碼沒有語法錯誤了,在測試代碼上單擊右鍵,選擇Run 'MyTuilTest'
:
運行結果如下:
測試結果出現了一個紅條(red bar),說明測試沒通過,紅條上面匯總了測試情況,運行了一個測試,沒有錯誤,一個測試沒通過。下面原因說的也很清楚:測試代碼第十行傳入55時,期望結果是“不及格”,代碼返回了“錯誤”,修改MyUtil.Java
吧,輸入以下代碼,再運行測試,如下圖所示:
測試結果出現了一個綠條(green bar),說明測試通過了。TDD的目標是"Clean Code That Works",TDD的slogan是"Keep the bar green, to Keep the code clean",大家體會一下。
TDD的編碼節奏是:
- 增加測試代碼,JUnit出現紅條
- 修改產品代碼
- JUnit出現綠條,任務完成
我們增加一個測試異常情況的用例testException
和一個測試邊界情況的用例testBoundary
,如下圖:
如何讓JUnit的gree bar
出來,動手實驗一下,如下圖:
不管用不用TDD,寫出高質量的測試用例才是最重要的,如何進行單元測試,大家可參考一下《單元測試之道》這本書。另外,《Agile Java 中文版》展示了如何將Java和TDD進行有效的整合,通過TDD驅動項目開發,有興趣的可以參考。
重構
Git
Java的學習我是提倡首先在命令行下學習一段時間的,git也是,入門參考使用碼雲和博客園學習簡易教程。
我們學習了IDE,如何在IDEA中使用git? 我們以使用碼雲和博客園學習簡易教程中建好的項目為例。
在IDEA中,我們選擇菜單File
->New
->Project from Version Control
->git
:
彈出如下對話框,我們填上學習項目的URL,點擊Clone
按鈕,這就相當於執行命令git clone https://git.oschina.net/bestiisjava2017/ljp20155200_JavaProgramming.git
:
其中的Git Repository URL
來自碼雲:
IDEA 會詢問如何打開項目:
項目打開后,目錄都是灰的,IDEA不知道我們的源代碼在src
文件夾里,教材上說了在命令行窗口中要設置SOURCEPATH
環境,在IDEA中只要把鼠標放src
文件夾上,在右鍵菜單中選擇Make Directory as
->Sources Root
:
src
文件夾就變成藍色的了,IDEA就知道我們的源代碼在src
文件夾里了。這時,Java API中的String
,System
都是紅色的,IDEA提示我們要Setup SDK
,用鼠標點擊Setup SDK
:
如果以前設置過,選擇以前的設置,點擊OK
按鈕:
如果以前沒設置過SDK,點擊上圖中的Configure...
按鈕進行設置:
這時,Java API中的String
,System
都沒問題了:
我們運行Hello.java
,IDEA會提示沒有輸出目錄,我們要創建一個bin
文件夾,並指定為輸出目錄,點擊OK
按鈕進行設置:
在彈出對話框中點擊右鍵,選擇New Folder...
:
輸入要創建的文件夾名bin
:
bin
文件夾不應納入版本控制,我們點擊一下Excluded
,bin
文件夾變紅,不進行版本控制:
我們點擊Path
標簽,指定Output path和Test output path 都是我們剛創建的bin:
代碼在IDEA中可以編譯運行了,Hello.class也生成在bin文件夾中了:
我們修改一下代碼,增加一行,編譯運行正確:
把鼠標放到Hello.java上,右鍵菜單選擇git
->Commit File...
,這相當於命令行“git add.; git commit”:
我們選中.idea和src,並在Commit Message中輸入信息。Commit Message是git commit -m "Commit Message"中的提交信息。Commit Message的編寫參考Commit message 和 Change log 編寫指南.
點擊Commit
按鈕,我們可以選擇Commit and push
,這在提交后會執行git push
命令:
第一次執行要配置用戶名和E-mail,這相當於執行:
git config --global user.name "rocedu"
git config --global user.email "rocedu@qq.com"
輸入碼雲上的用戶名和口令就能成功上傳了:
大家注意,這個教程只是入門,大家要在實踐中發現問題,解決問題,不斷精進。學習git命令時要在命令行下學習,然后在IDEA中找相關菜單項,這樣使用IDEA時才能知其然,也知其所以然。
代碼規范
現代軟件產業經過幾十年的發展,已經不可能出現一個人單槍匹馬完成一個軟件的事情了,軟件都是在相互合作中完成的。
多人合作一定要有個共同的代碼規范,Java編程我們推薦《阿里巴巴Java開發手冊》,推薦你參加「阿里巴巴編碼規范」認證通過在線考試,檢測你對手冊中開發規范的掌握程度,並發放官方認證證書.
自《阿里巴巴Java開發手冊》發布以來,阿里對外開放了IDE檢測插件及源碼。該插件在掃描代碼后,將不符合《手冊》的代碼按block/critical/major三個等級顯示在下方;實時編寫代碼時,還會給出智能提示,告訴你如何編寫可以更優雅;對於歷史代碼,部分規則實現了批量一鍵修復的功能。
IDEA中的插件,我們通過Jetbrains官方倉庫安裝:打開 Settings
->Plugins
-> Browse repositories...
在搜索框輸入alibaba
即可看到Alibaba Java Code Guidelines
插件,點擊Install
進行安裝,然后重啟IDE生效:
使用比較簡單:在項目名稱上單擊右鍵,在彈出菜單上選擇編碼規約掃描
:
出現下圖內容:
不規范的地方,有中文提示並且定位到了行,alibaba把問題分為block/critical/major三個等級,有些規則可以一鍵修復。
Android
數據庫
我們以MySQL為例,建議參考「 程序開發與信息安全工具箱」安裝XAMPP,我們后面以XAMPP為例說明。如果下載的XAMPP是Portable版的,解壓后注意先運行一下setup_xampp.bat,使用軟件時讀讀readme 會解決不少問題。
-
JDBC(Java DataBase Connectivity)
-
驅動的四種類型
- JDBC-ODBC Bridge Driver
- Native API Driver
- JDBC-Net Driver
- Native Protocal Driver
數據庫連接測試:
- Java中連接數據庫的過程
- 注冊Driver: DriverManager.registerDriver()
- 獲取Connection: Connection conn = DriverManager.getConnection(jdbcUrl, userName, password)### ;
- 關閉Connection:
在IDEA中新建項目TestJDBC,在src中輸入示例代碼 ConnectionDemo.java:
import static java.lang.System.out;
import java.sql.*;
public class ConnectionDemo {
public static void main(String[] args)
throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");
String jdbcUrl = "jdbc:mysql://localhost:3306/demo";
String user = "root";
String passwd = "";
try(Connection conn =
DriverManager.getConnection(jdbcUrl, user, passwd)) {
out.printf("已%s數據庫連接%n",
conn.isClosed() ? "關閉" : "打開");
}
}
}
數據庫連接測試,注意數據庫用戶名,口令要根據自己的實際情況修改,我們使用XAMPP,在XAMPP的readme_en.txt中給出了MySQL的用戶名和口令:
這個默認不要口令的方式不安全,實際應用中要改為安全的口令。
在XAMPP的安裝目錄中,點擊xampp-control.exe,通過點擊Apache和MySQL的start按鈕啟動Apache服務器和MySQL數據庫:
成功啟動如下圖所示:
我們上面代碼中用到了數據庫demo,我們在瀏覽器中輸入http://localhost 或http://127.0.0.1 打開XAMPP,
使用XAMPP中的PHPAdmin 建好數據庫並進行測試。建數據庫的SQL語句: CREATE SCHEMA demo;
后面還要用到一個留言板的表,建這個數據庫表的SQL語句是:
use demo;
CREATE TABLE t_message (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name CHAR(20) NOT NULL,
email CHAR(40),
msg TEXT NOT NULL
) CHARSET=UTF8;
下載並在IDEA中配置驅動mysql-connector-java-5.1.41-bin.jar (類似單元測試中加入junit.jar的方法)
程序運行結果如下:
在XAMPP中關閉MySQL,再運行一下程序試試。
Connection代表數據庫連接,要執行SQL語句要用到 java.sql.Statement,SQL語句的執行結果會返加ResultSet對象。
我們用在IDEA中,用MessageDAO來訪問數據庫表:
import java.sql.*;
import java.util.*;
public class MessageDAO {
private String url;
private String user;
private String passwd;
public MessageDAO(String url, String user, String passwd) {
this.url = url;
this.user = user;
this.passwd = passwd;
}
public void add(Message message) {
try(Connection conn = DriverManager.getConnection(url, user, passwd);
Statement statement = conn.createStatement()) {
String sql = String.format(
"INSERT INTO t_message(name, email, msg) VALUES ('%s', '%s', '%s')",
message.getName(), message.getEmail(), message.getMsg());
statement.executeUpdate(sql);
} catch(SQLException ex) {
throw new RuntimeException(ex);
}
}
public List<Message> get() {
List<Message> messages = new ArrayList<>();
try(Connection conn = DriverManager.getConnection(url, user, passwd);
Statement statement = conn.createStatement()) {
ResultSet result =
statement.executeQuery("SELECT * FROM t_message");
while (result.next()) {
Message message = toMessage(result);
messages.add(message);
}
} catch(SQLException ex) {
throw new RuntimeException(ex);
}
return messages;
}
private Message toMessage(ResultSet result) throws SQLException {
Message message = new Message();
message.setId(result.getLong(1));
message.setName(result.getString(2));
message.setEmail(result.getString(3));
message.setMsg(result.getString(4));
return message;
}
}
用Message 封裝留言信息:
import java.io.Serializable;
public class Message implements Serializable {
private Long id;
private String name;
private String email;
private String msg;
public Message() {}
public Message(String name, String email, String msg) {
this.name = name;
this.email = email;
this.msg = msg;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
下面給出測試類MessageDAODEmo.java:
import static java.lang.System.out;
import java.util.Scanner;
public class MessageDAODemo {
public static void main(String[] args) throws Exception {
MessageDAO dao = new MessageDAO(
"jdbc:mysql://localhost:3306/demo?" +
"useUnicode=true&characterEncoding=UTF8",
"root", "");
Scanner console = new Scanner(System.in, "Big5");
while(true) {
out.print("(1) 顯示留言 (2) 新增留言:");
switch(Integer.parseInt(console.nextLine())) {
case 1:
dao.get().forEach(message -> {
out.printf("%d\t%s\t%s\t%s%n",
message.getId(),
message.getName(),
message.getEmail(),
message.getMsg());
});
break;
case 2:
out.print("姓名:");
String name = console.nextLine();
out.print("郵件:");
String email = console.nextLine();
out.print("留言:");
String msg = console.nextLine();
dao.add(new Message(name, email, msg));
}
}
}
}
運行結果如下:
數據庫實例
數據庫的學習要有一定量的數據才有實際意義。一個學生數據庫讓你編出來1000個學生出來也很難,我們可以使用http://www.fakenamegenerator.com/幫忙產生測試數據。
我們學習練習時使用MySQL的World數據庫,我們去https://dev.mysql.com/doc/index-other.html下載world.sql,並導入到MySQL中:
其他
參考資料
歡迎關注“rocedu”微信公眾號(手機上長按二維碼)
做中教,做中學,實踐中共同進步!
-
版權聲明:自由轉載-非商用-非衍生-保持署名| Creative Commons BY-NC-ND 3.0
如果你覺得本文對你有幫助,請點一下左下角的“好文要頂”和“收藏該文”