有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java Singleton是公共静态的,但不可访问

我目前正在编写一个三层体系结构的银行应用程序,作为一个学生项目。 当我理解Dao模式时,我实现了它,并希望处理与它的数据库交互,但实际上我不能,因为我的Dao类不能访问数据库singleton 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的新手,我希望这个帖子可以,如果你需要更多信息,尽管问我^^

编辑: 错误:未为KundeDao类型定义getInstanceDao()方法 getConnection()看到答案了吗,除了catch部分外,其他都是一样的

谢谢你快速而有用的回答


共 (1) 个答案

  1. # 1 楼答案

    我觉得你的逻辑有点错误。试试这样

    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以获得更方便的方法