package com.learnjava.sql; import com.learnjava.exception.StorageException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; public class SqlHelper { private final ConnectionFactory connectionFactory; public SqlHelper(ConnectionFactory connectionFactory) { this.connectionFactory = connectionFactory; } public void execute(String sql) { execute(sql, PreparedStatement::execute); } public T execute(String sql, SqlExecutor executor) { try (Connection conn = connectionFactory.getConnection(); PreparedStatement ps = conn.prepareStatement(sql)) { return executor.execute(ps); } catch (SQLException e) { throw ExceptionUtil.convertException(e); } } public T transactionalExecute(SqlTransaction executor) { try (Connection conn = connectionFactory.getConnection()) { try { conn.setAutoCommit(false); T res = executor.execute(conn); conn.commit(); return res; } catch (SQLException e) { conn.rollback(); throw ExceptionUtil.convertException(e); } } catch (SQLException e) { throw new StorageException(e); } } }