Intellj IDEA 簡易教程

Intellj IDEA 簡易教程

目錄

Java開發IDE(Integrated Development Environment,集成開發環境),大多圖書上使用的是EclipsesNetBeans,考慮到咱們課程會涉及到Android開發,而用於Android開發的IDE Android Studio(CN)是在Intellij IDEA上構建的,因此咱們上課推薦的IDE是Intellij IDEAphp

Intellij IDEA是收費軟件,但對學生和老師免費,能夠到這裏申請無償使用html

IDEA的使用過程當中要慢慢掌握經常使用的快捷鍵(哪一個經常使用就刻意記憶一下,參考十大Intellij IDEA快捷鍵).IDEA的快捷鍵以下圖所示:java

返回目錄
mysql

JDK 安裝測試

Linux下安裝JDK

  1. 參考「程序開發與信息安全工具箱」,下載並安裝JDK
  2. Linux 版JDK下載後

使用tar -xzvf jdk-8u121-linux-x64.tar.gz; mv jdk-8u121 ~/jdk 進行解壓(注意時間不一樣,xuxxx會不一樣),而後經過vi .bashrc 添加下面幾行設置環境變量:linux

export JAVA_HOME=~/jdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  1. 參考「程序開發與信息安全工具箱」,下載並安裝Atom.android

  2. 參考別出心裁的Linux命令學習法,使用mkdir -p Code/20155200 (改爲本身的學號)創建學習目錄。git

Windows下安裝JDK

  1. 參考「程序開發與信息安全工具箱」,下載並安裝JDK;詳細過程參考JDK8圖解安裝

注意:安裝JDK選擇安裝目錄,安裝過程當中會出現兩次安裝提示:第一次是安裝JDK,第二次是安裝Public JRE。建議JDK安裝在本身選擇的目錄中,Public JRE安裝在默認目錄中。(不能都安裝在Java文件夾的根目錄下,JDK和Public JRE安裝在同一文件夾會出錯)程序員

  1. 沒有DOS命令基礎的同窗先學習「Java程序設計的DOS命令基礎」,參考相關內容github

  2. 參考「程序開發與信息安全工具箱」,下載並安裝Atom.web

  3. 參考「程序開發與信息安全工具箱」,下載並安裝PowerCMD。參考Java程序設計的DOS命令基礎學習DOS命令的使用。

  4. 打開PowerCMD,使用mkdir Code\20155200(改爲本身的學號)創建工做目錄。

macOS下安裝JDK

參考「程序開發與信息安全工具箱」,下載並安裝JDK

測試JDK

  1. 進入命令行界面(shell或PowerCMD)
  2. 輸入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類,路徑見下圖中紅框:
圖片描述信息

  1. 輸入javac -d . Hello.java命令編譯代碼,輸入java ljp.Hello命令運行
    程序。結果以下圖所示:
    編譯運行
    注意:代碼中有package時,使用javac編譯代碼時必定要加-d參數,運行代碼時必定要加包名前綴

返回目錄

IDEA 安裝測試

IDEA的安裝在Linux,Windows,macOS下安裝都差很少,咱們以Windows下的安裝爲例說明。

  1. 經過Toolbox App下載網站 下載相應平臺的Toolbox App並安裝:
  2. 運行Toolbox App並安裝Intellj IDEA Ultimate:
  3. 第一次運行IDEA,會讓你選擇是否導入之前的設置,咱們選擇不導入
  4. 插件安裝咱們選擇默認安裝:
  5. IDEA中經過項目(Project)管理代碼,咱們經過「Create New Project」新建一個項目:
  6. 第一次新建項目要配置JDK,選擇左邊列表中的「Java」,點擊右方的New按鈕:
  7. 選擇配置JDK:
  8. 選中你係統中JDK的安裝目錄:
  9. JDK配置成功:
  10. 點擊「Next」按鈕:
  11. 輸入項目名稱「HelloWorld」,點擊「Finish」按鈕,項目就建好了:
  12. 幾個經常使用快捷鍵,經過應用熟練掌握了:
  13. 按「Alt+1」顯示項目視圖:
  14. 用鼠標在「src」上點擊右鍵,選擇「New」->「Java Class」新建Java類:
  15. 輸入類名「HelloWorld」:
  16. 在代碼編輯窗口中輸入「psvm」,而後按「tab」,IDEA會幫咱們生成main方法:

  17. 在代碼編輯窗口中輸入「sout」,而後按「tab」,IDEA會幫咱們生成System.out.println(),這是使用IDE的便利之處:

  18. 修改代碼,讓程序輸出「Hello World!」:
  19. 經過「Run」->「Run...」來編譯,運行程序,建議你們觸經過實踐掌握快捷鍵「Alt+Shift+F10」:
  20. 選中要運行的類「Hello World」:
  21. 運行結果以下:

