本节介绍
DataSource
对象,这是获得与数据源的连接的首选方法。除了它们的其他优点(将在后面解释)之外,
DataSource
对象还可以提供连接池和分布式事务。此功能对于企业数据库计算至关重要。特别是,它是Enterprise JavaBeans(EJB)技术不可或缺的。
本节向您展示如何使用该
DataSource
接口获得连接以及如何使用分布式事务和连接池。两者都涉及JDBC应用程序中很少的代码更改。
系统管理员通常使用工具(例如Apache Tomcat或Oracle WebLogic Server)来部署使这些操作成为可能的类而执行的工作因要部署的
DataSource
对象类型而异。因此,本节的大部分内容专门介绍系统管理员如何设置环境,以便程序员可以使用
DataSource
对象来获得连接。
涵盖以下主题:
在
建立连接中
,您学习了如何使用
DriverManager
该类来获得连接。本节说明如何使用
DataSource
对象来建立与数据源的连接,这是首选方法。
由实现的类实例化的对象
DataSource
表示特定的DBMS或某些其他数据源,例如文件。甲
DataSource
对象表示一个特定的DBMS或一些其它数据源,诸如一个文件。如果公司使用多个数据源,它将
DataSource
为每个数据源部署一个单独的对象。该
DataSource
接口由驱动程序供应商实现。它可以通过三种不同的方式实现:
-
基本
DataSource
实现产生的标准
Connection
对象没有在分布式事务中合并或使用。
-
甲
DataSource
实现,它支持连接池产生
Connection
参与连接池,即,可循环使用的连接对象。
-
阿
DataSource
那分布式支持事务执行产生
Connection
,可以在分布式事务,即,访问两个或多个DBMS服务器事务中使用的对象。
JDBC驱动程序应至少包括一个基本
DataSource
实现。例如,Java DB JDBC驱动程序包括
org.apache.derby.jdbc.ClientDataSource
MySQL的实现和
com.mysql.jdbc.jdbc2.optional.MysqlDataSource
。如果您的客户端在Java 8 Compact Profile 2上运行,则Java DB JDBC驱动程序为
org.apache.derby.jdbc.BasicClientDataSource40
。本教程的示例要求压缩配置文件3或更高。
一
DataSource
类是支持分布式事务通常也实现了连接池支持。例如,
DataSource
EJB供应商提供的类几乎总是支持连接池和分布式事务。
假设从前面的示例来看,The Coffee Break商店蓬勃发展的连锁店的所有者已决定通过在Internet上出售咖啡来进一步扩大规模。预期会有大量的在线业务,因此所有者肯定需要连接池。打开和关闭连接会涉及大量开销,并且所有者希望此在线订购系统需要大量的查询和更新。使用连接池,可以反复使用连接池,从而避免了为每次数据库访问创建新连接的开销。此外,所有者现在拥有第二个DBMS,其中包含最近收购的咖啡烘焙公司的数据。这意味着所有者将希望能够编写使用旧DBMS服务器和新DBMS服务器的分布式事务。
链所有者已重新配置计算机系统,以服务于新的更大的客户群。所有者购买了最新的JDBC驱动程序和与其一起使用的EJB应用程序服务器,以便能够使用分布式事务并获得连接池带来的更高性能。提供了许多与最近购买的EJB服务器兼容的JDBC驱动程序。所有者现在具有三层体系结构,中间层是新的EJB应用程序服务器和JDBC驱动程序,第三层是两个DBMS服务器。发出请求的客户端计算机是第一层。
系统管理员需要部署
DataSource
对象,以便Coffee Break的编程团队可以开始使用它们。部署
DataSource
对象包括三个任务:
-
创建
DataSource
类的实例
-
设置其属性
-
在使用Java命名和目录接口(JNDI)API的命名服务中注册它
首先,考虑最基本的情况,即使用
DataSource
接口的基本实现,即不支持连接池或分布式事务的接口。在这种情况下,仅
DataSource
需要部署一个对象。基本的实现
DataSource
产生与类产生的相同类型的连接
DriverManager
。
创建数据源类的实例并设置其属性
假设一家只希望基本实现的
DataSource
公司从JDBC供应商DB Access,Inc.购买了一个驱动程序。该驱动程序包括
com.dbaccess.BasicDataSource
实现该
DataSource
接口的类。以下代码摘录创建该类的实例
BasicDataSource
并设置其属性。
BasicDataSource
部署完实例之后,程序员可以调用该方法
DataSource.getConnection
来获取与公司数据库的连接
CUSTOMER_ACCOUNTS
。首先,系统管理员使用默认构造函数创建
BasicDataSource
对象
ds
。然后,系统管理员设置三个属性。请注意,以下代码通常由部署工具执行:
com.dbaccess.BasicDataSource ds = new com.dbaccess.BasicDataSource();
ds.setServerName("grinder");
ds.setDatabaseName("CUSTOMER_ACCOUNTS");
ds.setDescription("Customer accounts database for billing");
ds
现在,该变量表示
CUSTOMER_ACCOUNTS
服务器上安装的数据库。该
BasicDataSource
对象产生的任何连接
ds
都将是与数据库的连接
CUSTOMER_ACCOUNTS
。
向使用JNDI API的命名服务注册数据源对象
通过设置属性,系统管理员可以向
BasicDataSource
JNDI(Java命名和目录接口)命名服务注册对象。通常使用的特定命名服务由系统属性确定,此处未显示。以下代码摘录注册该
BasicDataSource
对象并将其与逻辑名绑定
jdbc/billingDB
:
Context ctx = new InitialContext();
ctx.bind("jdbc/billingDB", ds);
此代码使用JNDI API。第一行创建一个
InitialContext
对象,该对象用作名称的起点,类似于文件系统中的根目录。第二行将
BasicDataSource
对象关联或绑定
ds
到逻辑名
jdbc/billingDB
。在下一个代码摘录中,为命名服务赋予此逻辑名,然后它返回
BasicDataSource
对象。逻辑名称可以是任何字符串。在这种情况下,公司决定使用该名称
billingDB
作为
CUSTOMER_ACCOUNTS
数据库的逻辑名称。
在前面的示例中,
jdbc
是初始上下文下的子上下文,就像根目录下的目录是子目录一样。该名称
jdbc/billingDB
类似于路径名,其中路径中的最后一项类似于文件名。在这种情况下,
billingDB
是赋予
BasicDataSource
对象的逻辑名
ds
。子上下文
jdbc
是保留给逻辑名绑定到
DataSource
对象的,因此
jdbc
它将始终是数据源逻辑名的第一部分。
使用部署的数据源对象
在
DataSource
系统管理员部署了基本实现之后,程序员就可以使用它了。这意味着程序员可以提供绑定到
DataSource
类实例的逻辑数据源名称,并且JNDI命名服务将返回
DataSource
该类的实例。
getConnection
然后可以在该
DataSource
对象上调用该方法以获取与其表示的数据源的连接。例如,程序员可能编写以下两行代码来获取一个
DataSource
对象,该对象产生与数据库的连接
CUSTOMER_ACCOUNTS
。
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("jdbc/billingDB");
代码的第一行以初始上下文为检索
DataSource
对象的起点。在
jdbc/billingDB
为方法提供逻辑名时
lookup
,该方法将返回
DataSource
系统管理员
jdbc/billingDB
在部署时绑定到的对象。因为该方法的返回值
lookup
是Java
Object
,所以
DataSource
在将其分配给变量之前,必须将其转换为更特定的类型
ds
。
变量
ds
是
com.dbaccess.BasicDataSource
实现
DataSource
接口的类的实例。调用该方法将
ds
.getConnection
产生与
CUSTOMER_ACCOUNTS
数据库的连接。
Connection con = ds.getConnection("fernanda","brewed");
该
getConnection
方法仅需要用户名和密码,因为该变量在其属性中
ds
具有与
CUSTOMER_ACCOUNTS
数据库建立连接所需的其余信息,例如数据库名称和位置。
数据源对象的优点
由于其属性,
DataSource
与
DriverManager
用于连接的类相比,对象是更好的替代方法。程序员不再需要在其应用程序中对驱动程序名称或JDBC URL进行硬编码,从而使它们更易于移植。而且,
DataSource
属性使代码维护更加简单。如果进行了更改,则系统管理员可以更新数据源属性,而不必担心更改与该数据源建立连接的每个应用程序。例如,如果将数据源移动到其他服务器,则系统管理员要做的就是将
serverName
属性设置为新的服务器名称。
除了可移植性和易于维护之外,使用
DataSource
对象进行连接还可以提供其他优点。当实现
DataSource
接口以与实现一起使用
ConnectionPoolDataSource
时,
DataSource
该类实例产生的所有连接将自动为池连接。类似地,当
DataSource
实现被实现为与
XADataSource
类一起使用时,它产生的所有连接将自动为可在分布式事务中使用的连接。下一节将说明如何部署这些类型的
DataSource
实现。
系统管理员或以该身份工作的其他人可以部署
DataSource
对象,以便它产生的连接为池连接。为此,他(她)首先部署一个
ConnectionPoolDataSource
对象,然后部署一个
DataSource
实现为可以使用的对象。
ConnectionPoolDataSource
设置对象的属性,使其代表将与其建立连接的数据源。将
ConnectionPoolDataSource
对象注册到JNDI命名服务后,将
DataSource
部署对象。通常,仅需为该
DataSource
对象设置两个属性:
description
和
dataSourceName
。赋予该
dataSourceName
属性的值是标识
ConnectionPoolDataSource
先前部署的对象的逻辑名,该逻辑名是包含进行连接所需的属性的对象。
随着
ConnectionPoolDataSource
与
DataSource
对象部署,您可以调用该方法
DataSource.getConnection
上
DataSource
的对象,并得到一个连接池。此连接将连接到
ConnectionPoolDataSource
对象属性中指定的数据源。
以下示例描述了The Coffee Break的系统管理员如何部署
DataSource
实现为提供池化连接的对象。系统管理员通常会使用部署工具,因此本节中显示的代码片段是部署工具将执行的代码。
为了获得更好的性能,Coffee Break公司从DB Access,Inc.购买了JDBC驱动程序
com.dbaccess.ConnectionPoolDS
,其中包括实现该
ConnectionPoolDataSource
接口的class 。系统管理员创建创建此类的实例,设置其属性,并将其注册到JNDI命名服务。Coffee Break从其EJB服务器供应商Application Logic,Inc.购买了其
DataSource
类
com.applogic.PooledDataSource
。该类
com.applogic.PooledDataSource
使用
ConnectionPoolDataSource
该类提供的基础支持来实现连接池
com.dbaccess.ConnectionPoolDS
。
该
ConnectionPoolDataSource
对象必须首先部署。以下代码创建的实例
com.dbaccess.ConnectionPoolDS
并设置其属性:
com.dbaccess.ConnectionPoolDS cpds = new com.dbaccess.ConnectionPoolDS();
cpds.setServerName("creamer");
cpds.setDatabaseName("COFFEEBREAK");
cpds.setPortNumber(9040);
cpds.setDescription("Connection pooling for " + "COFFEEBREAK DBMS");
ConnectionPoolDataSource
部署对象后,系统管理员将部署
DataSource
对象。以下代码向JNDI命名服务注册
com.dbaccess.ConnectionPoolDS
对象
cpds
。请注意,与
cpds
变量关联的逻辑名具有在子上下文
pool
下添加的子上下文
jdbc
,这类似于将子目录添加到分层文件系统中的另一个子目录。该类的任何实例的逻辑名称
com.dbaccess.ConnectionPoolDS
始终以开头
jdbc/pool
。Oracle建议将所有
ConnectionPoolDataSource
对象放在子上下文下
jdbc/pool
:
Context ctx = new InitialContext();
ctx.bind("jdbc/pool/fastCoffeeDB", cpds);
接下来,部署
DataSource
实现为与
cpds
变量和
com.dbaccess.ConnectionPoolDS
该类的其他实例交互的类。以下代码创建此类的实例并设置其属性。请注意,仅为此实例设置了两个属性
com.applogic.PooledDataSource
。
description
设置该属性是因为它始终是必需的。设置的另一个属性
dataSourceName
给出了的逻辑JNDI名称
cpds
,它是
com.dbaccess.ConnectionPoolDS
该类的实例。换句话说,
cpds
表示
ConnectionPoolDataSource
将为对象实现连接池的
DataSource
对象。
以下代码(可能由部署工具执行)创建一个
PooledDataSource
对象,设置其属性,并将其绑定到逻辑名称
jdbc/fastCoffeeDB
:
com.applogic.PooledDataSource ds = new com.applogic.PooledDataSource();
ds.setDescription("produces pooled connections to COFFEEBREAK");
ds.setDataSourceName("jdbc/pool/fastCoffeeDB");
Context ctx = new InitialContext();
ctx.bind("jdbc/fastCoffeeDB", ds);
此时,将
DataSource
部署一个对象,应用程序可以从该对象获得与数据库的池化连接
COFFEEBREAK
。
一个
连接池
是数据库连接对象的缓存。这些对象表示物理数据库连接,应用程序可以使用这些物理数据库连接来连接数据库。在运行时,应用程序请求池中的连接。如果池包含可以满足请求的连接,则它将连接返回给应用程序。如果未找到任何连接,则会创建一个新的连接并返回到应用程序。应用程序使用该连接在数据库上执行某些工作,然后将对象返回到池中。然后,该连接可用于下一个连接请求。
连接池可促进连接对象的重用,并减少创建连接对象的次数。连接池显着提高了数据库密集型应用程序的性能,因为创建连接对象在时间和资源上都非常昂贵。
现在这些
DataSource
和
ConnectionPoolDataSource
对象的部署,程序员可以使用
DataSource
对象来获取连接池。获取池化连接的代码与获取非池化连接的代码一样,如以下两行所示:
ctx = new InitialContext();
ds = (DataSource)ctx.lookup("jdbc/fastCoffeeDB");
该变量
ds
表示一个
DataSource
对象,该对象产生与数据库的池化连接
COFFEEBREAK
。您只需要检索
DataSource
一次该对象,因为您可以使用它来产生所需的任意多个池连接。
getConnection
在
ds
变量上调用方法会自动产生一个池化连接,因为
DataSource
该
ds
变量代表的对象已配置为产生池化连接。
连接池通常对程序员是透明的。使用池连接时,只需要做两件事:
-
使用
DataSource
对象而不是
DriverManager
类来获得连接。在下面的代码行中,
ds
是一个
DataSource
对象的实现和部署,以便它将创建池连接,
username
并且
password
是代表有权访问数据库的用户凭据的变量:
Connection con = ds.getConnection(username, password);
-
使用
finally
语句关闭池化连接。在适用于使用池化连接的代码的代码块
finally
之后,将出现以下
try/catch
代码块:
try {
Connection con = ds.getConnection(username, password);
// ... code to use the pooled
// connection con
} catch (Exception ex {
// ... code to handle exceptions
} finally {
if (con != null) con.close();
否则,使用池连接的应用程序与使用常规连接的应用程序相同。应用程序程序员在完成连接池时可能会注意到的唯一另一件事是性能更好。
以下示例代码获取一个DataSource
对象,该对象产生与数据库的连接,COFFEEBREAK
并使用它来更新表中的价格COFFEES
:
import java.sql.*;
import javax.sql.*;
import javax.ejb.*;
import javax.naming.*;
public class ConnectionPoolingBean implements SessionBean {
// ...
public void ejbCreate() throws CreateException {
ctx = new InitialContext();
ds = (DataSource)ctx.lookup("jdbc/fastCoffeeDB");
public void updatePrice(float price, String cofName,
String username, String password)
throws SQLException{
Connection con;
PreparedStatement pstmt;
try {
con = ds.getConnection(username, password);
con.setAutoCommit(false);
pstmt = con.prepareStatement("UPDATE COFFEES " +
"SET PRICE = ? " +
"WHERE COF_NAME = ?");
pstmt.setFloat(1, price);
pstmt.setString(2, cofName);
pstmt.executeUpdate();
con.commit();
pstmt.close();
} finally {
if (con != null) con.close();
private DataSource ds = null;
private Context ctx = null;
此代码示例中的连接参与连接池,因为以下是正确的:
- 一个类实现的实例
ConnectionPoolDataSource
已部署。 DataSource
已经部署了一个类实现的实例,并且为其dataSourceName
属性设置的值是绑定到先前部署的ConnectionPoolDataSource
对象的逻辑名称。
请注意,尽管此代码与您之前看到的代码非常相似,但在以下方面有所不同:
-
它进口javax.sql
,javax.ejb
和javax.naming
包除java.sql
。
的DataSource
和ConnectionPoolDataSource
接口处于javax.sql
封装,JNDI构造InitialContext
和方法Context.lookup
是的一部分javax.naming
封装。此特定示例代码采用使用javax.ejb
包中API的EJB组件的形式。该示例的目的是说明使用池化连接的方式与使用非池化连接的方式相同,因此您不必担心理解EJB API。
-
它使用DataSource
对象来获得连接,而不是使用DriverManager
设施。
-
它使用一个finally
块来确保关闭连接。
获取和使用池化连接类似于获取和使用常规连接。当某人充当系统管理员正确部署了一个ConnectionPoolDataSource
对象和一个DataSource
对象后,应用程序将使用该DataSource
对象来获得池化连接。但是,应用程序应使用finally
块来关闭池化连接。为简单起见,前面的示例使用一个finally
块,但不使用任何catch
块。如果该try
块中的方法引发了异常,则默认情况下将引发该异常,finally
无论如何该子句都将执行。
DataSource
可以部署对象以获得可在分布式事务中使用的连接。与连接池一样,必须部署两个不同的类实例:一个XADataSource
对象和一个DataSource
实现为与之协同工作的对象。
假设The Coffee Break企业家购买的EJB服务器包含DataSource
类com.applogic.TransactionalDS
,XADataSource
该类与诸如com.dbaccess.XATransactionalDS
。它可以与任何XADataSource
类一起使用的事实使EJB服务器可以跨JDBC驱动程序移植。当DataSource
与XADataSource
物体的部署,产生的连接将能够参与分布式事务。在这种情况下,将com.applogic.TransactionalDS
实现该类,以使生成的连接也成为池连接,对于DataSource
作为EJB服务器实现的一部分提供的类,通常是这种情况。
该XADataSource
对象必须首先部署。以下代码创建的实例com.dbaccess.XATransactionalDS
并设置其属性:
com.dbaccess.XATransactionalDS xads = new com.dbaccess.XATransactionalDS();
xads.setServerName("creamer");
xads.setDatabaseName("COFFEEBREAK");
xads.setPortNumber(9040);
xads.setDescription("Distributed transactions for COFFEEBREAK DBMS");
以下代码向JNDI命名服务注册com.dbaccess.XATransactionalDS
对象xads
。请注意,与之关联的逻辑名称在下方添加xads
了子上下文。Oracle建议类的任何实例的逻辑名称始终以开头。xa
jdbc
com.dbaccess.XATransactionalDS
jdbc/xa
Context ctx = new InitialContext();
ctx.bind("jdbc/xa/distCoffeeDB", xads);
接下来,部署DataSource
实现xads
与其他XADataSource
对象交互的对象。请注意,DataSource
类com.applogic.TransactionalDS
可以与XADataSource
任何JDBC驱动程序供应商的类一起使用。部署DataSource
对象涉及创建com.applogic.TransactionalDS
类的实例并设置其属性。该dataSourceName
属性设置为jdbc/xa/distCoffeeDB
,与关联的逻辑名称com.dbaccess.XATransactionalDS
。这是实现XADataSource
该类的分布式事务处理功能的DataSource
类。以下代码部署DataSource
该类的实例:
com.applogic.TransactionalDS ds = new com.applogic.TransactionalDS();
ds.setDescription("Produces distributed transaction " +
"connections to COFFEEBREAK");
ds.setDataSourceName("jdbc/xa/distCoffeeDB");
Context ctx = new InitialContext();
ctx.bind("jdbc/distCoffeeDB", ds);
既然类的实例com.applogic.TransactionalDS
,并com.dbaccess.XATransactionalDS
已经部署,应用程序可以调用该方法getConnection
的实例TransactionalDS
类来获取到的连接COFFEEBREAK
可在分布式事务中使用的数据库。
要获得可用于分布式事务的连接,必须使用DataSource
已正确实现和部署的对象,如“部署分布式事务”部分中所示。使用这样的DataSource
对象,对其调用方法getConnection
。建立连接后,请像使用其他任何连接一样使用它。由于jdbc/distCoffeesDB
已与XADataSource
JNDI命名服务中的对象相关联,因此以下代码生成了Connection
可在分布式事务中使用的对象:
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("jdbc/distCoffeesDB");
Connection con = ds.getConnection();
对于此连接作为分布式事务的一部分时的使用方式,存在一些较小但重要的限制。事务管理器控制分布式事务何时开始以及何时提交或回滚。因此,应用程序代码绝不应调用方法Connection.commit
或Connection.rollback
。应用程序同样不应调用Connection.setAutoCommit(true)
,它启用了自动提交模式,因为这也会干扰事务管理器对事务边界的控制。这说明了为什么在分布式事务范围内创建的新连接默认情况下会禁用其自动提交模式。请注意,这些限制仅在连接参与分布式事务时才适用。连接不是分布式事务的一部分时,没有任何限制。
对于以下示例,假设已订购一份咖啡,这将触发对位于不同DBMS服务器上的两个表的更新。第一个表是一个新INVENTORY
表,第二个COFFEES
表是该表。因为这些表位于不同的DBMS服务器上,所以涉及它们的事务将是分布式事务。以下示例中的代码(该示例获得一个连接,更新该COFFEES
表并关闭该连接)是分布式事务的第二部分。
请注意,由于分布式事务的范围由中间层服务器的基础系统基础结构控制,因此代码不会明确地提交或回退更新。同样,假设用于分布式事务的连接是池化连接,则应用程序使用一个finally
块来关闭该连接。这样可以保证即使抛出异常也将关闭有效的连接,从而确保将连接返回到连接池以进行回收。
下面的代码示例说明了一个Enterprise Bean,它是一个实现可以由客户端计算机调用的方法的类。这个例子的目的是说明用于分布式事务应用程序代码是没有从其他代码不同,除了它不调用Connection
方法commit
,rollback
或setAutoCommit(true)
。因此,您不必担心了解所使用的EJB API。
import java.sql.*;
import javax.sql.*;
import javax.ejb.*;
import javax.naming.*;
public class DistributedTransactionBean implements SessionBean {
// ...
public void ejbCreate() throws CreateException {
ctx = new InitialContext();
ds = (DataSource)ctx.lookup("jdbc/distCoffeesDB");
public void updateTotal(int incr, String cofName, String username,
String password)
throws SQLException {
Connection con;
PreparedStatement pstmt;
try {
con = ds.getConnection(username, password);
pstmt = con.prepareStatement("UPDATE COFFEES " +
"SET TOTAL = TOTAL + ? " +
"WHERE COF_NAME = ?");
pstmt.setInt(1, incr);
pstmt.setString(2, cofName);
pstmt.executeUpdate();
stmt.close();
} finally {
if (con != null) con.close();
private DataSource ds = null;
private Context ctx = null;
连接数据源对象本节介绍DataSource对象,这是获得与数据源的连接的首选方法。除了它们的其他优点(将在后面解释)之外,DataSource对象还可以提供连接池和分布式事务。此功能对于企业数据库计算至关重要。特别是,它是Enterprise JavaBeans(EJB)技术不可或缺的。本节向您展示如何使用该DataSource接口获得连接以及如何使用分布式事务和连接池。两者都涉及JDBC应用程序中很少的代码更改。系统管理员通常使用工具(例如Apache Tomcat或Oracl...
<br>【原 书 名】 Professional Java Data <br>【原出版社】 Wrox <br>【作 者】[美] Danny Ayers ,John Bell ,Carl Calvert Bettis等 <br>【译 者】 戴英 张晓晖 王辉 等 <br>【丛 书 名】 乐思公司编程指南系列 <br><br>http://images.china-pub.com/ebook/5221/shupi.jpg<br><br>Java是一种功能强大的编程平台,带有大量的Application Programming Interfaces(APIs,应用程序编程接口)。在本书中,我们将研究Java用于访问和处理数据的各种技术。本书将向读者介绍如何使用Java开发企业级的分布式应用程序,其中涉及生成、处理、存储、 与检索各种类型的数据与不同的数据库。<br>本书按照一定的逻辑顺序分为六个部分。在相互的基础上,前四部分深入广泛地探讨了各种Java技术,它们可以组合或单独用于为各种数据访问与处理情况开发实际方案。第五部分中的案例研究包括了一些实际的围绕数据的应用程序范例。<br>本书只需要读者具有Java的使用知识,所有的技术与概念都会用图表与实际范例充分给予解释。<br><br>目录<br>第一部分 软件、对象、数据设计与建模<br>第1章 软件开发的方法与过程<br>为什么我们需要方法与过程<br>什么是软件方法与过程<br>方法的内容<br>过程模型<br>源代码管理的要素<br>软件缺陷与修改的跟踪和解决方案<br>软件品质<br>参考文献<br>第2章 面向对象的分析与设计<br>OOA、OOD与OOP<br>面向对象的分析<br>面向对象的设计<br>小结<br>第3章 用UML进行对象建模<br>为什么使用UML<br>什么是UML<br>UML图表<br>如何将UML建模图表配合在一起<br>如何将UML合并到我们的项目中<br>可以考虑的一些UML CASE工具<br>小结<br>第4章 数据建模<br>数据建模的阶段<br>可以考虑的一些数据建模工具<br>小结<br>第二部分 数据库访问<br>第5章 数据库的概念与技术<br>数据库设计 <br>数据库规格化与数据仓库<br>数据库视图<br>数据库元数据<br>临时表<br>约束<br>静态SQL与动态SQL<br>准备语句<br>事务处理与隔离级别<br>存储过程<br>触发器<br>复制<br>优化基础<br>小结<br>第6章 Java数据库连接(JDBC)<br>什么是JDBC<br>JDBC结构<br>开始起步<br>使用JDBC<br>一个简单的范例<br>对映Java与SQL类型<br>处理SQL错误<br>ResultSet与数据库元数据<br>JDBC中的事务处理<br>一个JDBC事务范例<br>JDBC事务隔离级别<br>保存点<br>使用光标<br>PreparedStatement接口<br>批更新<br>CallableStatement<br>JDBC Escape语法<br>JDBC支持类<br>小结<br>第7章 JDBC 2.0可选包<br>简介<br>DataSource与JNDI<br>连接池<br>RowSet<br>分布式事务与Optional Package<br>小结<br>第8章 SQLJ<br>简介<br>什么是SQLJ<br>准备开始<br>使用SQLJ<br>SQLJ定制<br>小结<br>第9章 数据库性能问题<br>本地编译机制<br>挑选适当的JDBC驱动程序<br>连接池<br>事务和批量查询<br>存储过程和JDBC准备语句<br>JDBC准备语句<br>在程序块上检索大数据集合<br>高速缓存频繁使用的数据<br>性能监控<br>小结<br>第10章 Java和ODMG 3.0规范<br>基础<br>ODMG的核心概念<br>对象定义语言<br>小结<br>第11章 目录服务与JNDI<br>命名与目录服务<br>使用JNDI<br>JAVA与LDAP<br>从理论到实践<br>标准的LDAP操作<br>LDAP服务器改进<br>在LDAP中存储并检索Java对象<br>其他目录服务<br>小结<br>第三部分 网络客户机上的数据显示<br>第12章 Web体系结构<br>引言<br>典型的Web中心体系结构<br>应用程序体系结构<br>Web中心应用程序的判定标准<br>小结<br>第13章 服务程序(Servlets)<br>概述<br>服务程序的结构<br>服务响应<br>服务程序Cookies<br>会话跟踪<br>深入性主题<br>小结<br>第14章 使用服务程序进行数据访问<br>引言<br>使用服务程序的数据库连接<br>范例应用程序<br>JDBC驱动器之结语<br>小结<br>第15章 JSP<br>JSP与服务程序<br>JSP与ASP<br>实现JSPs<br>JavaServer Page范例<br>JavaBeans综述<br>在JSPs中使用JavaBeans<br>JSP事宜<br>资源<br>小结<br>第16章 使用JSP进行数据访问<br>访问数据<br>范例应用程序<br>深入性主题<br>小结<br>第17章 分析和生成XML<br>文档和数据<br>XML概述<br>Java XML技术<br>生成XML<br>读取XML<br>小结<br>第18章 WAP客户机<br>WAP概览<br>WAP构成组件<br>WML基础<br>Java服务程序和WML<br>WML服务程序和JDBC<br>相关URLs<br>小结<br>第四部分 Enterprise JavaBeans与分布式应用程序<br>第19章 Enterprise JavaBeans<br>Enterprise JavaBean体系结构<br>一个简单的Enterprise JavaBean<br>会话Beaus<br>面向对象与关系模型<br>实体beans<br>数据映射<br>EJB事务置<br>EJB 2.0<br>小结<br>第20章 Java事务API(JTA)和Java事务服务(JTS)<br>进行事务处理的理由<br>使用事务处理的益处<br>事务处理的属性<br>事务服务<br>理论足已!一些Java细节<br>设计性事务处理<br>铭记要点<br>小结<br>第21章 开发EJB客户机<br>引言 <br>EJBs的客户机<br>小结<br>第22章 开发可扩缩的EJB应用程序<br>引言<br>Enterprise JavaBeans的优点<br>EJB的广阔开放空间<br>Enterprise JavaBeansas行范例<br>可扩缩性概念和目的<br>数据传输概念<br>传输简单对象<br>静态数据传输<br>复合对象传输和集合<br>ePIM的基本设计<br>测试代码<br>利用Facade和Proxy模式减少网络通信量<br>进一步增强<br>小结<br>第23章 J2EE通信<br>通信概述<br>JMS的详细情况<br>消息驱动EJB<br>小结<br>第24章 Java数据对象(JDO)<br>概述<br>JDO对象模型<br>JDO API<br>JDO实例的生命周期<br>JDO和EJB<br>开发可持久类<br>范例应用程序<br>配置FFJ<br>配置数据源<br>捕获数据库模式<br>把类映射到数据库对象<br>编译类<br>小结<br>第五部分 案例分析<br>第25章 案例分析:XML网站入口<br>案例分析综述<br>XML-Client应用程序<br>XML跳过HTTP<br>配置<br>开始应用程序服务器<br>XML-RPC<br>小结<br>第26章 案例分析:网站通信量的统计分析<br>案例分析综述<br>客户机网站<br>跟踪应用程序<br>配置<br>小结<br>第27章 案例分析:网络数据工具箱<br>任务<br>逐步实现工具箱<br>前进道路<br>小结<br>第28章 案例分析:WAP Tic-Tac-Toe游戏<br>纵览应用程序结构<br>玩游戏<br>存储并检索分数:JDBC连接<br>会话管理<br>安装应用程序组件<br>相关的URL<br>小结<br>第六部分 附录<br>附录A SQL入门<br>什么是SQL<br>什么是数据库<br>关系数据库基础<br>关系数据库的优点和缺点<br>SQL:数据定义<br>基本数据操作<br>数据完整性<br>表达式<br>连接<br>合并<br>子查询<br>小结<br>附录B 序列化<br>简介<br>序列化<br>可串行化的接口<br>小结<br>附录C Java和分布式应用程序<br>分布式系统<br>分布式数据库应用程序<br>在分布式应用程序的Java<br>小结<br>附录D 配置Tomcat、JRun和Orion<br>Tomcat安装和配置<br>JRun 3.0安装和配置<br>安装检索<br>附录E 在WebLogic 6.0上配置并部署EJB<br>设置配置属性<br>生成EJB容器类<br>加载EJB类到WebLogic服务器<br>附录F UML符号<br>类和对象<br>关系<br>状态<br>对象相互作用<br><br><br>http://www.china-pub.com/5221<br><br>
这个项目是用Java开发的,目的是允许对象关系映射而无需复杂的事务处理和高级配置,它是出于教育目的而构建的。 使ORM的工作(尤其是初学者)更容易理解。
通过maven,只需克隆并通过mvn clean install创建项目,并将其添加到您的项目依赖项中
该应用程序的主要API是DataSource和PersistenceProvider 。
您通过通过DataSource类向PersistenceProvider提供信息来连接到数据库,就可以像这样创建DataSource:
DataSource source = new DataSourceBuilder ( " com.mysql.jdbc.Driver " , " jdbc:mysql: " )
.source( " Library " )
.host( " lo
1、框架是一个半成品,是一个脚手架,它可以方便的,快速的辅助开发人员针对某一领域进行快速开发;
2、使用框架,提高开发效率,减少重复代码,提高应用安全性,减少应用的bug;
3、框架一定是按照开发人员告诉他的方式去运行,交流的工具就是框架的配置文件或者约定;
面向对象
一个面向对象
queryForMap():查询结果,将结果集封装为map集合
queryForList():查询结果,将结果集封装为list集合
query():查询结果,将结果集封装为JavaBean对象
queryForObject:查询结果...