一、开篇
许多人在初接触Java的时候,都会被各种Java的英文缩写名词给弄得头晕脑胀。看一个技术,内容里又会有一堆其他的技术名词,看了半天不知所云。尝试去查一下这些名词的解释,除了非常学术性的解释之外,很少会有更详细更明白的描述。例如JNDI,也就是Java Naming and Directory Interface的缩写,中文意思是Java命名和目录接口[1]。看完中文解释,里面就有三个不懂的名词,"命名"、"目录"和"接口",这都什么意思?然后继续深入查一下去,越看发现越多不懂,学习的兴趣也就没有了。本文希望能通过简单的说明和举例,将平时工作中经常遇到的名词进行解释,让初学者能对其有一个更感性的认识。
牵涉Java的名词有很多,有中文,有英文,有跟Java语言有关,有跟Java技术体系有关,要全面归纳起来的话,估计可以成部字典。所以不可能在一篇文章中包揽全部内容。我会抽取平时生产上经常遇到的、看文章经常看到的,听高手讨论时经常听到的一些名词分几篇文章,进行深入一点的解释,希望能解大家的部分惑。
二、JRE、JDK、SDK
关于JRE与JDK间的关系,在上一节《Java之路——Java初接触》中已经讲过,这里在深入讲一下。先说一下这两个是什么英文的缩写。
JRE:Java Runtime Environment
JDK:Java Development Kit
从英文可以看出,JRE是Java的运行环境,JDK是Java的开发工具包。那顾名思义,要运行Java程序,就一定要用到JRE,要开发Java程序,就要用到JDK。那JRE与JDK会不会有什么关系呢?接着,我们回顾一下Oracle官网上的Java SE 8的组成描述[2]:
大家从图中可以看到,JRE包含了Java虚拟机、Java基础类库等一系列需要运行Java的环境。而JDK除了包含JRE有的东西以外,同时多了开发时所需要用到的如javac等Tools和Tools API的内容。也就是说,JRE是JDK的一个子集,JDK包含了JRE的所有内容。也许细心的朋友也发现了,在官网上下载JDK安装的时候,会在JDK的目录下包含一个JRE,如图:
有些初学开发者在配Eclipse的JRE环境的时候就惆怅了,究竟要配JDK呢,还是配JRE呢。看完上面那个图,问题应该就解决了。JDK除含有JRE的内容外,还包括开发的工具等内容,所以要是一个开发者,那就应该配JDK作为JRE环境了。
最后来说说SDK有时什么东西。SDK英文全称是Software Development Kit,翻译成中文就是软件开发工具包,一般都是一些软件工程师为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件时的开发工具的集合[3]。所以我们也可以说,JDK是Java的SDK。
三、API
API,英文全称是Application Programming Interface,中文意思是应用程序编程接口。那接口又是什么东西呢?我们可以简单的想象成,接口就是我们的那些插座,只要我们把符合要求的插头插上插座,不用理插座怎么实现,能都用得上电。编程中的接口也是同样的道理,我们不需要关心接口的具体实现,只需要按照接口定义好的规则去调用,就可能实现想要的效果,这就是接口。那说回API,理解完接口(Interface)后,看回API的全称,大概就应该了解它指的是提供给编程人员调用的一些封装了实现的接口。具体到我们编程的时候,经常说"这个怎么用,查一下API",意思通常就是查一下API的说明文档。例如要查一下Java基础类中某个类怎么用,通常就是上Oracle的官网上查相关文档:http://docs.oracle.com/javase/8/docs/api/。
例如上图,我们就可以看到,BufferedInputStream类中有什么方法,各个方法有什么用,怎么调用,返回什么结果。查完后,我们就会使用了。
四、IDE
IDE,英文全称是Integrated Development Environment,中文意思是集成开发环境,也就是提供给开发人员进行程序开发的应用程序,包括但不限于编辑器、编译器、调试器和图形用户界面等工具。例如我们用于Java开发的Eclipse就是一个IDE。
.Net范畴开发使用的Visual Studio系列也是.Net开发的IDE。
五、JDBC
JDBC,英文全称是Java Data Base Connectivity,中文意思是Java数据库连接,是一种用于执行SQL语句的Java API。参考上部分对API的解释,可知道JDBC提供了一个基准,数据库厂商与第三方中间件厂商根据基准实现对数据库的调用。而开发人员只需根据JDBC API的标准来进行数据库的调用,无需理会后面的怎么实现的。由于JDBC API提供了统一的接口,所以不管你是调用Sql Server,还是Oracle,还是Mysql,写好的代码都不需要怎么改动。这也是实现接口的好处所在。
要实现一个JDBC程序,简单分为下面六个步骤[4]:
1.引入JDBC类所需要的包。
2.注册JDBC驱动程序,所谓驱动程序,可以简单理解为实现了JDBC接口的那些类集合。
3.打开一个连接
4.执行一个查询
5.从结果中提取数据
6.清理环境
代码示例及注释如下:
六、JVM
说到JVM,相信大伙们都听得很多,觉得是个深奥的东西,但又不知道深奥在哪里,不明觉厉了。这里并不打算对其展开很深入的讲解,因为内容可以写成一本书了,只是对其的重要作用作一些描述,让大家有个概念,知道它究竟用来干什么的。
我们首先来看看JVM的英文全称为:Java Virtual Machine,中文意思则为Java虚拟机。顾名思义,它是一种根据计算设备规范,虚构出来的计算机。还记得在《Java之路——Java初接触》里面说过,Java出来的口号是"Write Once,Run Anywhere"吗?JVM就是实现这一功能的关键。怎么实现呢?先看一下网上的一幅图[5]:
我们抓住图中的几个关键词:Java源文件、Java字节码、类装载器、Java虚拟机(JVM)和硬件,来简单说一下JVM怎么实现Write Once, Run Anywhere。其实原理很简单,任务Java源代码,通过Java编译器后,都很根据统一的规则,编译成Java字节码,也就是我们的那堆class文件。只要是同一套源代码生成出来的Java字节码就是一样的。但是不同的机器,有不同的底层硬件,那同一套字节码怎么在不同的硬件环境中运行了?这就要靠JVM了。类装载器将字节码装载到Java虚拟机(JVM)中,JVM就会根据所运行在的操作系统、硬件平台上的不同,最终生成不同的硬件指令,从而可以在指定的操作系统及硬件上运行。也就是说,无论你什么操作系统、硬件,只要在其上安装了Java虚拟机(JVM),JVM就能将输入的Java字节码转换到指定的机器指令运行,从而屏蔽了底层运行平台的差别,实现"Write Once,Run Anywhere"的目标了。
JVM除了是实现"Write Once,Run Anywhere"这一功能的关键之外,Java程序运行时候的内存溢出、性能、
垃圾回收、数据存放(堆、栈、方法区等)等内容都是JVM所涉及的。这里附上JVM的一个体系结构图[6],给大家有个印象。
七、POJO、DTO、VO、BO、MO
这变成里面,明明就是一个类,但又会被赋予了各种称呼。当大家讲一大堆VO、PO、BO、DTO、POJO后,相信你马上会被O晕。究竟这些O有是个啥意思呢?这里我大概解释一下常见的几个O。
POJO,英文全称Plain Old Java Object,其实主要是对比重量级的EJB2.x来说,它描述的是一个轻量级的Java对象。它说的就是一个很普通的,很常规的,没有加特效进去的Java对象,也就是我们21天学会Java等书上学到的Java对象。之所以起个POJO的名字,估计是因为大家认为有个名字的对象更有吸引力。事实上也如此!
VO,英文全称Value Object,值对象。其实就如java.lang.Integer这种保存值的对象。这种值对象,我们通常认为是不会随着时间而变化的,是固定的。所以通常我们要修改一个值对象(VO)的时候,我们是要创建一个新的,而非直接更新的内部的数据。
DTO,英文全称Data Transfer Object,中文意思为数据传输对象。顾名思义,就是用来在网络中传输数据的。根据下图[7],我们可以看到DTO在整个应用中的位置:
一个简单的应用程序通常有三部分组成:数据访问层(DAL)、业务逻辑层和表现层。图中的Client端相当于表现层。可以看到,Client将用户输入的数据包装成DTO后,传输到Service进行业务逻辑的处理,处理完后,又包装成DTO传输回去给Client端做表现层的展示。DTO就是这样的一个对象。通常我们用到的是贫血的DTO,也就是DTO中只有数据(属性),没有行为(方法)。
在图中,大家还看到BO和MO,就是Bussiness Object和Model Object的缩写。其实就是对应层的一些用于存储数据的对象。那为什么各层要分这么多不同的Object,我认为主要原因有这几点:
1.各层处理的数据并不一样,将数据转换成该层所使用要到的对象方便处理。
2.从数据库里提取的数据,最终到表现层未必是全部用上的,实际用到什么数据就建立什么对象,以减少层与层之间的数据传输。
3.各层处理的事情不一样,把不必要的内容传到某层上,会有安全风险。也就是说不同的层使用不同的Object可以提高安全性。
八、DAO
DAO,英文全称Data Access Object,中文意思是数据访问对象。看上去跟DTO只差1个字,有些人会混淆。但其实DAO跟DTO没有啥关系,所以大家别太纠结。那回归正题,DAO用来干什么呢?DAO主要用途就是与数据库打交道,提供数据访问的接口,让业务逻辑调用相关方法操作数据库,是加载业务逻辑层与数据库资源中间的层。DAO的例子网上一大堆,我就不重新写了,在网上找了一个,把DAO的接口类和具体实现类抽取出来,给大家看看[8]。
定义接口类:
import java.util.List; import cn.mldn.lxh.vo.Emp; public interface IEmpDAO { public boolean doCreate(Emp emp) throws Exception; public List<Emp> findAll(String keyWord) throws Exception; public Emp findByid(int empno) throws Exception; }
具体实现类:
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; import cn.mldn.lxh.dao.IEmpDAO; import cn.mldn.lxh.vo.Emp; public class EmpDAOImpl implements IEmpDAO { private Connection conn=null; //数据库连接对象 private PreparedStatement pstmt = null;//数据库操作对象 public EmpDAOImpl(Connection conn){//通过构造方法取得数据库连接 this.conn=conn; } public boolean doCreate(Emp emp) throws Exception { boolean flag=false; String sql="INSERT INTO emp (empno,ename,job,hiredate,sal)VALUES(?,?,?,?,?)"; this.pstmt=this.conn.prepareStatement(sql);//实例化PreparedStatement对象 this.pstmt.setInt(1, emp.getEmpno()); this.pstmt.setString(2, emp.getEname()); this.pstmt.setString(3, emp.getJob()); this.pstmt.setDate(4, new java.sql.Date(emp.getHiredate().getTime())); this.pstmt.setFloat(5, emp.getSal()); if(this.pstmt.executeUpdate()>0){ flag=true; } this.pstmt.close(); return false; } public List<Emp> findAll(String keyWord) throws Exception { List<Emp> all= new ArrayList<Emp>(); String sql="SELECT empno,ename,job,hiredate,sal FROM emp WHERE ename LIKE ? OR job LIKE ?"; this.pstmt=this.conn.prepareStatement(sql); this.pstmt.setString(1, "%"+keyWord+"%"); this.pstmt.setString(2, "%"+keyWord+"%"); ResultSet rs=this.pstmt.executeQuery(); Emp emp=null; while(rs.next()){ emp=new Emp(); emp.setEmpno(rs.getInt(1)); emp.setEname(rs.getString(2)); emp.setJob(rs.getString(3)); emp.setHiredate(rs.getDate(4)); emp.setSal(rs.getFloat(5)); all.add(emp); } this.pstmt.close(); return all; } public Emp findByid(int empno) throws Exception { Emp emp=null; String sql="SELECT empno,ename,job,hiredate,sal FROM emp WHERE empno=?"; this.pstmt = this.conn.prepareStatement(sql); this.pstmt.setInt(1, empno); ResultSet rs = this.pstmt.executeQuery(); if(rs.next()){ emp = new Emp(); emp.setEmpno(rs.getInt(1)); emp.setEname(rs.getString(2)); emp.setJob(rs.getString(3)); emp.setHiredate(rs.getDate(4)); emp.setSal(rs.getFloat(5)); } this.pstmt.close(); return emp; } }
由于涉及JAVA的名词,限于篇幅,先对上面几个名词作解释。后续会分几章进行补充解释,大家有什么需要了解的,也可以留言,我会尽量解答大家的问题。
九、参考资料:
[1] 百度百科:http://baike.baidu.com/link?url=r1i6GgQ-q4jPrYQ2LOnLASZPW-7DpvHgWh51yfA-YIIREPJa0-YQr36pwmSFFU7O_tryTm7poFhCIyrWsOsK8_
[2] Java Platform Standard Edition 8 Documentation,2017.1.12取自http://docs.oracle.com/javase/8/docs/index.html
[3] 百度百科:http://baike.baidu.com/link?url=h-aUqkRLEPgmTNM22OE370lrfUtjynUz-1uTHbPQfzyIczmZ8EnLfP2Oed6ann4n5OBbyGfadP2m1eRUlnhZtK
[4] JDBC快速入门教程:http://www.yiibai.com/jdbc/jdbc_quick_guide.html
[5] (第6讲)jdk,JRE,JVM:<http://blog.sina.com.cn/s/blog_bf75829f0102wkmm.html>
[6] 【转】JVM介绍:http://www.cnblogs.com/sunada2005/p/3577799.html
[7] DTO – 服务实现中的核心数据:http://www.cnblogs.com/loveis715/p/4379656.html
[8] Java中的DAO设计模式应用举例 ------> 来自Java WEB 开发实战经典http://blog.csdn.net/hanxuehen/article/details/7074805>