utils:一个通用的JDBC工具类(Hive)-含将ResultSet变换为List>

前几日使用jdbc连接hive时,由于特殊的使用需求,感觉resultset对接下来的数据解析不是很方便,于是将其转换成了一个自定义数据结构[{Score=80.0, UserName=张三, Subject=语文}, {Score=90.0, UserName=张三, Subject=数学}]
仅作记录使用,简单的jdbc连接器--使用构造器的形式


import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 本demo为hiveJDBC连接的另一种形式,以构造器的方式建立连接
 *
 * 功能:
 *      1、连接hive
 *      2、执行无返回值类SQL
 *      3、执行带返回结果集类SQL
 *      4、将resultSet转成list List<Map<String, Object>>
 *
 */
public class HiveJDBCUtils {
    private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";
    private String url = "";
    private String user = "";
    private String pwd = "";
    private Connection con;
    private Statement stmt;

    HiveJDBCUtils(String url) {
        this.url = url;
    }
    //为测试改为public,后续改回
    public HiveJDBCUtils(String url, String user, String pwd) {
        this.url = url;
        this.user = user;
        this.pwd = pwd;
        //该步即已创建连接
        this.conn();
    }

    private void conn () {
        try {
            Class.forName(driverName);
            con = DriverManager.getConnection(url, user, pwd);
            stmt = con.createStatement();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e){
            e.printStackTrace();
        }
    }

    /**
     * 执行无返回值类SQL
     * @param sql
     * @throws SQLException
     */
    public void executeSql (String sql) throws SQLException {
        try {
            stmt.execute(sql);
        } catch (SQLException e){
            e.printStackTrace();
        }

    }

    /**
     * 执行带返回结果集类SQL
     * @param sql
     * @return
     * @throws SQLException
     */
    public ResultSet executeQuerySql (String sql) throws SQLException {
        ResultSet res = null;
        try {
            res = stmt.executeQuery(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return res;
    }

    /**
     * 按需定制,可有可无,随意,为了更方便处理,也可不用
     * 将resultSet转成list List<Map<String, Object>>
     *
     * 如不用此方法转换,则提取数据直接使用ResultSet.getInt,getString...即可
     * 问题是会存在前端不好显示的问题,因为SQL是多样化的,列名也是多样化的,不方便为前端传过去
     * [{Score=80.0, UserName=张三, Subject=语文}, {Score=90.0, UserName=张三, Subject=数学}]
     * @param rs
     * @return
     * @throws SQLException
     */
    public  List<Map<String, Object>> resultSetToListMap(ResultSet rs) throws SQLException {
        if(rs == null) return null;
        List<Map<String, Object>> result = new ArrayList<Map<String,Object>>();

        //获取结果集结构信息,字段类型、数量
        ResultSetMetaData rsmd = null;
        int cols = 0;
        try {
            rsmd = rs.getMetaData();
            cols = rsmd.getColumnCount();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        Map<String, Object> map = new HashMap<String, Object>();
        while(rs.next()) {
            map = new HashMap<String, Object>();
            //将一条数据库表记录转为map存储
            for (int i = 1; i <= cols; i++) {
                map.put(rsmd.getColumnName(i), rs.getObject(i));
            }
            result.add(map);
        }
        return result;
    }
}

utils:一个通用的JDBC工具类(Hive)-含将ResultSet变换为List<Map<clumnName:value>>

上一篇:推荐评估指标python版本precision/recall/ndcg/map/mrr


下一篇:Mysql group by 实现排序