JDBC
在 JDBC 2 开发的过程中,SQL99 还处在一种变化不定的情况下。现在规范已经完成了,而且数据库厂商已经采用了部分标准。所以自然地,JDBC 规范就跟着将自己与 SQL99 功能的一部分相统一。最新的 JDBC 规范已经采用了 SQL99 标准中那些已经被广泛支持的功能,还有那些在五年内可能会获得支持的功能。
1. DataSource
在JDBC2.0 Optional Package中,提供了透明的连接池(Connection pooling)。
一旦配置了J2EE应用服务器后,只要用DataSource获取连接(Connection),连接池(Connection pooling)就会自动的工作。
如果用户希望建立一个数据库连接,通过查询在JNDI服务中的DataSource,可以从DataSource中获取相应的数据库连接。
DataSource被认为是从JNDI中获取的网络资源。
DataSource在池中保存的对象都实现了PooledConnection接口。
当应用程序向DataSource请求一个Connection时,它会找到一个可用的PooledConnection对象。
如果连接池空了,它就向ConnectionPoolecDataSource请求一个新的PooledConnection对象
通过使用 DataSource 接口 (JDBC 2.0) 或 DriverManager (JDBC 1.0) 接口,J2EE 组件可以获得物理数据库连接对象(Connection)。要获得逻辑(合用的)连接,J2EE 组件必须使用以下这些 JDBC 2.0 合用管理器接口:
javax.sql.ConnectionPoolDataSource 接口,该接口充当合用的 java.sql.Connection 对象的资源管理器连接 factory。每家数据库服务器供应商都提供该接口的实现
(例如,Oracle 实现 oracle.jdbc.pool.OracleConnectionPoolDataSource 类)。
javax.sql.PooledConnection 接口,该接口封装到数据库的物理连接。同样,数据库供应商提供其实现。
对于那些接口和 XA 连接的每一个,都存在一个 XA(X/Open 规范)等价定义。
2. ResultSet
在JDBC2.0中,为了获得一个Uptatable Result,在Query语句里必须包含Primarykey,并且查询的内容里必须来自一个table
ava.sql.ResultSet接口中定义了三种类型的结果集
TYPE_FORWARD_ONLY
TYPE_SCROLL_INSENSITIVE 这种类型的结果集支持双向滚动
TYPE_SCROLL_SENSITIVE
如果要建立一个双向滚动的ResultSet,一定要在建立Statement的时候使用如下参数
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
3. JDBC驱动程序
连通oracle8.1.6的JDBC
把oracle8.1.6/lib/jdbc/*.zip copy 到 %JAVA_HOME%/jre/lib/ext/*.jar
如果光copy不ren为.jar是没有用的。
4. 事务处理
本地事务
java.sql.Connection接口可以控制事务边界(即开始和结束)。
在事务开始的时候调用setAutoCommit( false ), 而在中止事务时调用rollback或commit()方法。这类事务叫本地事务。
分布式事务
但是,在特定的情况下,可能有多个客户(例如两个不同的servlet或EJB组件)参与了同一个事务。
或者,客户在同一个事务中可能会执行跨越多个数据库的数据库操作。
JDBC2.0 Optional Package 同JTA一起来实现分布式样事务。
5. 一些技巧
检索自动产生的关键字
为了解决对获取自动产生的或自动增加的关键字的值的需求,JDBC 3.0 API 现在将获取这种值变得很轻松。要确定任何所产生的关键字的值,只要简单地在语句的 execute() 方法中指定一个可选的标记,表示您有兴趣获取产生的值。您感兴趣的程度可以是 Statement.RETURN_GENERATED_KEYS,也可以是 Statement.NO_GENERATED_KEYS。在执行这条语句后,所产生的关键字的值就会通过从 Statement 的实例方法 getGeneratedKeys() 来检索 ResultSet 而获得。ResultSet 包含了每个所产生的关键字的列。清单 1 中的示例创建一个新的作者并返回对应的自动产生的关键字。
清单 1. 检索自动产生的关键字
Statement stmt = conn.createStatement();
// Obtain the generated key that results from the query.
stmt.executeUpdate("INSERT INTO authors " +
'(first_name, last_name) " +
"VALUES ('George', 'Orwell')",
Statement.RETURN_GENERATED_KEYS);
ResultSet rs = stmt.getGeneratedKeys();
if ( rs.next() ) {
// Retrieve the auto generated key(s).
int key = rs.getInt();
}