首页 > 解决方案 > 如何使用 Java 从 Oracle 数据库中获取记录

问题描述

我正在使用 JDBC 使用 Java 学习数据库。JDBC在阅读了互联网上的一些文章后,我创建了一个非常基本的程序。我的代码没有给出任何错误,但我也没有得到输出。这是我的代码:

这是我的连接代码:DataService

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    public class DataService {
        static Connection con;
        public static void main(String args[]){
            try {
                Class.forName("oracle.jdbc.driver.OracleDriver");
                con=DriverManager.getConnection(
                "jdbc:oracle:thin:@localhost:1521:xe","system","scott");
            }
            catch(Exception e){ 
                System.out.println(e);
            }
        }
        
        public ResultSet getRecords() {
            System.out.println("inside getRecords()");
            ResultSet rs=null;
            try {
                System.out.println("Inside Rs loop");
                Statement stmt=con.createStatement();
                rs=stmt.executeQuery("select * from emp");
                System.out.println("RS before entering while: "+rs);
                while(rs.next())
                    System.out.println("Inside while loop");
                    System.out.println("Data: " +rs.getInt(0)+"  "+rs.getString(1));
            } catch (SQLException ex) {
                Logger.getLogger(DataService.class.getName()).log(Level.SEVERE, null, ex);
            }
            System.out.println("Before sending: "+rs);
            return rs;
        }
    }

这是我的应用程序MainFrame.java

public class MainFrame extends Application {

    ...

    @Override
    public void start(Stage primarystage) {        
        ...
        try {
            System.out.println("Inside try");
            DataService dataservice = new DataService();
            System.out.println("Result set: "+dataservice.getRecords());
        } catch (Exception e) {
            //TODO: handle exception
        }
    }
}

我得到这个输出:

内试

在 getRecords() 里面

内部 Rs 循环

我看不到任何与记录相关的输出。我也查过了select * from emp。该表中已经有行。我在这里错过了一些非常重要的东西。请纠正我。

标签: javajdbc

解决方案


当您创建 DataService 实例DataService dataservice = new DataService();方法时 main() 不会被调用,因此变量conn不会被初始化并保持为空。之后在调用Statement stmt=con.createStatement();NullPointerException (NPE) 时抛出。这个 NPE 既没有在这个 catch 块中被捕获catch (SQLException ex),因为它只捕获 SQLExceptions,也没有在这个块中捕获catch (Exception e),因为没有提供处理逻辑。

使代码工作的第一步是在 MainFrame 类的 start() 方法中添加一些异常处理逻辑(永远不要留下空的 catch 块,它被认为是一种反模式)。

然后将连接初始化的逻辑移动到 getRecords() 方法使其成为局部变量或 DataService 构造函数,因此变量 conn 在访问时将被初始化。

下一个大问题是在完成工作后关闭 Connection、Statement 和 ResultSet 变量。从 java 7 开始,您可以使用try-with-resources语法来处理此类资源。

此外,我建议在 getRecords() 方法内部处理 ResultSet,而不将其暴露在 DataService 类之外。此类充当数据访问对象(DAO),最好将实现细节保留在内部。相反,您可以创建一些简单的 Employee 类,这些实例可以在while(rs.next())循环内初始化,填充结果集中的值并添加到某个集合中。该集合可以从 getRecords() 方法返回。


推荐阅读