我正在使用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)。在此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()方法返回此集合。
您应该在使用连接线程的同时获取连接实例将连接创建移至getRecords方法