数据访问对象模式或 DAO 模式用于将低级数据访问 API 或操作与高级业务服务分开。以下是数据访问对象模式的参与者。
UML 图数据访问对象模式
设计组件
- BusinessObject : BusinessObject 代表数据客户端。它是需要访问数据源以获取和存储数据的对象。除了访问数据源的 servlet 或帮助程序 bean 之外,BusinessObject 还可以实现为会话 bean、实体 bean 或其他一些Java对象。
- DataAccessObject : DataAccessObject 是此模式的主要对象。 DataAccessObject 抽象了 BusinessObject 的底层数据访问实现,以实现对数据源的透明访问。
- DataSource :这表示数据源实现。数据源可以是数据库,例如 RDBMS、OODBMS、XML 存储库、平面文件系统等。数据源也可以是另一个系统服务或某种存储库。
- TransferObject :这表示用作数据载体的传输对象。 DataAccessObject 可以使用传输对象将数据返回给客户端。 DataAccessObject 也可以在 Transfer Object 中接收来自客户端的数据以更新数据源中的数据。
让我们看一个数据访问对象模式的例子。
// Java program to illustrate
// Data Access Object Pattern
import java.util.List;
import java.util.ArrayList;
import java.util.List;
class Developer
{
private String name;
private int DeveloperId;
Developer(String name, int DeveloperId)
{
this.name = name;
this.DeveloperId = DeveloperId;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getDeveloperId()
{
return DeveloperId;
}
public void setDeveloperId(int DeveloperId)
{
this.DeveloperId = DeveloperId;
}
}
interface DeveloperDao
{
public List getAllDevelopers();
public Developer getDeveloper(int DeveloperId);
public void updateDeveloper(Developer Developer);
public void deleteDeveloper(Developer Developer);
}
class DeveloperDaoImpl implements DeveloperDao
{
List Developers;
public DeveloperDaoImpl()
{
Developers = new ArrayList();
Developer Developer1 = new Developer("Kushagra",0);
Developer Developer2 = new Developer("Vikram",1);
Developers.add(Developer1);
Developers.add(Developer2);
}
@Override
public void deleteDeveloper(Developer Developer)
{
Developers.remove(Developer.getDeveloperId());
System.out.println("DeveloperId " + Developer.getDeveloperId()
+ ", deleted from database");
}
@Override
public List getAllDevelopers()
{
return Developers;
}
@Override
public Developer getDeveloper(int DeveloperId)
{
return Developers.get(DeveloperId);
}
@Override
public void updateDeveloper(Developer Developer)
{
Developers.get(Developer.getDeveloperId()).setName(Developer.getName());
System.out.println("DeveloperId " + Developer.getDeveloperId()
+ ", updated in the database");
}
}
class DaoPatternDemo
{
public static void main(String[] args)
{
DeveloperDao DeveloperDao = new DeveloperDaoImpl();
for (Developer Developer : DeveloperDao.getAllDevelopers())
{
System.out.println("DeveloperId : " + Developer.getDeveloperId()
+ ", Name : " + Developer.getName());
}
Developer Developer =DeveloperDao.getAllDevelopers().get(0);
Developer.setName("Lokesh");
DeveloperDao.updateDeveloper(Developer);
DeveloperDao.getDeveloper(0);
System.out.println("DeveloperId : " + Developer.getDeveloperId()
+ ", Name : " + Developer.getName());
}
}
输出:
DeveloperId : 0, Name : Kushagra
DeveloperId : 1, Name : Vikram
DeveloperId 0, updated in the database
DeveloperId : 0, Name : Lokesh
好处 :
- 使用数据访问对象的优点是应用程序的两个重要部分之间相对简单和严格地分离,这两个部分可以但不应该相互了解,并且可以预期会频繁和独立地发展。
- 如果我们需要改变底层的持久化机制,我们只需要改变 DAO 层,而不是域逻辑中使用 DAO 层的所有地方。
缺点:
- 使用 DAO 的潜在缺点是抽象泄漏、代码重复和抽象反转。
参考 :
http://www.oracle.com/technetwork/的Java/dataaccessobject-138824.html