我正在使用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。
答案 0 :(得分:0)
ResultSet正在更改,因为每次执行sql语句时都使用相同的引用(对象),因此它会覆盖旧结果,因此,如果要处理以前返回的ResultSet,则可以创建新的ResultSet实例,也可以创建一个Bean类来设置元素并将其设置为List类型,以继续根据您的逻辑添加结果。
答案 1 :(得分:0)
创建一个POJO来存储从不同查询中检索到的必需属性。 由于使用相同的参考变量来分配后续查询的结果集,因此结果集正在更新。 如果要使用相同的变量,则可以按照以下步骤操作-
当您需要使用以前的结果时,请从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 ();
}
}