Intellj IDEA 简易教程

Intellj IDEA 简易教程

目录

Java开发IDE(Integrated Development Environment,集成开发环境),大多图书上使用的是EclipsesNetBeans,考虑到我们课程会涉及到Android开发,而用于Android开发的IDE Android Studio(CN)是在Intellij IDEA上构建的,所以我们上课推荐的IDE是Intellij IDEA

Intellij IDEA是收费软件,但对学生和老师免费,可以到这里申请免费使用

IDEA的使用过程中要慢慢掌握常用的快捷键(哪个常用就刻意记忆一下,参考十大Intellij IDEA快捷键).IDEA的快捷键如下图所示:

返回目录

JDK 安装测试

Linux下安装JDK

  1. 参考「程序开发与信息安全工具箱」,下载并安装JDK
  2. 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
  1. 参考「程序开发与信息安全工具箱」,下载并安装Atom.

  2. 参考别出心裁的Linux命令学习法,使用mkdir -p Code/20155200 (改成自己的学号)建立学习目录。

Windows下安装JDK

  1. 参考「程序开发与信息安全工具箱」,下载并安装JDK;详细过程参考JDK8图解安装

注意:安装JDK选择安装目录,安装过程中会出现两次安装提示:第一次是安装JDK,第二次是安装Public JRE。建议JDK安装在自己选择的目录中,Public JRE安装在默认目录中。(不能都安装在Java文件夹的根目录下,JDK和Public JRE安装在同一文件夹会出错)

  1. 没有DOS命令基础的同学先学习「Java程序设计的DOS命令基础」,参考相关内容

  2. 参考「程序开发与信息安全工具箱」,下载并安装Atom.

  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



如果你觉得本文对你有帮助,请点一下左下角的“好文要顶”和“收藏该文


posted @ 2017-02-06 18:00 娄老师 阅读(...) 评论(...) 编辑 收藏