dbUtils SQL执行器和增删改

dbUtils SQL执行器和增删改

SqlExecutor封装ConnectionPreparedStatementResultSet接口的底层操作,简化JDBC的使用

/**
 *
 * SQL执行器,用于执行sql语句,以及处理查询结果
 * 这个是核心类,封装Connection、PreparedStatement、ResultSet接口的底层操作,简化JDBC的使用
 *
 */
public class SqlExecutor {

    /**
     * 连接对象,从外部传入,不需要自己生成
     */
    private Connection connection;

    /**
     * 构造方法传入连接对象
     * @param connection 连接对象
     */
    public SqlExecutor(Connection connection) {
        this.connection = connection;
    }

    /**
     * 执行增删改的方法
     * @param sql 执行的sql语句
     * @param params 可变参数(数组),sql语句中需要设置的参数
     *               (也是就是sql中的"?")
     * @return
     */
    public int executeUpdate(String sql, Object...params) {
        if(connection == null) {
            throw new RuntimeException("Null connection.");
        }
        if(sql == null) {
            throw new RuntimeException("Null SQL statement");
        }
        //通过connection对象得到一个PreparedStatement对象用于发送sql语句
        PreparedStatement ps = null;
        try {
            //创建PreparedStatement并预编译发送sql
            ps = connection.prepareStatement(sql);
            //设置参数
            setParameters(ps, params);
            //执行execute方法返回影响的行数
            return ps.executeUpdate();
        } catch (SQLException e) {
            //将捕获的sql异常抛出去给调用者
            throw new RuntimeException("Execute sql error." + e);
        } finally {
            //关闭Statement
            close(ps);
            //关闭连接
            close();
        }
    }

    /**
     * 给sql语句设置参数
     * @param ps
     * @param params
     */
    private void setParameters(PreparedStatement ps, Object[] params) throws SQLException {
        int count = 1;
        for (Object object : objects) {
            //通过setObject方法来设置参数,注意:jdbc的参数是从1开始
            preparedStatement.setObject(count, object);
            count++;
        }
    }

    /**
     * 关闭Statement
     * @param st
     */
    private void close(Statement st) {
        if(st != null) {
            try {
                st.close();
            } catch (SQLException e) {
                throw new RuntimeException("Close statement fail.", e);
            }
        }
    }

    /**
     * 关闭连接对象
     */
    private void close() {
        if(connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                throw new RuntimeException("Close connection fail.", e);
            }
        }
    }
}