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
如果你觉得本文对你有帮助,请点一下左下角的“好文要顶”和“收藏该文”