• 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 Code20155200(改成自己的学号)建立工作目录。

    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类,路径见下图中红框:
    图片描述信息
    3. 输入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:Users13015AppDataLocalJetBrainsToolboxappsIDEA-Uch-1171.4073.35libjunit.jar”

    我们在IDEA中选择菜单File->Project Structure...,

    在弹出的对话框中选择Dependancies标签页,单击+号,选择JARs or Directories...,输入上面找到的“C:Users13015AppDataLocalJetBrainsToolboxappsIDEA-Uch-1171.4073.35libjunit.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	%s	%s	%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



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


  • 相关阅读:
    HIVE之 Sqoop 1.4.6 安装、hive与oracle表互导
    Sqoop之 Sqoop 1.4.6 安装
    PIG之 Hadoop 2.7.4 + pig-0.17.0 安装
    hadoop之 node manager起不来, 执行mapreduce 程序hang住
    Maven 简介
    graphviz 的节点形状
    graphviz 的绘图布局
    Graphviz 的命令行参数说明
    golang使用graphviz
    IDEA 项目相关基础设置
  • 原文地址:https://www.cnblogs.com/rocedu/p/6371315.html
Copyright © 2020-2023  润新知