我从这里读过关于DAO的文章,我发现它真的很有趣,但有些东西仍然让我失望。 我想使用Interface实现两个不同的数据源 - 一个是Socket连接,另一个是数据库连接。
为此我做了以下事情:
public class databasePartDAOImplementation extends Database implements PartDAO {
//implementation
}
和Database类有一个构造函数和一些管理此连接的方法。我如何设置这些类,因此我可以实例化一个数据库连接,然后使用这一个连接使用多个DAO?
我正在考虑创建和实例化Database()并在需要时将其投射到所有DAO中,但我不确定是否有任何挫折。
我使用的数据库类看起来像这样
public class Database
{
protected Connection connection;
public Database() throws ClassNotFoundException
{
Class.forName("org.sqlite.JDBC");
connection = null;
try
{
connection = DriverManager.getConnection("jdbc:sqlite:database.s3db");
}
catch(SQLException e)
{
System.err.println(e.getMessage());
}
}
public Connection getConnection() {
return connection;
}
}
tl; dr使用这个是访问数据库的好主意吗?
Database db = new Database();
databasePartDAOImplementation dao = (databasePartDAOImplementation) db;
dao.getAllRecords();
答案 0 :(得分:1)
关于DAO应该管理与其数据源的连接以获取和存储数据这一点,您是部分正确的。但是,正如您所问,我们如何让所有DAO共享相同的连接?让我通过考虑以下策略来阐明一些问题,然后事情将会落实到位:
自动生成DAO代码:通常,业务对象,DAO及其基础数据库表之间存在关系。可以使用该关系自动生成代码。在复杂的情况下,您可以使用第三方工具进行代码生成。可能不是你想要的,但我只是想把它放在那里。
DAO工厂:
在您处理不同数据源的场景中(这很可能是您的场景),您将创建一个抽象的DAO工厂(这是抽象工厂模式)。然后,再次使用 Factory Method 模式,您的抽象DAO工厂为每个特定数据源创建具体的DAO工厂。每个具体的DAO工厂将负责两项主要任务:
createConnection
),负责创建与其特定数据源的连接。您应该考虑连接池的实现和使用情况。由具体DAO工厂创建的所有DAO都可以调用该静态方法(createConnection
)以获取与特定数据源的连接。这个连接在具体的DAO工厂的所有DAO中基本上是相同的连接。
本回答中提出的想法基于详细文章Core J2EE Patterns - Data Access Object。