如何使用Java从Oracle数据库获取记录

问题描述 投票:0回答:2

我正在使用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。该表中已经有行。我在这里错过了一些非常重要的东西。请纠正我。

java jdbc
2个回答
0
投票

当创建DataService实例DataService dataservice = new DataService();时,不会调用main()方法,因此未初始化变量conn,并保持为空。之后,调用Statement stmt=con.createStatement();时会引发NullPointerException(NPE)。在此catch块catch (SQLException ex)中既未捕获此NPE,因为它仅捕获SQLException,也未捕获此NPE catch (Exception e),因为未提供任何处理逻辑。

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

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

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

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


0
投票

您应该在使用连接线程的同时获取连接实例将连接创建移至getRecords方法

© www.soinside.com 2019 - 2024. All rights reserved.