JDBC

Java常用方法   2025-01-12 06:56   152   0  


JDBC 依赖包

mysql-connector-java-5.1.49.jar

mysql-connector-java-8.0.30.jar

一、获取 Connection

/**
 * 获取数据库连接
 * @return Connection
 */
public static Connection getDataSource(String dburl, String username, String password) {
    Connection conn = null;
    try {
        // mysql-connector-java 5 使用的是 com.mysql.jdbc.Driver
        //Class.forName("com.mysql.jdbc.Driver");
        // 在mysql-connector-java 5以后的版本中(不包括5) 使用的都是com.mysql.cj.jdbc.Driver
        Class.forName("com.mysql.cj.jdbc.Driver");
        conn = DriverManager.getConnection(dburl, username, password);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return conn;
}


二、JDBC 根据 SQL 查询结果返回带有顺序的 ArrayList<LinkedHashMap<String, String>>

/**
 * 根据sql获取结果
 * 
 * @param connection 数据库连接
 * @param sql sql语句
 * @return 查询结果
 */
public static ArrayList<LinkedHashMap<String, String>> getSelectSqlResult(Connection connection, String sql) {
    ArrayList<LinkedHashMap<String, String>> result = new ArrayList<>();
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    List<String> field = new ArrayList<>();
    try {
        pstmt = connection.prepareStatement(sql);
        rs = pstmt.executeQuery();
        ResultSetMetaData resultSetMetaData = rs.getMetaData();
        // 获取SQL查询结果的列名,下标从1开始
        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
            field.add(resultSetMetaData.getColumnLabel(i));
        }
        while (rs.next()) {
            LinkedHashMap<String, String> data = new LinkedHashMap<>();
            for (String f : field) {
                data.put(f, rs.getString(f));
            }
            result.add(data);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        try {
            if (null != rs) {
                rs.close();
            }
            if (null != pstmt) {
                pstmt.close();
            }
        } catch (Exception e2) {
            // TODO: handle exception
            e2.printStackTrace();
        }
    }
    return result;
}

三、JDBC 根据 SQL 查询结果返回带有顺序的 JSONArray(fastjson)

/**
 * 获取JSONArray
 * 
 * @param connection 数据库连接
 * @param sql sql语句
 * @return JSONArray
 */
public static JSONArray getSelectSqlResult(Connection connection, String sql) {
    // 数据列表
    JSONArray resultArray = new JSONArray();
    // 获取列名列表
    List<String> fieldList = new ArrayList<>();

    PreparedStatement pstmt = null;
    ResultSet result = null;

    try {
        pstmt = connection.prepareStatement(sql);
        result = pstmt.executeQuery();
        // 获取结果集resultSet的结果集元数据metaData
        ResultSetMetaData resultSetMetaData = result.getMetaData();
        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
            // 获取用于打印输出和显示的指定列的建议标题
            String columnLabel = resultSetMetaData.getColumnLabel(i);
            fieldList.add(columnLabel);
        }
        // ----------------获取sql查询结果-------------------------------------------
        while (result.next()) {
            LinkedHashMap<String, Object> map = new LinkedHashMap<String, Object>();
            for (String string : fieldList) {
                map.put(string, result.getString(string));
            }
            JSONObject jsonObject = new JSONObject(true);
            jsonObject.putAll(map);
            resultArray.add(jsonObject);
        }
    } catch (Exception e) {
        // TODO: handle exception
    } finally {
        try {
            if (null != result) {
                result.close();
            }
            if (null != pstmt) {
                pstmt.close();
            }
        } catch (Exception e2) {
            // TODO: handle exception
            e2.printStackTrace();
        }
    }
    return resultArray;
}

四、delete/insert/update

/**
 * delete/insert/update
 * 
 * @param con            数据库连接
 * @param update_sql    SQL语句
 * @return 更新记录条数
 */