返回目錄

調試

程序設計中有三類錯誤:

  • 編譯時錯誤:語法錯誤,初學者易犯
  • 運行時錯誤:異常處理
  • 邏輯錯誤:能編譯運行,但運行結果不對

邏輯錯誤是你們學習中遇到最多的錯誤,要學會經過調試(Debug)來定位邏輯錯誤,經常使用技能有:

  • 自頂向下進行調試
  • 學會設置斷點(行斷點/函數斷點/條件斷點/臨時斷點)
  • 學會單步運行
  • 循環的調試
  • 函數(方法)的調試
  • 二分法定位錯誤
  • ...

在命令行中調試Java程序參考Java中使用JDB,咱們在這學習在IDEA中調試程序。

  1. 在上面的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}
  1. 調試程序首先要會設置斷點單步運行。設置斷點比較簡單,在要設置斷點的行號旁用鼠標單擊一下就好了(或使用Ctrl+F8快捷鍵),以下圖所示,咱們在第5行設了個斷點:
  2. 而後單擊菜單「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。以下圖所示:
  3. 單步執行效率比較慢,若是咱們感受到第5行到第8行的代碼沒有問題了,想讓程序直接運行到第9行,怎麼辦?首先咱們要在第9行設置斷點,而後單擊Resume圖標(快捷鍵F9),程序就運行到了第11行,以下圖所示:
  4. 單步執行效率比較慢還致使另一個問題,好比一個大循環中間出了問題怎麼辦?這時能夠經過條件斷點解決問題。設置條件斷點,咱們在第9行左邊斷點處單擊鼠標右鍵,彈出斷點屬性框,咱們設置條件「i==50」,以下圖所示:

    按一下F9,咱們能夠查看i的是50了。以下圖所示:
  5. 臨時斷點,斷點只中斷一次,好比咱們想把第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,以下圖.
  6. 方法斷點:有時候咱們懷疑某個方法出錯了,就能夠設置方法斷點。把光標移到方法中的任一行,使用菜單「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時才能知其然,也知其因此然。

返回目錄

代碼規範

現代軟件工程講義 3 代碼規範與代碼複審中說:

現代軟件產業通過幾十年的發展,已經不可能出現一我的單槍匹馬完成一個軟件的事情了,軟件都是在相互合做中完成的。

多人合做必定要有個共同的代碼規範,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

參考 Android開發簡易教程

返回目錄

數據庫

咱們以MySQL爲例,建議參考「程序開發與信息安全工具箱」安裝XAMPP,咱們後面以XAMPP爲例說明。若是下載的XAMPP是Portable版的,解壓後注意先運行一下setup_xampp.bat,使用軟件時讀讀readme 會解決很多問題。

setup

  • JDBC(Java DataBase Connectivity)
    • api
    • ddi
  • 驅動的四種類型
    • 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,

phpadmin

使用XAMPP中的PHPAdmin 建好數據庫並進行測試。建數據庫的SQL語句: CREATE SCHEMA demo;

createdb

後面還要用到一個留言板的表,建這個數據庫表的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」微信公衆號(手機上長按二維碼)

作中教,作中學,實踐中共同進步!

rocedu



若是你以爲本文對你有幫助,請點一下左下角的「好文要頂」和「收藏該文

相關文章
相關標籤/搜索