繁体   English   中英

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

[英]How to fetch records from Oracle databse using Java

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

创建 DataService 实例时DataService dataservice = new DataService(); 方法 main() 未被调用,因此变量conn未被初始化并保持为空。 之后调用Statement stmt=con.createStatement(); 抛出 NullPointerException (NPE)。 这个 NPE 在这个 catch 块catch (SQLException ex)没有被捕获,因为它只捕获 SQLExceptions 也没有在这个catch (Exception e)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() 方法返回。

您应该在同一线程中获取连接实例,因为您使用它将连接创建移动到 getRecords 方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM