开发环境:本文使用Tomcat,Struts和MySQL。
为实现可扩展的DAO,本文将使用JNDI连接数据库,并将JNDI保存在XML文件里。同时也将调用sql语句的类 名保存在XML文件里。
例如:
1 dao-config.xml。该文件可以配置多个数据库的JNDI。在DAO初始化时,会将这些信息存入对象里。JNDI名为java:comp/env/jdbc/Colimas
<!--DOCTYPE dao SYSTEM "/DTD/dao.dtd"-->
<dao>
<dao-config id="base" type="jdbc">
<dao-param name="datasource">java:comp/env/jdbc/Colimas</dao-param>
</dao-config>
</dao>
2 dao-declaration.xml。该文件保存处理某数据库表的类名。
<dao>
<dao-object name="daoCBI">
<use-dao id="base"/>
<class>com.nova.colimas.data.sql.SQLTCBI</class>
</dao-object>
<dao-object name="daoUBI">
<use-dao id="base"/>
<class>com.nova.colimas.data.sql.SQLTUBI</class>
</dao-object>
<dao-object name="daoURM">
<use-dao id="base"/>
<class>com.nova.colimas.data.sql.SQLTURM</class>
</dao-object>
</dao>
3 配置JNDI。修改Tomcat的server.xml。在<host..>的<Context..>里面添加
<Resource name="jdbc/Colimas" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="root" password="197913" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/Colimas?autoReconnect=true"/>
网上的很多文章的JNDI配置方法都不一样。这个对MySQL 5.0的配置方法。另外要到www.mysql.com 里下载最新的jdbc driver: mysql-connector-java-3.1.10-bin.jar
拷贝到$(TOMCATHOME)\common\lib。
4 配置web.xml。在你的web app里调用jndi需要添加
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/Colimas</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
到web.xml。
5 初始化DAO配置信息。
在StartupServlet里装载Dao的配置信息。
public class StartupServlet extends Action {
/**
* List of DAO files
*/
public final static String PARAM_DAO = "dao";
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception{
// Get list of DAO files
initDAO();
logger.info("init DAO successfully");
return mapping.findForward("success");
}
/**
* Initialization of DAO environment
*/
private void initDAO() throws ServletException
{
//Constants.DAO的值为两配置文件名:/resources/config/dao-config.xml,/resources/config/dao-declaration.xml
StringTokenizer st = new StringTokenizer (Constants.DAO, ",");
while (st.hasMoreTokens())
{
String name = st.nextToken();
// Get associated resource
//获得配置文件的URL。
URL url = getClass().getResource(name);
if (url == null)
{
throw new ServletException ("Cannot find resource for " + name);
}
else
{
try
{
//使用DAO工厂加载配置文件信息。
DAOFactory.addConfiguration (url);
}
catch (DAOFactoryException ex)
{
throw new ServletException ("Cannot initialize DAO", ex);
}
}
}
}
}
6 DAO工厂类 DAOFactory
根据输入的dao-object name来实例化DAO对象。
public abstract class DAOFactory {
//得到DAOObject
public static DAOObject getDAOObject(String daoName, DAOContext daoContext) throws DAOFactoryException
{
// Gets the DAO object declaration
// Gets the associated factory
// Creates DAO object
return factory.newDAOObject(objectDeclaration);
}
/**
* @see com.ibm.services.epricer.framework.dao.DAOFactory#newDAOObject(DAOObjectDeclaration)
*/
protected DAOObject newDAOObject(DAOObjectDeclaration objectDeclaration) throws DAOFactoryException
{
// Gets class
Class objectClass = (Class) classes.get(objectDeclaration.getName());
if (objectClass == null)
{
synchronized (classes)
{
try
{
objectClass = Class.forName(objectDeclaration.getClassName());
}
catch (ClassNotFoundException e)
{
throw new DAOFactoryException (this, "Cannot instantiate the DAO object class " + objectDeclaration.getClassName(), e);
}
classes.put(objectDeclaration.getName(), objectClass);
}
}
try
{
//初始化DAOObject,并将自己传入DAOObject。
DAOObject object = (DAOObject) objectClass.newInstance();
object.init(this);
return object;
}
catch (Exception ex)
{
throw new DAOFactoryException(this, "Cannot create DAO object " + objectDeclaration.getName(), ex);
}
}
/**
* Add a configuration file for the DAO
*/
public synchronized static void addConfiguration(URL url) throws DAOFactoryException
{}
}
实现JDBC的DAOFactory
public class JDBCDAOFactory extends DAOFactory {
/**
* Factory parameter, JDBC name of the Data source (example : jdbc/DataSource)
*/
public final static String PARAM_DATASOURCE = "datasource";
/**
* JDBC Data Source
*/
private DataSource dataSource;
private Logger logger;
/**
* Initializes the Data source.
*/
protected void init(Map parameters) throws DAOFactoryException
{
logger = Logger.getLogger(this.getClass());
// Gets the data source name
String dsName = (String)parameters.get (PARAM_DATASOURCE);
if (dsName == null)
{
throw new DAOFactoryException (this, "Cannot find 'datasource' parameter to initialize the DAO factory.");
}
else
{
try
{
// JNDI context
Context initialContext = new InitialContext ();
// Gets the data source
dataSource = (DataSource) initialContext.lookup(dsName);
}
catch (NamingException ex)
{
throw new DAOFactoryException (this, "Cannot find JDBC Data Source with JNDI name " + dsName, ex);
}
}
}
/**
* Gets a connection from the data source.
* First, this method try to get the registered connection from the <code>context</code>.
* If not found, a new connection is created and then registered into the <code>context</code>.
* @see JDBCDAOSource
* @param context Current context for DAO accesses
* @return The DAO source to use (for this factory, it is an instance of <code>JDBCDAOSource</code>
* @throws DAOFactoryException If the connection cannot be created.
*/
public DAOSource getDAOSource(DAOContext context) throws DAOFactoryException
{
// Gets the DAO source from the context
DAOSource source = context.getDAOSource(this);
if (source != null)
{
return source;
}
else
{
try
{
// Creates the connection
Connection connection = dataSource.getConnection();
Courie
分享到:
相关推荐
DAO(Data Access Object)技术是Java编程中一种常见的数据访问模式,...通过使用DAO,我们可以构建一个清晰、可扩展的架构,有效地管理和操作数据库。在实际项目中,配合Oracle数据库,可以实现高效、安全的数据访问。
例如,STRUTS框架中的数据持久化可以通过DAO模式来实现,以降低组件间的耦合度,提高代码的可维护性和可扩展性。 DAO模式的组成部分通常包括以下几点: 1. **数据访问接口**:这是DAO的核心,定义了对数据源进行...
数据库DAO(Data Access Object)操作是Java编程中用于与数据库交互的一种常见模式。...然而,随着技术的发展,开发者越来越倾向于使用ORM框架,以减少手动编写JDBC代码的工作量,并提高代码的可维护性和可扩展性。
DAO模式在实际项目中广泛应用,尤其在大型系统中,能够提高代码的可读性、可维护性和可扩展性。例如,当我们需要更换数据库系统(如从MySQL切换到Oracle),只需要修改DAO实现,而不需要改动大量的业务代码。 在...
DAO(Data Access Object)分层思想是软件设计模式中一种常用的数据访问模式,它主要用于将业务逻辑与数据访问逻辑分离,提升代码的可维护性和可扩展性。在C#编程中,DAO层扮演着关键角色,它使得应用程序可以与...
在Java或.NET等编程语言中,DAO模式被广泛应用于实现应用程序与数据库之间的交互。在本案例中,"Dao.rar_dao" 提供的文件集合似乎是一个关于DAO模式的C++项目。 1. **DAO设计模式**:DAO模式的核心思想是将业务逻辑...
总结来说,"dao.rar_dao"提供的是一套基于JXVA框架的泛型DAO实现,旨在帮助开发者高效地处理数据库操作,提升代码的可维护性和可扩展性。通过对泛型DAO的深入理解和应用,可以更好地组织和管理项目中的数据访问层,...
通过上述方式,DAO模式不仅实现了业务逻辑与数据访问的分离,还提高了代码的可重用性和可扩展性,使得应用程序更容易适应不断变化的数据库环境和技术需求。在实际项目开发中,结合使用DAO模式和其他设计模式(如工厂...
DAO(Data Access Object)模式是软件开发中常用的一种设计模式,主要用于数据库操作的抽象和...同时,了解如何将DAO模式与其他设计模式(如工厂模式、单例模式等)结合使用,可以进一步提高代码的可扩展性和可维护性。
总结来说,"StuDAO.rar_dao"压缩包提供了一个学习DAO模式的实践案例,通过学习这个案例,开发者可以掌握如何设计和实现DAO,以及如何利用DAO模式来优化数据库操作,提高软件的可扩展性和可维护性。
在Java编程语言中,"泛型DAO"(Generic DAO)是一种设计模式,它允许开发者创建可重用的数据访问对象(DAOs),以处理多种不同类型的实体对象,而无需为每种对象编写单独的DAO实现。这种方法提高了代码的复用性和可...
1. **DAO模式**:DAO模式的核心思想是创建一个接口,该接口定义了对数据库进行操作的方法,然后为每个数据库实体创建一个实现了该接口的具体类。这样,业务层可以通过调用DAO接口的方法来处理数据,而不直接与数据库...
在软件设计模式中,工厂模式和DAO(Data Access Object)模式是两种常用的设计模式,它们在实际开发中扮演着至关重要的角色...通过深入理解和实践这两种模式,能够提升我们的编程技巧,使代码更具有灵活性和可扩展性。
在软件开发领域,特别是企业级应用开发中,为了提高代码的可读性、可维护性和可扩展性,通常会采用分层架构的设计模式。其中,数据访问层(Data Access Object, DAO)作为连接业务逻辑层与底层数据存储的关键组成...
该项目采用了面向对象编程(OOP)的思想,结合了DAO(Data Access Object)设计模式和MVC(Model-View-Controller)设计模式。其中: - **DAO设计模式**:定义了一组接口来封装对数据库的操作,使业务逻辑与数据访问...
在描述中提到的场景中,开发者在处理数据持久化时,决定采用DAO模式来提高代码的可维护性和可扩展性。 DAO模式的主要优点在于: 1. **松耦合**:业务组件如实体Bean、会话Bean、Servlets和JSP助手对象等与具体的...
在实现这些DAO类时,我们通常会使用面向接口编程,定义DAO接口,然后为每个接口提供具体的实现。这样做的好处是可以在不修改业务代码的情况下,轻松地更换不同的数据存储方案(如从关系型数据库切换到NoSQL数据库)...
综上所述,DAO模式是软件开发中处理数据访问的重要工具,它使得业务逻辑和数据访问层的耦合度降低,提高了代码的可扩展性和可维护性。通过学习和实践这个"DAO入门的实用例子",新手可以更好地理解和掌握DAO模式的...
4. **提升拓展性**:当添加新的数据实体类时,只需简单地声明新的实体类类型,而无需修改已有的DAO实现,易于扩展。 5. **提高可维护性**:代码结构清晰,模块化程度高,易于理解和维护。 在Java Web框架如Struts和...
通过对DAO模式的理解与应用,可以有效地降低业务逻辑与数据访问之间的耦合度,提高系统的可维护性和扩展性。特别是在J2EE环境下,通过采用DAO模式,可以更好地管理和优化复杂的数据访问操作,确保系统的稳定运行。...