java - 如何使用 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
。该表中已经有行。我在这里错过了一些非常重要的东西。请纠正我。
解决方案
当您创建 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() 方法返回。
推荐阅读
- php - 根据订单 ID WooCommerce 将订阅状态更改为活动
- laravel - 在 Laravel 中查询表并将结果分组到范围中
- javascript - 如何在一次单击时播放两个单独的动画?
- python - Windows:使用 Python (3.6.0+) 支持编译的 Vim
- signalr - 尝试建立组连接时 Azure SignalR InvokeAsync 挂起
- amazon-web-services - 通过从 S3 读取电子邮件地址发送电子邮件
- python - 在 django 多租户中显示主页
- r - Shiny:错误:尝试渲染第二个依赖图时,quartz() 设备大小无效
- python - 在 SciPy 的内置求解器 gmres 和 bicg 中,info 代表什么?
- angular - 如何将行添加到动态材料表的角度与行数组