如何封装JDBC连接MySQL的try-catch代码块以复用,仅编写自定义逻辑?
JDBC重复try-catch代码块的通用封装方案
当然可以封装,利用Java的函数式接口就能把重复的try-with-resources和异常处理逻辑抽出来,只需要传入自定义业务代码即可,具体实现如下:
1. 定义函数式接口
因为JDBC操作会抛出SQLException(受检异常),而Java内置的Consumer等函数式接口不支持抛出受检异常,所以需要自定义一个接口来承载业务逻辑:
@FunctionalInterface public interface JdbcOperation { void execute(Connection conn, Statement stmt, ResultSet rs) throws SQLException; }
2. 封装通用执行方法
把重复的连接创建、语句执行、资源关闭和异常处理逻辑抽成通用方法,参数包含数据库连接信息、查询语句,以及上面定义的业务逻辑接口实例:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JdbcUtils { public static void executeJdbc(String dbURL, String dbUser, String dbPassword, String query, JdbcOperation operation) { try(Connection conn = DriverManager.getConnection(dbURL, dbUser, dbPassword); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(query); ) { // 执行自定义业务逻辑 operation.execute(conn, stmt, rs); } catch (SQLException e) { e.printStackTrace(); } } }
3. 调用通用方法
使用时只需要传入业务逻辑即可,用Lambda表达式简化代码:
// 示例:查询用户表并打印用户名 JdbcUtils.executeJdbc( "jdbc:mysql://localhost:3306/test", "root", "your_password", "SELECT username FROM users", (conn, stmt, rs) -> { while (rs.next()) { System.out.println("用户名:" + rs.getString("username")); } } );
如果你的业务逻辑不需要用到Connection或Statement,直接在Lambda里忽略这些参数就行,不影响使用。
内容的提问来源于stack exchange,提问作者Michel
相关产品推荐
相关产品推荐

