如何在不删除先前结果的情况下更新结果集

时间:2019-11-18 06:32:53

标签: java mysql jdbc

我正在使用jdbc从数据库检索数据。我有四个不同的查询,但是,第一个查询的结果用于获取第二个和第四个查询的数据。但是,结果集在我运行其他查询时得到更新。因此,有什么方法可以保留结果集并在其中添加新结果。

这是我的代码:

class GetData{

     String toDate;
     String fromDate;


        GetData(String d1,String d2) throws ClassNotFoundException, SQLException, ParseException, TransformerException, ParserConfigurationException  {

            toDate=d1;
            fromDate=d2;
            Connection connection= null;
            ResultSet resultset= null;

            String customerquery="SELECT o.ordernumber,o.orderdate,o.customernumber,c.customername,c.addressLine1,c.postalCode,c.city,c.country from orders o join customers c  on o.customernumber=c.customernumber where orderdate between ? and ?";
            String orderdetailquery="SELECT orderNumber,productCode,quantityOrdered,priceEach,orderLineNumber,(quantityOrdered * priceEach) as total FROM orderdetails where ordernumber=?";
            String productsquery="SELECT productName,productLine,productVendor FROM products where productcode=?";
            String employeequery="SELECT c.salesRepEmployeeNumber,e.firstname,e.lastname,o.officecode,o.city from customers c join employees e on c.salesRepEmployeeNumber = e.employeeNumber join offices o on e.officecode=o.officecode where c.customernumber=?";

            Class.forName("com.mysql.cj.jdbc.Driver");
            connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/classicmodels","root","root");

            if(d1!=null || d2!=null) {

                PreparedStatement p1= connection.prepareStatement(customerquery);
                p1.setString(1, toDate);
                p1.setString(2,fromDate);
                resultset= p1.executeQuery();

                PreparedStatement p2= connection.prepareStatement(orderdetailquery);
                while(resultset.next()) {
                    p2.setString(1, resultset.getString("orderNumber"));
                }

                resultset=p2.executeQuery();

                PreparedStatement p3= connection.prepareStatement(productsquery);

                while (resultset.next()) {
                    p3.setString(1, resultset.getString("productcode"));
                }

                resultset=p3.executeQuery();

                PreparedStatement p4=connection.prepareStatement(employeequery);
                while(resultset.next()) {
                p4.setString(1, resultset.getString("customernumber"));
                }
                resultset=p4.executeQuery();

                resultset.close();
                connection.close();   
            }
        }

我正在尝试使用包含列customernumber列的第一个查询的结果来获取数据。同时,执行代码时出现错误,即未找到customernumber列。因此,如何在其他查询中使用第一个查询的结果。另外,我试图在一个结果集中获取所有查询结果,因为我试图通过使用DOM在其中创建xml。

4 个答案:

答案 0 :(得分:0)

ResultSet正在更改,因为每次执行sql语句时都使用相同的引用(对象),因此它会覆盖旧结果,因此,如果要处理以前返回的ResultSet,则可以创建新的ResultSet实例,也可以创建一个Bean类来设置元素并将其设置为List类型,以继续根据您的逻辑添加结果。

答案 1 :(得分:0)

创建一个POJO来存储从不同查询中检索到的必需属性。 由于使用相同的参考变量来分配后续查询的结果集,因此结果集正在更新。 如果要使用相同的变量,则可以按照以下步骤操作-

  1. 创建一个POJO(可用于通过使用DOM在其中创建xml)。
  2. 在结果集中获取第一个查询的结果。
  3. 从此结果集中填充POJO的相关属性。
  4. 重新使用结果集存储下一个查询的结果。

当您需要使用以前的结果时,请从POJO中获取它们,以用作后续查询中的参数。

答案 2 :(得分:0)

您可以将所有内容放在一个query中。使用joins

select o.ordernumber,o.orderdate
    , o.customernumber,c.customername
    , c.addressLine1,c.postalCode,c.city,c.country 
    , t1.productCode, t1.quantityOrdered, t1.priceEach, t1.orderLineNumber,(t1.quantityOrdered * t1.        priceEach) as total 
    , t2.productName, t2.productLine, t2.productVendor
    , c.salesRepEmployeeNumber,t4.firstname,t4.lastname,t3.officecode,t3.city
from orders o 
join customers c  on o.customernumber=c.customernumber 
left join orderdetails t1 on t1.orderNumber = o.orderNumber
left join products t2 on t2.productCode = t1.productCode
left join offices t3 on t3.offiecode = c.customernumber
left join employees t4 on t3.officecode = t4.officecode

答案 3 :(得分:-1)

使用beforeFirst()或isAfterLast()来移动光标,它会为您工作。ResultSet接口的isBeforeFirst()isAfterLast()方法用于确定光标是否位于ResultSet的默认位置

class GetData
{

    String toDate;
    String fromDate;


    GetData(String d1 , String d2) throws ClassNotFoundException, SQLException, ParseException, TransformerException, ParserConfigurationException
    {

        toDate = d1;
        fromDate = d2;
        Connection connection = null;
        ResultSet resultset = null;

        String customerquery = "SELECT o.ordernumber,o.orderdate,o.customernumber,c.customername,c.addressLine1,c.postalCode,c.city,c.country from orders o join customers c  on o.customernumber=c.customernumber where orderdate between ? and ?";
        String orderdetailquery = "SELECT orderNumber,productCode,quantityOrdered,priceEach,orderLineNumber,(quantityOrdered * priceEach) as total FROM orderdetails where ordernumber=?";
        String productsquery = "SELECT productName,productLine,productVendor FROM products where productcode=?";
        String employeequery = "SELECT c.salesRepEmployeeNumber,e.firstname,e.lastname,o.officecode,o.city from customers c join employees e on c.salesRepEmployeeNumber = e.employeeNumber join offices o on e.officecode=o.officecode where c.customernumber=?";

        Class.forName ("com.mysql.cj.jdbc.Driver");
        connection = DriverManager.getConnection ("jdbc:mysql://localhost:3306/classicmodels" , "root" , "root");

        if (d1 != null || d2 != null)
        {

            PreparedStatement p1 = connection.prepareStatement (customerquery);
            p1.setString (1 , toDate);
            p1.setString (2 , fromDate);
            resultset = p1.executeQuery ();

            PreparedStatement p2 = connection.prepareStatement (orderdetailquery);
            while (resultset.next ())
            {
                p2.setString (1 , resultset.getString ("orderNumber"));
            }
            resultset.isAfterLast ();
            resultset = p2.executeQuery ();

            PreparedStatement p3 = connection.prepareStatement (productsquery);

            while (resultset.next ())
            {
                p3.setString (1 , resultset.getString ("productcode"));
            }
            resultset.isAfterLast ();
            resultset = p3.executeQuery ();

            PreparedStatement p4 = connection.prepareStatement (employeequery);
            while (resultset.next ())
            {
                p4.setString (1 , resultset.getString ("customernumber"));
            }
            resultset = p4.executeQuery ();

            resultset.close ();
            connection.close ();
        }
    }  
相关问题