java se,java se 和j2ee区别是什么?
java se,java se 和j2ee区别是什么?详细介绍
本文目录一览: JavaSE是什么
JavaSE以前称为 J2SE,全称Java Standard Edition,译成中文就是Java标准版,是Sun推出Java平台标准版;是运行JAVA程序不可缺少的环境,也是Java的核心。后来的各种框架,各种产品都是基于JavaSE,也就是JavaSE是java向上发展的基础,Java任何高级产品的底层基础都是JavaSE,所以如果要学习,把它学扎实,牢固是很有必要的。JavaSE用于开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。Java SE 包含了支持 Java Web 服务开发的类,并为 Java Platform,JavaEE(Java企业版)、JavaME(Java微型版)提供基础。
javaEE与javaSE的区别
JavaEE是指JavaEnterpriseEdition,Java企业版,多用于企业级开发,包括web开发等等。也叫J2EE。
JavaSE通常是指JavaStandardEdition,Java标准版,就是一般Java程序的开发就可以(如桌面程序),可以看作是JavaEE的子集。
Java是一问语言,J2EE是Java语言的一门使用技术,Java为J2EE提供了库和语法,J2EE使用Java的库和语法应用在WEB上。这是概念性的区别。
更详细的解释:
Java平台有三个版本,这使软件开发人员、服务提供商和设备生产商可以针对特定的市场进行开发:
一、JavaSE(JavaPlatform,StandardEdition)。JavaSE以前称为J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的Java应用程序。JavaSE包含了支持JavaWeb服务开发的类,并为JavaPlatform,EnterpriseEdition(JavaEE)提供基础。
二、JavaEE(JavaPlatform,EnterpriseEdition)。这个版本以前称为J2EE。企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器端Java应用程序。JavaEE是在JavaSE的基础上构建的,它提供Web服务、组件模型、管理和通信API,可以用来实现企业级的面向服务体系结构(service-orientedarchitecture,SOA)和Web2.0应用程序。
javase和javaee的区别?
一、作用不同
1、Java SE:Java SE 包含了支持 Java Web服务开发的类,并为 Java Platform,Enterprise Edition(Java EE)提供基础。
2、Java EE:在javaSE的基础上,添砖加瓦后出现的一种规范;Java EE的核心是EJB3.0, 其提供了更兼便捷的企业级的应用框架。
二、包含范围不同
1、Java SE:Java SE可以看作是JavaEE的子集。
2、Java EE:Java EE包括了Java SE。
三、特点不同
1、Java SE:用Java实现的Hot Java浏览器(支持Java applet)显示了Java的魅力:跨平台、动态的Web、Internet计算。
2、Java EE:技术的基础就是核心Java平台或Java SE,Java EE不仅巩固了标准版中的许多优点。
javase是什么意思
javase:基础;入门;基础知识;核心技术;核心。 Java SE(Java Standard Edition,Java 标准版)是Java技术的核心和基础,是Java ME和Java EE编程的基础 。 扩展资料 Java SE是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称。用Java实现的Hot Java浏览器(支持Java applet)显示了Java的魅力:跨平台、动态的Web、Internet计算。从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器均支持Java applet。
标准版的Java平台是一个Java2的平台,为用户提供一个程序开发环境。这个程序开发环境提供了开发与运行Java软件的.编译器等开发工具、软件库及Java虚拟机。它也是Java2平台、企业版本和Java网页服务的基础。
Java2平台有3个版本,它们是适用于小型设备和智能卡的Java2平台Micro版(Java2 Platform Micro Edition,JavaME)、适用于桌面系统的Java 2平台标准版(Java2 Platform Standard Edition,Java SE)、适用于创建服务器应用程序和服务的Java 2平台企业版(Java2 Platform Enterprise Edition,Java EE)。
java和javase的区别?
Java是一门编程语言,是基石。Java分为三大版本,SE即标准版,包含了Java核心类库,主要用来开发桌面应用;EE即企业版,包含SE,又有扩展部分(Servlet,JDBC等),主要用来开发分布式网络程序;ME即微型版,包含了SE中部分类库,又有自己扩展部分,主要用来做移动类、嵌入式开发。JavaWeb是指使用Java体系开发网站类应用,JSP属于JavaWeb范畴,JSP可以简单看作是前端页面嵌入Java代码,会被容器编译成Servlet,然后Servlet会输出HTML代码,最终成为我们看到的页面。
java se 和j2ee区别是什么?
Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE。这三块相互补充,应用范围不同。\x0d\x0aJ2SE就是Java2的标准版,主要用于桌面应用软件的编程;\x0d\x0aJ2ME主要应用于嵌入是系统开发,如手机和PDA的编程;\x0d\x0aJ2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。 \x0d\x0a\x0d\x0a先学习j2se, 学习j2se推荐两本书,《java2核心技术一二卷》,《java编程思想》,《java模式》。其中《java编程思想》要研读,精读。这一段时间是基本功学习,时间会很长,也可能很短,这要看学习者自身水平而定。 \x0d\x0a\x0d\x0a目前常见j2eeAPI\x0d\x0aJavaServer Pages(JSP)技术1.2 \x0d\x0aJava Servlet技术2.3 \x0d\x0aJDBC API 2.0 \x0d\x0aJava XML处理API(JAXP)1.1 \x0d\x0aEnterprise JavaBeans技术2.0 \x0d\x0aJava消息服务(JMS)1.0 \x0d\x0aJava命名目录接口(JNDI)1.2 \x0d\x0aJava事务API(JTA) 1.0 \x0d\x0aJavaMail API 1.2 \x0d\x0aJavaBeans激活架构(JAF)1.0 \x0d\x0aJ2EE连接器体系结构(JCA)1.0 \x0d\x0aJava认证和授权服务(JAAS)1.0
Java进阶:在SE6中调用编译器的两种方法[2]
二 使用StandardJavaFileManager编译Java源程序
在第一部分我们讨论调用java编译器的最容易的方法 这种方法可以很好地工作 但它确不能更有效地得到我们所需要的信息 如标准的输入 输出信息 而在Java SE 中最好的方法是使用StandardJavaFileManager类 这个类可以很好地控制输入 输出 并且可以通过 DiagnosticListener得到诊断信息 而DiagnosticCollector类就是listener的实现
使用StandardJavaFileManager需要两步 首先建立一个 DiagnosticCollector实例以及通过JavaCompiler的getStandardFileManager()方法得到一个 StandardFileManager对象 最后通过CompilationTask中的call方法编译源程序
在使用这种方法调用Java编译时最复杂的方法就是getTask 下面让我们讨论一下getTask方法 这个方法有如下所示的 个参数
getTask(Writer out JavaFileManager fileManager DiagnosticListener diagnosticListener Iterable options Iterable classes Iterable pilationUnits)
这些参数大多数都可为null 它们的含义所下
·out: 用于输出错误的流 默认是System err
·fileManager: 标准的文件管理
·diagnosticListener: 编译器的默认行为
·options: 编译器的选项
·classes 参与编译的class
最后一个参数pilationUnits不能为null 因为这个对象保存了你想编译的Java文件
在使用完getTask后 需要通过 StandardJavaFileManager的getJavaFileObjectsFromFiles或 getJavaFileObjectsFromStrings方法得到pilationUnits对象 调用这两个方法的方式如下
Iterable getJavaFileObjectsFromFiles( Iterable files) Iterable getJavaFileObjectsFromStrings( Iterable names) String[] filenames = …; Iterable pilationUnits = fileManager getJavaFileObjectsFromFiles(Arrays asList(filenames)); JavaCompiler CompilationTask task = piler getTask(null fileManager diagnostics options null pilationUnits);
最后需要关闭fileManager close();
下面是一个完整的演示程序
import java io *; import java util *; import javax tools *; public class test_pilerapi { private static void pilejava() throws Exception { JavaCompiler piler = ToolProvider getSystemJavaCompiler(); // 建立DiagnosticCollector对象 DiagnosticCollector diagnostics = new DiagnosticCollector(); StandardJavaFileManager fileManager = piler getStandardFileManager(diagnostics null null); // 建立用于保存被编译文件名的对象 // 每个文件被保存在一个从JavaFileObject继承的类中 Iterable pilationUnits = fileManager getJavaFileObjectsFromStrings(Arrays asList( test java )); JavaCompiler CompilationTask task = piler getTask(null fileManager diagnostics null null pilationUnits); // 编译源程序 boolean success = task call(); fileManager close(); System out println((success)? 编译成功 : 编译失败 ); } public static void main(String args[]) throws Exception { pilejava(); } }
lishixinzhi/Article/program/Java/hx/201311/27242
先学Java的那部分啊?有Java Se、Java Ee、Java Me选哪个?谢谢
先学Java的那部分啊?有Java Se、Java Ee、Java Me选哪个?谢谢 Java Se 是基础,其他两个在SE基础上加入一些包等应用与不同的领域,EE为企业级应用,如网站,企业的应用系统开发,ME现在主要在集中在手机平台很有局限性,EE是个大方向,不学好SE就学其他两个很吃力,一头雾水~~
Java SE、Java ME、Java EE那个难学那个好学啊? 呵呵,其实是一个,只是方向不同Java 平台有三个版本,这使软体开发人员、服务提供商和装置生产商可以针对特定的市场进行开发: * Java SE(Java Platform,Standard Edition)。Java SE 以前称为 J2SE。它允许开发和部署在桌面、伺服器、嵌入式环境和实时环境中使用的 Java 应用程式。Java SE 包含了支援 Java Web 服务开发的类,并为 Java Platform,Enterprise Edition(Java EE)提供基础。 * Java EE(Java Platform,Enterprise Edition)。这个版本以前称为 J2EE。企业版本帮助开发和部署可移植、健壮、可伸缩且安全的伺服器端 Java 应用程式。Java EE 是在 Java SE 的基础上构建的,它提供 Web 服务、元件模型、管理和通讯 API,可以用来实现企业级的面向服务体系结构(service-oriented architecture,SOA)和 Web 2.0 应用程式。 * Java ME(Java Platform,Micro Edition)。这个版本以前称为 J2ME。Java ME 为在移动装置和嵌入式装置(比如手机、PDA、电视机顶盒和印表机)上执行的应用程式提供一个健壮且灵活的环境。Java ME 包括灵活的使用者介面、健壮的安全模型、许多内建的网路协议以及对可以动态下载的连网和离线应用程式的丰富支援。基于 Java ME 规范的应用程式只需编写一次,就可以用于许多装置,而且可以利用每个装置的本机功能。 因此JSP属于JAVA EE。 NetBeans IDE只是一种java开发工具,不能说属于哪一类,配置好适用的外挂后,可以适合任一种java开发。
java ee java se,java me 怎么区分 Java SE(Java Platform,Standard Edition)。Java SE 以前称为 J2SE。它允许开发和部署在桌面、伺服器、嵌入式环境和实时环境中使用的 Java 应用程式。Java SE 包含了支援 Java Web 服务开发的类,并为 Java Platform,Enterprise Edition(Java EE)提供基础。 * Java EE(Java Platform,Enterprise Edition)。这个版本以前称为 J2EE。企业版本帮助开发和部署可移植、健壮、可伸缩且安全的伺服器端 Java 应用程式。Java EE 是在 Java SE 的基础上构建的,它提供 Web 服务、元件模型、管理和通讯 API,可以用来实现企业级的面向服务体系结构(service-oriented architecture,SOA)和 Web 2.0 应用程式。 * Java ME(Java Platform,Micro Edition)。这个版本以前称为 J2ME。Java ME 为在移动装置和嵌入式装置(比如手机、PDA、电视机顶盒和印表机)上执行的应用程式提供一个健壮且灵活的环境。Java ME 包括灵活的使用者介面、健壮的安全模型、许多内建的网路协议以及对可以动态下载的连网和离线应用程式的丰富支援。基于 Java ME 规范的应用程式只需编写一次,就可以用于许多装置,而且可以利用每个装置的本机功能。
Java EE(Java Platform,Enterprise Edition)是sun公司(2009年4月20日甲骨文将其收购)推出的企业级应用程式版本.
适用于桌面系统的Java 2平台标准版(Java2 Platform Standard Edition,Java SE
适用于小型装置和智慧卡的Java2平台Micro版(Java2 Platform Micro Edition,JavaME)
java se是基础,java ee 往web方向发展,java me基本被安卓替代
javase 是 jdk jvm 以及自带的api合集的具体实现。 javaee 是基于javase而发展出来的一套规范介面。请注意是规范,并不是实现。发行商自己去实现这些介面。 javame 是一套执行专门为嵌入式装置设计的api介面规范。比如机顶盒这种程式。 andriod 上的java开发工具,是谷歌依照oracle制定的部分javase规范设计的sdk以及可用java语言呼叫的系统api。注意,javame和andriod sdk无关。
Java SE=Java Standard Edition Java EE=Java Enterprise Edition Java ME=Java Mobile Edition SE主要用于桌面程式,控制台开发(JFC) EE企业级开发(JSP,EJB) 一般是开发Web应用 ME嵌入式开发(手机,小家电)
java 那部分重要 java分为j2se ,j2ee,j2me j2se是基础这是必须要掌握的 j2ee主要是b/s模式的开发 像网站 里面要掌握的很多 jsp,servet ,ejb,rmi,jndi等等 其次还有就是三大框架 Hibernate,Struts,spring 知道两种开发模式 jsp+javabean ,jsp+servlet+java 等等 j2me的话 要看情况了 你想学手机游戏等的开发就要学j2me了 总之 java的话 各个部分都有联络 都要有所了解
学java哪个方向好?java ee?还是java se? java se只是java的基础,javaee方向还是不错的,企业级开发,主要领域有电信,网际网路,物流,财务,证券,银行,生产制造等ERP管理软体,大型网站及后台开发。
java ME java EE 就业 前景 谢谢 java Me 移动端开发 用的人很少 Java EE 就业前景一直都很不错,阳光行业
javase和java一样吗?
javase和java一样,javase是java的基础。
Java SE是Java技术的核心和基础,是Java ME和Java EE编程的基础。Java SE是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称。用Java实现的Hot Java浏览器显示了Java的魅力。
javase的特色:
javase的安全模型可以追溯到该平台的早期时代,当时人们主要将它看作一种增强用户体验的浏览器扩展机制。执行的Java代码可以从各种源派生,而其中一些的来源是未知的或者不可靠的。相应地,该平台的安全性最初主要关注的是解决验证被执行的代码可信任的问题,而且整个游戏围绕着在浏览器中执行applet。
但是,这个模型只是简单地划分为trusted和untrusted部分,甚至连中等复杂的应用程序都无法运行。从 1.2 版开始,Java作为一个编程平台逐渐得到了人们的认可。
而不再只是一个浏览器扩展,Sun开始提供更加灵活的安全功能,首先是可配置安全策略的概念。Java文档介绍了它的发展情况。当Java平台开始进入企业环境时,很快就会明显地感觉到,纯粹基于代码的功能无法管理大型应用程序的安全性。
Java平台的1.4 版引入了一种叫做Java Authentication and Authorization Service 的新特性,用于将基于用户的权限项整合到安全策略中。堆栈上某个特殊代码框架的权限既基于代码的源,又基于验证时分配给用户的身份、组和角色。
Java SE 6 新特性: Java DB&n
年底 Sun 公司发布了 Java Standard Edition (Java SE )的最终正式版 代号 Mustang(野马) 跟 Tiger(Java SE )相比 Mustang 在性能方面有了不错的提升 与 Tiger 在 API 库方面的大幅度加强相比 虽然 Mustang 在 API 库方面的新特性显得不太多 但是也提供了许多实用和方便的功能 在脚本 WebService XML 编译器 API 数据库 JMX 网络和 Instrumentation 方面都有不错的新特性和功能加强 本系列 文章主要介绍 Java SE 在 API 库方面的部分新特性 通过一些例子和讲解 帮助开发者在编程实践当中更好的运用 Java SE 提高开发效率
本文是系列文章的第 篇 介绍了 Java SE 在数据库编程方面的新特性
Java DB Java 里的数据库
新安装了 JDK 的程序员们也许会发现 除了传统的 bin jre 等目录 JDK 新增了一个名为 db 的目录 这便是 Java 的新成员 Java DB 这是一个纯 Java 实现 开源的数据库管理系统(DBMS) 源于 Apache 软件基金会(ASF)名下的项目 Derby 它只有 MB 大小 对比动辄上 G 的数据库来说可谓袖珍 但这并不妨碍 Derby 功能齐备 支持几乎大部分的数据库应用所需要的特性 更难能可贵的是 依托于 ASF 强大的社区力量 Derby 得到了包括 IBM 和 Sun 等大公司以及全世界优秀程序员们的支持 这也难怪 Sun 公司会选择其 版本纳入到 JDK 中 作为内嵌的数据库 这就好像为 JDK 注入了一股全新的活力 Java 程序员不再需要耗费大量精力安装和配置数据库 就能进行安全 易用 标准 并且免费的数据库编程 在这一章中 我们将初窥 Java DB 的世界 来探究如何使用它编写出功能丰富的程序
Hello Java DB 内嵌模式的Derby
既然有了内嵌(embedded)的数据库 就让我们从一个简单的范例(代码在 清单 中列出)开始 试着使用它吧 这个程序做了大多数数据库应用都可能会做的操作 在 DBMS 中创建了一个名为 helloDB 的数据库 创建了一张数据表 取名为 hellotable 向表内插入了两条数据 然后 查询数据并将结果打印在控制台上 最后 删除表和数据库 释放资源
清单 HelloJavaDB 的代码
public class HelloJavaDB { public static void main(String[] args) { try { // load the driver Class forName( apache derby jdbc EmbeddedDriver ) newInstance(); System out println( Load the embedded driver ); Connection conn = null; Properties props = new Properties(); props put( user user ); props put( password user ); //create and connect the database named helloDB conn=DriverManager getConnection( jdbc:derby:helloDB;create=true props); System out println( create and connect to helloDB ); conn setAutoCommit(false); // create a table and insert o records Statement s = conn createStatement(); s execute( create table hellotable(name varchar( ) score int) ); System out println( Created table hellotable ); s execute( insert into hellotable values( Ruth Cao ) ); s execute( insert into hellotable values ( Flora Shi ) ); // list the o records ResultSet rs = s executeQuery( SELECT name score FROM hellotable ORDER BY score ); System out println( name\t\tscore ); while(rs next()) { StringBuilder builder = new StringBuilder(rs getString( )); builder append( \t ); builder append(rs getInt( )); System out println(builder toString()); } // delete the table s execute( drop table hellotable ); System out println( Dropped table hellotable ); rs close(); s close(); System out println( Closed result set and statement ); mit(); conn close(); System out println( Committed transaction and closed connection ); try { // perform a clean shutdown DriverManager getConnection( jdbc:derby:;shutdown=true ); } catch (SQLException se) { System out println( Database shut down normally ); } } catch (Throwable e) { // handle the exception } System out println( SimpleApp finished ); }}
随后 我们在命令行(本例为 Windows 平台 当然 其它系统下稍作改动即可)下键入以下命令
清单 运行 HelloJavaDB 命令
java –cp ;%JAVA_HOME%\db\lib\derby jar HelloJavaDB
程序将会按照我们预想的那样执行 图 是执行结果的一部分截屏
图 HelloJavaDB 程序的执行结果
上述的程序和以往没什么区别 不同的是我们不需要再为 DBMS 的配置而劳神 因为 Derby 已经自动地在当前目录下新建了一个名为 helloDB 的目录 来物理地存储数据和日志 需要做的只是注意命名问题 在内嵌模式下驱动的名字应为 apache derby jdbc EmbeddedDriver 创建一个新数据库时需要在协议后加入 create=true 另外 关闭所有数据库以及 Derby 的引擎可以使用以下代码
清单 关闭所有数据库及 Derby 引擎
DriverManager getConnection( jdbc:derby:;shutdown=true );
如果只想关闭一个数据库 那么则可以调用
清单 关闭一个数据库
DriverManager getConnection( jdbc:derby:helloDB;shutdown=true );
这样 使用嵌入模式的 Derby 维护和管理数据库的成本接近于 这对于希望专心写代码的人来说不失为一个好消息 然而有人不禁要问 既然有了内嵌模式 为什么大多数的 DBMS 都没有采取这样的模式呢?不妨做一个小实验 当我们同时在两个命令行窗口下运行 HelloJavaDB 程序 结果一个的结果与刚才一致 而另一个却出现了错误 如 图 所示
图 内嵌模式的局限
错误的原因其实很简单 在使用内嵌模式时 Derby 本身并不会在一个独立的进程中 而是和应用程序一起在同一个 Java 虚拟机(JVM)里运行 因此 Derby 如同应用所使用的其它 jar 文件一样变成了应用的一部分 这就不难理解为什么在 classpath 中加入 derby 的 jar 文件 我们的示例程序就能够顺利运行了 这也说明了只有一个 JVM 能够启动数据库 而两个跑在不同 JVM 实例里的应用自然就不能够访问同一个数据库了
鉴于上述的局限性 和来自不同 JVM 的多个连接想访问一个数据库的需求 下一节将介绍 Derby 的另一种模式 网络服务器(Neork Server)
网络服务器模式
如上所述 网络服务器模式是一种更为传统的客户端/服务器模式 我们需要启动一个 Derby 的网络服务器用于处理客户端的请求 不论这些请求是来自同一个 JVM 实例 还是来自于网络上的另一台机器 同时 客户端使用 DRDA(Distributed Relational Database Architecture)协议连接到服务器端 这是一个由 The Open Group 倡导的数据库交互标准 图 说明了该模式的大体结构
由于 Derby 的开发者们努力使得网络服务器模式与内嵌模式之间的差异变小 使得我们只需简单地修改 清单 中的程序就可以实现 如 清单 所示 我们在 HelloJavaDB 中增添了一个新的函数和一些字符串变量 不难看出 新的代码只是将一些在 上一节中特别指出的字符串进行了更改 驱动类为 apache derby jdbc ClientDriver 而连接数据库的协议则变成了 jdbc:derby://localhost: / 这是一个类似 URL 的字符串 而事实上 Derby 网络的客户端的连接格式为 jdbc:derby://server[:port]/databaseName[;attributeKey=value] 在这个例子中 我们使用了最简单的本地机器作为服务器 而端口则是 Derby 默认的 端口
图 Derby 网络服务器模式架构
清单 网络服务器模式下的 HelloJavaDB
public class HelloJavaDB { public static String driver = apache derby jdbc EmbeddedDriver ; public static String protocol = jdbc:derby: ; public static void main(String[] args) { // same as before } private static void parseArguments(String[] args) { if (args length == || args length > ) { return; } if (args[ ] equalsIgnoreCase( derbyclient )) { framework = derbyclient ; driver = apache derby jdbc ClientDriver ; protocol = jdbc:derby://localhost: / ; } }}
当然 仅仅有客户端是不够的 我们还需要启动网络服务器 Derby 中控制网络服务器的类是 apache derby drda NeorkServerControl 因此键入以下命令即可 如果想了解 NeorkServerControl 更多的选项 只要把 start 参数去掉就可以看到帮助信息了 关于网络服务器端的实现 都被 Derby 包含在 derbynet jar 里
清单 启动网络服务器
java cp ; C:\Program Files\Java\jdk \db\lib\derby jar ; C:\Program Files\Java\jdk \db\lib\derbynet jar apache derby drda NeorkServerControl start
相对应的 网络客户端的实现被包含在 derbyclient jar 中 所以 只需要在 classpath 中加入该 jar 文件 修改后的客户端就可以顺利地读取数据了 再一次尝试着使用两个命令行窗口去连接数据库 就能够得到正确的结果了 如果不再需要服务器 那么使用 NeorkServerControl 的 shutdown 参数就能够关闭服务器
更多
至此 文章介绍了 Java SE 中的新成员 Java DB(Derby) 也介绍了如何在内嵌模式以及网络服务器模式下使用 Java DB 当然这只是浅尝辄止 更多高级的选项还需要在 Sun 和 Derby 的文档中寻找 在这一章的最后 我们将简单介绍几个 Java DB 的小工具来加快开发速度 它们都位于 apache derby tools 包内 在开发过程中需要获取信息或者测试可以用到
ij 一个用来运行 SQL 脚本的工具 dblook 为 Derby 数据库作模式提取(Schema extraction) 生成 DDL 的工具 sysinfo 显示系统以及 Derby 信息的工具类 JDBC 新功能 新 API
如果说上一章介绍了 Java 中的一个新成员 它本来就存在 但是没有被加入进 JDK 那么这一章 我们将关注在 JDBC 中又增加了哪些新功能以及与之相对应的新 API
自动加载驱动
在 JDBC 之前 编写 JDBC 程序都需要加上以下这句有点丑陋的代码
清单 注册 JDBC 驱动
Class forName( apache derby jdbc EmbeddedDriver ) newInstance();
Java sql DriverManager 的内部实现机制决定了这样代码的出现 只有先通过 Class forName 找到特定驱动的 class 文件 DriverManager getConnection 方法才能顺利地获得 Java 应用和数据库的连接 这样的代码为编写程序增加了不必要的负担 JDK 的开发者也意识到了这一点 从 Java 开始 应用程序不再需要显式地加载驱动程序了 DriverManager 开始能够自动地承担这项任务 作为试验 我们可以将 清单 中的相关代码删除 重新编译后在 JRE 下运行 结果和原先的程序一样
好奇的读者也许会问 DriverManager 为什么能够做到自动加载呢?这就要归功于一种被称为 Service Provider 的新机制 熟悉 Java 安全编程的程序员可能对其已经是司空见惯 而它现在又出现在 JDBC 模块中 JDBC 的规范规定 所有 JDBC 的驱动 jar 文件必须包含一个 java sql Driver 它位于 jar 文件的 META INF/services 目录下 这个文件里每一行便描述了一个对应的驱动类 其实 编写这个文件的方式和编写一个只有关键字(key)而没有值(value)的 properties 文件类似 同样地 # 之后的文字被认为是注释 有了这样的描述 DriverManager 就可以从当前在 CLASSPATH 中的驱动文件中找到 它应该去加载哪些类 而如果我们在 CLASSPATH 里没有任何 JDBC 的驱动文件的情况下 调用 清单 中的代码会输出一个 sun jdbc odbc JdbcOdbcDriver 类型的对象 而仔细浏览 JDK 的目录 这个类型正是在 %JAVA_HOME%/jre/lib/resources jar 的 META INF/services 目录下的 java sql Driver 文件中描述的 也就是说 这是 JDK 中默认的驱动 而如果开发人员想使得自己的驱动也能够被 DriverManager 找到 只需要将对应的 jar 文件加入到 CLASSPATH 中就可以了 当然 对于那些 JDBC 之前的驱动文件 我们还是只能显式地去加载了
清单 罗列本地机器上的 JDBC 驱动
Enumeration
drivers = DriverManager getDrivers();while(drivers hasMoreElements()) { System out println(drivers nextElement());}
RowId
熟悉 DB Oracle 等大型 DBMS 的人一定不会对 ROWID 这个概念陌生 它是数据表中一个 隐藏 的列 是每一行独一无二的标识 表明这一行的物理或者逻辑位置 由于 ROWID 类型的广泛使用 Java SE 中新增了 java sql RowId 的数据类型 允许 JDBC 程序能够访问 SQL 中的 ROWID 类型 诚然 不是所有的 DBMS 都支持 ROWID 类型 即使支持 不同的 ROWID 也会有不同的生命周期 因此使用 DatabaseMetaData getRowIdLifetime 来判断类型的生命周期不失为一项良好的实践经验 我们在 清单 的程序获得连接之后增加以下代码 便可以了解 ROWID 类型的支持情况
清单 了解 ROWID 类型的支持情况 DatabaseMetaData meta = conn getMetaData();System out println(meta getRowIdLifetime());
Java SE 的 API 规范中 java sql RowIdLifetime 规定了 种不同的生命周期 ROWID_UNSUPPORTED ROWID_VALID_FOREVER ROWID_VALID_OTHER ROWID_VALID_SESSION 和 ROWID_VALID_TRANSACTION 从字面上不难理解它们表示了不支持 ROWID ROWID 永远有效等等 具体的信息 还可以参看相关的 JavaDoc 读者可以尝试着连接 Derby 进行试验 会发现运行结果是 ROWID_UNSUPPORTED 即 Derby 并不支持 ROWID
既然提供了新的数据类型 那么一些相应的获取 更新数据表内容的新 API 也在 Java 中被添加进来 和其它已有的类型一样 在得到 ResultSet 或者 CallableStatement 之后 调用 get/set/update 方法得到/设置/更新 RowId 对象 示例的代码如 清单 所示
清单 获得/设置 RowId 对象
// Initialize a PreparedStatementPreparedStatement pstmt = connection prepareStatement( SELECT rowid name score FROM hellotable WHERE rowid = ? );// Bind rowid into prepared statement pstmt setRowId( rowid);// Execute the statementResultSet rset = pstmt executeQuery(); // List the recordswhile(rs next()) { RowId id = rs getRowId( ); // get the immutable rowid object String name = rs getString( ); int score = rs getInt( );}
鉴于不同 DBMS 的不同实现 RowID 对象通常在不同的数据源(datasource)之间并不是可移植的 因此 JDBC 的 API 规范并不建议从连接 A 取出一个 RowID 对象 将它用在连接 B 中 以避免不同系统的差异而带来的难以解释的错误 而至于像 Derby 这样不支持 RowId 的 DBMS 程序将直接在 setRowId 方法处抛出 SQLFeatureNotSupportedException
SQLXML
SQL 标准引入了 SQL/XML 作为 SQL 标准的扩展 SQL/XML 定义了 SQL 语言怎样和 XML 交互 如何创建 XML 数据 如何在 SQL 语句中嵌入 XQuery 表达式等等 作为 JDBC 的一部分 Java 增加了 java sql SQLXML 的类型 JDBC 应用程序可以利用该类型初始化 读取 存储 XML 数据 java sql Connection createSQLXML 方法就可以创建一个空白的 SQLXML 对象 当获得这个对象之后 便可以利用 setString setBinaryStream setCharacterStream 或者 setResult 等方法来初始化所表示的 XML 数据 以 setCharacterStream 为例 清单 表示了一个 SQLXML 对象如何获取 java io Writer 对象 从外部的 XML 文件中逐行读取内容 从而完成初始化
清单 利用 setCharacterStream 方法来初始化 SQLXML 对象
SQLXML xml = con createSQLXML();Writer writer = xml setCharacterStream();BufferedReader reader = new BufferedReader(new FileReader( test xml ));String line= null;while((line = reader readLine() != null) { writer write(line);}
由于 SQLXML 对象有可能与各种外部的资源有联系 并且在一个事务中一直持有这些资源 为了防止应用程序耗尽资源 Java 提供了 free 方法来释放其资源 类似的设计在 java sql Array Clob 中都有出现
至于如何使用 SQLXML 与数据库进行交互 其方法与其它的类型都十分相似 可以参照 RowId 一节 中的例子在 Java SE 的 API 规范中找到 SQLXML 中对应的 get/set/update 方法构建类似的程序 此处不再赘述
SQLExcpetion 的增强
在 Java SE 之前 有关 JDBC 的异常类型不超过 个 这似乎已经不足以描述日渐复杂的数据库异常情况 因此 Java SE 的设计人员对以 java sql SQLException 为根的异常体系作了大幅度的改进 首先 SQLException 新实现了 Iterable
接口 清单 实现了 清单 程序的异常处理机制 这样简洁地遍历了每一个 SQLException 和它潜在的原因(cause)
清单 SQLException 的 for each loop
// Java codecatch (Throwable e) { if (e instanceof SQLException) { for(Throwable ex : (SQLException)e ){ System err println(ex toString()); } }}
此外 图 表示了全部的 SQLException 异常体系 除去原有的 SQLException 的子类 Java 中新增的异常类被分为 种 SQLReoverableException SQLNonTransientException SQLTransientException 在 SQLNonTransientException 和 SQLTransientException 之下还有若干子类 详细地区分了 JDBC 程序中可能出现的各种错误情况 大多数子类都会有对应的标准 SQLState 值 很好地将 SQL 标准和 Java 类库结合在一起
图 SQLException 异常体系
在众多的异常类中 比较常见的有 SQLFeatureNotSupportedException 用来表示 JDBC 驱动不支持某项 JDBC 的特性 例如在 Derby 下运行 清单 中的程序 就可以发现 Derby 的驱动并不支持 RowId 的特性 另外值得一提的是 SQLClientInfoException 直接继承自 SQLException 表示当一些客户端的属性不能被设置在一个数据库连接时所发生的异常
小结 更多新特性与展望
在本文中 我们已经向读者介绍了 Java SE 中 JDBC 最重要的一些新特性 它们包括嵌在 JDK 中的 Java DB (Derby)和 JDBC 的一部分 当然 还有很多本文还没有覆盖到的新特性 比如增加了对 SQL 语言中 NCHAR NVARCHAR LONGNVARCHAR 和 NCLOB 类型的支持 在数据库连接池的环境下为管理 Statement 对象提供更多灵活 便利的方法等
lishixinzhi/Article/program/Java/JSP/201311/19343