java - Java Singleton 不可访问,尽管它是公共静态的
问题描述
我目前正在编写一个三层架构银行应用程序作为学生项目。由于我理解了 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() 类型查看答案,除了捕获部分外,它是相同的
感谢您提供快速而有用的答案。
解决方案
我觉得你的逻辑有点不对。尝试这样的事情。
public Connection getConnection() {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@oracle.leuphana.de:1521:oradb1", "...", "...");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
然后创建您的数据库实例并像这样调用 getConnection() 方法。
Database dbInstance = Database.getInstanceDB();
public void anyMethod(){
try {
Connection conn = dbInstance.getConnection();
Statement stmt = conn.createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
}
注意:要打开关闭连接,您应该使用try-with-resources
更方便的方法。
推荐阅读
- elasticsearch - ElasticSearch 使用动态映射将字符串转换为数字
- flutter - chart_flutter ^0.6.0 版本解决失败
- python - Python:UnicodeEncodeError:'ascii'编解码器无法编码字符
- linux - 从串行终端读取时确定 \r 伪影的原因?
- python - 如何使用字典作为输入进行多线程处理?
- haskell - 类/实例类型检查规则学习资源
- jenkins - Jenkins:让 email-ext 与令牌宏插件一起使用
- jquery - 使用 jQuery.validate() 验证 HTML5 分隔的表单
- xamarin.forms - xamarin mqtt 未订阅消息
- html - BR 在/之前/之后 DIV