Java Swing中如何将ClassA的方法传入ClassB并自定义SQL查询
解决方案
首先,你需要重构ClassA的add()方法,让它能够接收外部传入的查询语句,这样ClassB就能在调用时传入自定义的SQL了。同时我也会帮你修复代码里的资源泄漏问题——原来的代码没有关闭数据库连接、Statement和ResultSet,这会导致严重的资源浪费。
第一步:重构ClassA的add方法
修改add()方法,添加一个String类型的参数来接收查询语句,并且使用try-with-resources自动管理数据库资源(Java 7+支持),这样就不用手动关闭资源了:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class ClassA { private Connection conn; public void add(String query) { // 添加query参数,接收外部传入的SQL // 使用try-with-resources自动关闭stmt和rs,无需手动调用close() try (Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(query)) { Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); String url = "jdbc:oracle:thin:@localhost:1521:XE"; conn = DriverManager.getConnection(url, "Hr", "Hr"); System.out.println("Connection Established"); // 这里可以根据需求处理ResultSet结果,比如遍历输出 while (rs.next()) { // 示例:获取指定列的值 // System.out.println(rs.getString("column_name")); } } catch (Exception e) { System.err.println("connection error " + e); } finally { // 手动关闭Connection,避免连接泄漏 try { if (conn != null && !conn.isClosed()) { conn.close(); System.out.println("Connection Closed"); } } catch (Exception e) { System.err.println("Failed to close connection: " + e); } } } }
第二步:在ClassB中调用ClassA的add方法
现在ClassA的add()方法支持传入自定义查询了,你只需要在ClassB中实例化ClassA,然后调用add()并传入你的查询语句即可:
public class ClassB { public static void main(String[] args) { ClassA classA = new ClassA(); // 传入你自定义的查询语句,这里以查询员工表为例 String customQuery = "SELECT employee_id, first_name FROM employees"; classA.add(customQuery); } }
额外建议
- 资源管理:try-with-resources是Java操作数据库的最佳实践,它会在代码块结束后自动关闭实现
AutoCloseable接口的资源,彻底避免资源泄漏。 - 连接复用:如果你的应用需要频繁操作数据库,建议使用数据库连接池(比如HikariCP)来管理连接,而不是每次调用都创建新连接,能大幅提升性能。
- SQL注入防护:如果查询语句包含用户输入的参数,不要直接拼接字符串,应该使用
PreparedStatement代替Statement,比如:String query = "SELECT * FROM employees WHERE department_id = ?"; try (PreparedStatement pstmt = conn.prepareStatement(query)) { pstmt.setInt(1, 10); // 安全设置参数 ResultSet rs = pstmt.executeQuery(); // 处理结果 }
内容的提问来源于stack exchange,提问作者Shaun Tait
相关产品推荐
相关产品推荐

