JDBC2.0中的标准扩展
支持利用JNDI的API来查找数据源
连接池
Row Set
================= DataSource ========================
DataSource接口被引入到JDBC2.0的扩展包中,即在javax.sql中,它是被获取数据库连接的首选方式.DataSource返回的连接对象和DriverManager一样,都是Connection.使用一个DataSource对象来获取连接可以增加应用程序的可移植性,因为使用DataSource,应用程序使用一个逻辑的名字来代替使用特定的数据库厂商的特定的连接信息.
=====================================================
比较两种方式
Class.forName("数据库驱动类的名字");
Connection con = DriverManager.getConnection(url,userName,password);
----------------------------------------------
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("jdbc/AcmeDB");
Connection con = ds.getConnection();
=====================================================
但是使用DataSource,增加了应用开发的复杂性,因为需要应用服务器的支持.(应用服务器是为应用程序提供一些额外的服务的,现在市场上比较流行的应用服务器包括:Weblogic,Websphere),导致系统费用增加.
=====================================================
使用数据源的优点是可以增加应用程序的可移植性,缺点就是增加了系统费用,适合于大的项目使用.
使用DriverManager的优点是应用程序简单,容易理解.缺点就是应用程序的可移植性差,适合于小的项目中使用.
=====================================================
一个DataSource对象通常是使用JNDI API来注册和获取的.
JNDI(Java Naming and Directory Interface), 能够提供注册和访问远程服务的API. 相应的API在javax.naming包中.
JNDI API为应用程序提供了一种统一的访问远程服务的方式. 使用JNDI API , 应用程序能够通过指定一个逻辑的名称来访问一个DataSource对象。使用了JNDI API的一个命名服务将逻辑名称映射为一个相应的数据源。这种方案使得应用程序可以获得很大的移植性,因为任何DataSource的属性发生改变了,都不会影响客户端的代码。实际上,应用程序在一个完全透明的方式下,就能够重新指向一个不同的底层的数据源。
=====================================================
通过一个DataSource对象来获取连接:
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("jdbc/AcmeDB");
Connection con = ds.getConnection();
==== 连接池 =================================
在一个基本的DataSource的实现中, 在客户端的Connection对象和底层的物理连接之间存在着一一对应关系。当Connection对象关闭了,物理的连接就被销毁了。这样就增加了打开,初始化,关闭物理连接的开销。
一个连接池就是解决了这个问题,通过维护一个物理连接的缓冲区,来使这些物理连接可被客户端重复的使用,来减少不必要系统开销。连接池极大的提高了系统的性能,特别是在3层架构的环境下,多个客户端能够共享更少量的数据库的物理连接.
==============================================
使不使用连接池,对于应用程序员编码来说没有任何影响.对连接池的支持是需要应用服务器和数据库厂商提供支持的.
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("jdbc/AcmeDB");
Connection con = ds.getConnection();
====== rowset ==================================
RowSet接口(javax.sql.RowSet)继承了resultset接口,一个rowset对象就是一个resultset对象. 所有rowset能够做任何resultset作的事情.
一个rowset对象和一个resultset对象的主要的区别:
1. RowSet是它是一个javabean组件.这样,它具有一系列JavaBeans的属性和遵从JavaBeans的事件模型;而ResultSet不是.
2. 某些RowSet对象在断开连接后仍能从结果集中取出数据;而所有的ResultSet对象都是在连接打开的情况下可以获取结果集中的数据,连接一旦断开,就无法再从结果集中获取数据了.
RowSet分为两类:connected rowset和disconnected rowset
非连接的rowset是把数据存在客户端的.
RowSet主要用来简化桌面应用程序访问数据库的操作.一个RowSet对象就用来封装从数据库中获取到的数据.然后可以把它作为一个组件放置到界面中.
由于RowSet本身被设计的目的就是用于桌面应用,所以在实际的开发中很少用,因为Java主要还是用于开发Web应用和J2ME的应用的.因此对于RowSet这部分,大家了解就可以了.
============ 操作有关联的多张表 ================
1. 类与类之间的关系包括如下:一对一,一对多,多对多
一对一:如在线购物系统中,订单和发货记录
一对多:就非常普遍了,如在线购物系统中的产品目录和产品,订单和订单项, 用户和订单。
多对多:如学生管理系统中,学生和课程之间的关系。
2. 我们上节课已经讲了一个类如果影射到一张表。今天来讲一下类之间的关系如何影射到数据库。
首先来看一个一对多的例子:在线购物系统中的产品目录和产品,它们之间就是一个一对多的关系。
类的设计:从类的设计可以看出在这个系统中产品目录和产品之间的关联是双向的,即既可以从某个产品目录对象获取到这个产品目录包括的所有产品对象,又可以从产品对象获取到该产品所属的目录。
数据库的设计:产品目录类影射到产品目录表,产品类影射到产品表,类之间的一对多的关系,体现为两张表之间的外键关联。即在产品表上(多的一方)建立一个外键,此外键引用产品目录表的主键。在类之间的关系可以是单向也可以双向的,但在关系型数据库中关系都是单向的,即有外键的一方引用另一方。