import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class OrderQuery {
// 数据库连接URL
private static final String URL = "jdbc:mysql://localhost:3306/yourdatabase";
// 数据库用户名
private static final String USER = "yourusername";
// 数据库密码
private static final String PASSWORD = "yourpassword";
public static void main(String[] args) {
// 特定客户ID
int specificCustomerId = 1;
// 开始日期
String startDate = "2023 - 01 - 01";
// 结束日期
String endDate = "2023 - 12 - 31";
String query = "SELECT o.order_id, o.customer_id, o.order_date, " +
"oi.order_item_id, oi.product_id, oi.quantity " +
"FROM orders o " +
"JOIN customers c ON o.customer_id = c.customer_id " +
"JOIN order_items oi ON o.order_id = oi.order_id " +
"WHERE c.customer_id =? AND o.order_date BETWEEN? AND?";
try (Connection connection = DriverManager.getConnection(URL, USER, PASSWORD);
PreparedStatement preparedStatement = connection.prepareStatement(query)) {
// 设置绑定变量
preparedStatement.setInt(1, specificCustomerId);
preparedStatement.setString(2, startDate);
preparedStatement.setString(3, endDate);
try (ResultSet resultSet = preparedStatement.executeQuery()) {
while (resultSet.next()) {
int orderId = resultSet.getInt("order_id");
int customerId = resultSet.getInt("customer_id");
String orderDate = resultSet.getString("order_date");
int orderItemId = resultSet.getInt("order_item_id");
int productId = resultSet.getInt("product_id");
int quantity = resultSet.getInt("quantity");
System.out.println("Order ID: " + orderId +
", Customer ID: " + customerId +
", Order Date: " + orderDate +
", Order Item ID: " + orderItemId +
", Product ID: " + productId +
", Quantity: " + quantity);
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
代码解释
- 数据库连接配置:定义了数据库连接的URL、用户名和密码,这里以MySQL为例,实际应用中需根据数据库类型调整URL格式。
- 主函数及参数设置:在
main
方法中设置了特定客户ID、开始日期和结束日期,这些参数可以根据实际需求动态传入。
- SQL查询语句:通过三表连接(
orders
、customers
、order_items
)查询特定客户在指定日期范围内的订单及订单项信息。使用?
作为占位符,后续通过PreparedStatement
设置具体值,这就是绑定变量的使用。
- JDBC操作:
- 获取连接:使用
DriverManager.getConnection
方法获取数据库连接。
- 预编译SQL:
connection.prepareStatement(query)
将SQL语句预编译,这样数据库可以对该语句进行优化并缓存执行计划,提高性能,尤其是在多次执行相同结构但不同参数的SQL语句时。
- 设置绑定变量:通过
preparedStatement.setInt
和preparedStatement.setString
方法为占位符设置具体值,避免了SQL注入风险。
- 执行查询并处理结果:
preparedStatement.executeQuery()
执行查询并返回ResultSet
,通过循环遍历结果集获取每一行数据,并打印输出。
- 异常处理:使用
try - catch
块捕获可能出现的SQLException
,并打印堆栈跟踪信息以便调试。