public static int updateSql(Connection con, String update_sql) {

    int row = 0;
    PreparedStatement pstmt = null;
    try {
        con.setAutoCommit(false);
        pstmt = con.prepareStatement(update_sql);
        row = pstmt.executeUpdate();
        con.commit();
    } catch (SQLException e) {
        // TODO: handle exception
        //sql执行出现异常后回滚
        try {
            con.rollback();
            con.setAutoCommit(true);
        } catch (SQLException e1) {
            // TODO 自动生成的 catch 块
            e1.printStackTrace();
        }
        e.printStackTrace();
    } finally {
        try {
            con.setAutoCommit(true);
            if (null != pstmt) {
                pstmt.close();
            }
        } catch (SQLException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
    }

    return row;
}

五、执行 SQL,自动判断是更新还是查询 SQL

/**
 * 执行sql,自动判断是更新还是查询SQL
 * 
 * @param con 数据库连接
 * @param sql SQL语句
 * @return 返回结果map。map字段解析:status----true/false,sql是否执行成功。type-----select/update,sql执行结果类型,select为查询sql,update为更新sql。row----更新数据行数。data----sql查询结果,ArrayList<LinkedHashMap<String, String>>
 */
public static Map<String, Object> execSql(Connection con, String sql) {
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    Map<String, Object> resultMap = new HashMap<>();
    try {
        int updateCount = 0;
        con.setAutoCommit(false);
        pstmt = con.prepareStatement(sql);
        // true表示有resultset,false表示有更新数据条数或者没有resultset
        boolean currentExec = pstmt.execute();
        while (true) {
            if (currentExec) {
                rs = null;
                rs = pstmt.getResultSet();
                ArrayList<LinkedHashMap<String, String>> dataList = getDataResultByResultSet(rs);
                resultMap.put("type", "select");
                resultMap.put("data", dataList);
            } else {
                updateCount = pstmt.getUpdateCount();
                if (updateCount == -1) {
                    // 没有更多结果了
                    break;
                } else {
                    resultMap.put("type", "update");
                    resultMap.put("row", updateCount);
                }
            }
            currentExec = pstmt.getMoreResults();
        }
        con.commit();
        resultMap.put("status", true);
    } catch (Exception e) {
        resultMap.put("status", false);
        //sql执行出现异常后回滚
        try {
            con.rollback();
            con.setAutoCommit(true);
        } catch (SQLException e1) {
            // TODO 自动生成的 catch 块
            e1.printStackTrace();
        }
        e.printStackTrace();
    } finally {
        try {
            con.setAutoCommit(true);
            if (null != rs) {
                rs.close();
            }
            if (null != pstmt) {
                pstmt.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    return resultMap;
}

/**
 * 根据sql获取结果
 * 
 * @param rs ResultSet
 * @return 查询结果
 */
public static ArrayList<LinkedHashMap<String, String>> getDataResultByResultSet(ResultSet rs) {
    ArrayList<LinkedHashMap<String, String>> result = new ArrayList<>();
    List<String> field = new ArrayList<>();
    try {
        ResultSetMetaData resultSetMetaData = rs.getMetaData();
        // 获取SQL查询结果的列名,下标从1开始
        for (int i = 1; i <= resultSetMetaData.getColumnCount(); i++) {
            field.add(resultSetMetaData.getColumnLabel(i));
        }
        while (rs.next()) {
            LinkedHashMap<String, String> data = new LinkedHashMap<>();
            for (String f : field) {
                data.put(f, rs.getString(f));
            }
            result.add(data);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return result;
}

六、批处理 SQL 语句

//如果有 BATCH_COUNT 条记录时,则执行批量一次
private static final Integer BATCH_COUNT = 100;

/**
 * JDBC 批处理 SQL 语句
 * @param connection 数据库连接
 * @param sqlList SQL列表
 */
public static void updateBatch(Connection connection, List<String> sqlList) {
    Statement statement = null;
    try {
        connection.setAutoCommit(false);
        statement = connection.createStatement();
        long begin = System.currentTimeMillis();
        int index = 0, count = 0;
        for (String sql : sqlList) {
            index++;
            statement.addBatch(sql);
            //如果有 BATCH_COUNT 条记录时,则执行批量一次
            if (index % BATCH_COUNT == 0) {
                count++;
                log.info("每 {} 条批量执行一次", BATCH_COUNT);
                //批量执行
                int[] row = statement.executeBatch();
                connection.commit();
                //一把清空
                statement.clearBatch();
            }
        }
        // 总条数不是批量数值的整数倍需要再额外的执行一次
        if (sqlList.size() % BATCH_COUNT != 0) {
            log.info("剩余未执行 {} 条批量执行一次", sqlList.size() - count * BATCH_COUNT);
            //批量执行
            int[] row = statement.executeBatch();
            connection.commit();
            //一把清空
            statement.clearBatch();
        }
        long end = System.currentTimeMillis();
        log.info("批处理 SQL 语句执行耗时: {} ms", (end - begin));
    } catch (Exception e) {
        //sql执行出现异常后回滚
        try {
            connection.rollback();
            connection.setAutoCommit(true);
        } catch (SQLException e1) {
            // TODO 自动生成的 catch 块
            e1.printStackTrace();
        }
        e.printStackTrace();
    } finally {
        try {
            connection.setAutoCommit(true);
            if (null != statement) {
                statement.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


博客评论
还没有人评论,赶紧抢个沙发~
发表评论
说明:请文明发言,共建和谐网络,您的个人信息不会被公开显示。