如何使用数组方法通过RMI从数据库的表中获取完整的数据?

Posted

技术标签:

【中文标题】如何使用数组方法通过RMI从数据库的表中获取完整的数据?【英文标题】:How to fetch complete data from the database's table through RMI using the array method? 【发布时间】:2022-01-02 13:28:34 【问题描述】:

我想通过 RMI 从数据库的表中获取完整的数据。我在 Java 接口中使用了数组方法,并在实现类中实现了该方法。我的意图是通过实现获取数组中的数据,并在客户端通过JTable 显示它。我在数据库中创建了一个单列表。我必须将整个数据从该表获取到客户端。

我附上了我所做的编码。 我已经在我得到的代码部分注释了错误。

界面

public interface Interface extends Remote 
     public static String[] getArray() throws Remote Exception; // Here it shows missing method 
                                                               //  body or declare abstract

实施

public class TheImplementation extends UnicastRemoteObject implements Interface
    
    public TheImplementation()throws Remote Exception
        super();
    
    
    private static final long serialVersionUID = -3763231206310559L;
    
    Connection con;
    PreparedStatement pst;
    ResultSet rst;

    public static String[] getArray() throws RemoteException
        String fruitdetails = null; 
        try 
            Connection connection=ConnectionProvider.getConnection();
            Statement st=connection.createStatement();
            ResultSet rs=st.executeQuery("select *from details");
            while(rs.next())  
                fruitdetails= rs.getString("fruit");
                String tbData[]=fruitdetails;
            
        
        catch (SQLException e) 
            JOptionPane.showMessageDialog(null, e);
        
        return tbData;// Here it shows error. Cannot find symbol.
                           // I tried to declare array at top. But, It didn't work.
    

【问题讨论】:

tbData 是在 while 循环中声明的,所以它的作用域只在 while 循环内。当你编译它时,你的 sql 会抛出一个错误。其他 Interface 不是 Java 对象的好名字。 con pstrst 已声明但从未使用过。为什么将getArray 作为static 方法,为什么还要麻烦接口它? 连接、语句和结果集永远不会关闭。 JOptionPane 用于服务器端显示错误消息。 参考Java doc for Scope of variables 【参考方案1】:

remote interfaces中的抽象方法不能是静态的,所以需要将接口定义改成如下。

public interface Interface extends java.rmi.Remote 
    public String[] getArray() throws RemoteException;

远程方法返回的值必须是serializable。 java中的数组是可序列化的,但是数组具有固定的大小,并且由于您正在返回数据库查询的结果,因此您无法知道大小。因此我建议getArray 方法返回一个ArrayList 或更好的CachedRowSet。

public interface Interface extends Remote 
    public CachedRowSet getArray() throws RemoteException;

由于类TheImplementation 是您的RMI 服务器类,因此最好使用log 异常而不是显示JOptionPane,并且您应该始终记录stack trace。请注意,远程方法必须声明它们抛出RemoteException,以便通知RMI 客户端远程方法失败。因此,除了记录异常之外,方法getArray 还可以抛出RemoteException

以下代码演示。

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.rowset.CachedRowSet;
import javax.sql.rowset.RowSetFactory;
import javax.sql.rowset.RowSetProvider;

public class TheImplementation extends UnicastRemoteObject implements Interface 

    public TheImplementation() throws RemoteException 
        super();
    

    private static final long serialVersionUID = -3763231206310559L;

    public CachedRowSet getArray() throws RemoteException 
        try (Connection con = ConnectionProvider.getConnection();
             Statement st = con.createStatement();
             ResultSet rs = st.executeQuery("select * from details")) 
            RowSetFactory factory = RowSetProvider.newFactory();
            CachedRowSet fruitDetails = factory.createCachedRowSet();
            fruitDetails.populate(rs);
            return fruitDetails;
        
        catch (SQLException e) 
            throw new RemoteException("Method 'getArray()' failed.", e);
        
    

请注意,上面的代码还使用了try-with-resources来确保ResultSetStatementConnection都是关闭的。

【讨论】:

以上是关于如何使用数组方法通过RMI从数据库的表中获取完整的数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何从存储在文件中的表中获取特定索引

如何从 SQL Server 中的表中获取不匹配的数据

如何从具有多个页面的表中获取表记录?

如何优化限制查询以便从庞大的表中更快地访问数据?

如何从laravel中间接连接的表中检索数据?

我想在我的表中获取多维数组