【发布时间】:2020-06-02 09:22:17
【问题描述】:
我目前正在编写一个三层架构银行应用程序作为学生项目。 由于我理解了 Dao 模式,我实现了它并想处理与它的数据库交互,但我实际上做不到,因为我的 dao 类无法访问数据库单例 getInstanceDB。 dao 类是一个接口的实现。这些类都在同一个包中。 这似乎是一个可见性问题,因为 Singleton 在除自身之外的任何其他类中都不可调用。 这是代码。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Database {
private static Database instance;
private Connection conn;
private Statement stmt;
private Database() {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@oracle.leuphana.de:1521:oradb1", "...", "...");
stmt = conn.createStatement();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
// Thread-Safe Singleton
public static synchronized Database getInstanceDB() {
if (instance == null) {
instance = new Database();
}
return instance;
}
}
// Select Data by CustomerID
@Override
public ResultSet select(Kunde kunde) {
if (kunde == null)
throw new IllegalArgumentException("given id is null");
if (kunde.getId() < 0)
throw new IllegalArgumentException("given id has an invalid value");
String query = "SELECT * FROM customer WHERE customer_id=" + Integer.toString(kunde.getId());
ResultSet rs = null;
try {
Connection conn = getInstanceDB().getConnection();
Statement stmt = conn.createStatement();
rs = stmt.executeQuery(query);
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
我是stackoverflow的新手,希望这个帖子没问题,如果您需要更多信息,请问我^^
编辑: 错误:方法 getInstanceDao() 未定义 KundeDao 类型 getConnection() 看答案,除了catch部分是一样的
感谢您提供快速而有帮助的答案。
【问题讨论】:
-
你得到什么错误?
-
没有错误信息,我只能猜测:可能是
Database.getInstanceDB().getConnection();而不是getInstanceDB().getConnection();? -
您的数据库连接逻辑有点错误。您正在创建一个私有构造函数来创建一个数据库连接,并且在创建实例之后,您正在尝试访问您从未创建的 getConnection() 以供公共共享。
-
新海报的教训:请使您的代码完整参见minimal reproducible example。您省略了
getConnection的定义以及调用方法是在同一个类中还是在另一个类中等基本部分。代码需要足够完整,我们才能编译并尝试运行。此外,如果您收到错误消息,请始终将其包含在您的问题中,格式为代码(不是图像)。请使用edit 链接解决这些问题。 -
错误是:“方法getInstanceDB() 未定义KundeDao 类型”。 @TomStroemer 这就是解决方案,谢谢。好的,我已经怀疑我的数据库逻辑是错误的,我目前正在尝试了解 OJDBC 是如何工作的。在我看来,文档有点勉强。