mysql、oracle的JDBC操作

java 复制代码
package com.catarc.paramanalysis.util;

import org.apache.commons.dbcp2.BasicDataSource;

import java.sql.*;
import java.util.*;
import javax.sql.DataSource;

/**
 * MySQL JDBC 工具类
 * 功能:连接管理、CRUD操作、事务控制、连接池
 */
public class MySQLUtils {
    // 连接池数据源
    private static DataSource dataSource;

    // 初始化连接池
    static {
        try {
            BasicDataSource ds = new BasicDataSource();
            ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
            ds.setUrl("jdbc:mysql://888.88.888.888:4417/param_analysis?useSSL=false&serverTimezone=UTC");
            ds.setUsername("888");
            ds.setPassword("888888");
            ds.setInitialSize(5);      // 初始连接数
            ds.setMaxTotal(20);        // 最大连接数
            ds.setMaxIdle(10);         // 最大空闲连接
            ds.setMinIdle(5);          // 最小空闲连接
            ds.setMaxWaitMillis(5000); // 获取连接最大等待时间(毫秒)
            dataSource = ds;
        } catch (Exception e) {
            throw new ExceptionInInitializerError("初始化连接池失败: " + e.getMessage());
        }
    }

    /**
     * 获取数据库连接
     */
    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }

    /**
     * 释放资源
     */
    public static void close(Connection conn, Statement stmt, ResultSet rs) {
        try {
            if (rs != null) rs.close();
            if (stmt != null) stmt.close();
            if (conn != null) conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 执行查询(返回List<Map>)
     */
    public static List<Map<String, Object>> queryForList(String sql, Object... params) {
        List<Map<String, Object>> list = new ArrayList<>();
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try {
            conn = getConnection();
            pstmt = conn.prepareStatement(sql);

            // 设置参数
            for (int i = 0; i < params.length; i++) {
                pstmt.setObject(i + 1, params[i]);
            }

            rs = pstmt.executeQuery();
            ResultSetMetaData metaData = rs.getMetaData();
            int columnCount = metaData.getColumnCount();

            while (rs.next()) {
                Map<String, Object> row = new LinkedHashMap<>();
                for (int i = 1; i <= columnCount; i++) {
                    row.put(metaData.getColumnLabel(i), rs.getObject(i));
                }
                list.add(row);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close(conn, pstmt, rs);
        }
        return list;
    }

    /**
     * 执行查询(返回单个Map)
     */
    public static Map<String, Object> queryForMap(String sql, Object... params) {
        List<Map<String, Object>> list = queryForList(sql, params);
        return list.isEmpty() ? null : list.get(0);
    }

    /**
     * 执行更新(INSERT/UPDATE/DELETE)
     */
    public static int update(String sql, Object... params) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        int result = 0;

        try {
            conn = getConnection();
            pstmt = conn.prepareStatement(sql);

            for (int i = 0; i < params.length; i++) {
                pstmt.setObject(i + 1, params[i]);
            }

            result = pstmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close(conn, pstmt, null);
        }
        return result;
    }

    /**
     * 批量更新
     */
    public static int[] batchUpdate(String sql, List<Object[]> paramsList) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        int[] result = null;

        try {
            conn = getConnection();
            pstmt = conn.prepareStatement(sql);

            for (Object[] params : paramsList) {
                for (int i = 0; i < params.length; i++) {
                    pstmt.setObject(i + 1, params[i]);
                }
                pstmt.addBatch();
            }

            result = pstmt.executeBatch();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close(conn, pstmt, null);
        }
        return result;
    }

    /**
     * 执行事务
     */
    public static boolean executeTransaction(TransactionCallback callback) {
        Connection conn = null;
        boolean result = false;

        try {
            conn = getConnection();
            conn.setAutoCommit(false);

            // 执行回调
            result = callback.doInTransaction(conn);

            if (result) {
                conn.commit();
            } else {
                conn.rollback();
            }
        } catch (SQLException e) {
            try {
                if (conn != null) conn.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            e.printStackTrace();
        } finally {
            try {
                if (conn != null) conn.setAutoCommit(true);
            } catch (SQLException e) {
                e.printStackTrace();
            }
            close(conn, null, null);
        }
        return result;
    }

    /**
     * 事务回调接口
     */
    public interface TransactionCallback {
        boolean doInTransaction(Connection conn) throws SQLException;
    }
}

这样用

List<Map<String, Object>> batch = MySQLUtils.queryForList(sql, currentId,endId, batchSize);

java 复制代码
package com.catarc.paramanalysis.util;

import org.apache.commons.dbcp2.BasicDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;
import java.sql.*;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * Oracle JDBC 工具类
 * 功能:连接管理、CRUD操作、事务控制、连接池
 */
@Component
public class OracleUtils implements ApplicationListener<ContextRefreshedEvent> {
    // 连接池数据源(静态字段,全局唯一)
    private static DataSource dataSource;

    // 配置参数(实例字段,通过@Value注入)
    @Value("${oracle.driverClassName}")
    private String driverClassName;
    @Value("${oracle.url}")
    private String url;
    @Value("${oracle.username}")
    private String username;
    @Value("${oracle.password}")
    private String password;
    @Value("${oracle.defaultSchema:}")
    private String defaultSchema;

    // 监听Spring上下文初始化完成事件
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        // 确保只初始化一次(避免父子容器重复触发)
        if (dataSource == null) {
            try {
                BasicDataSource ds = new BasicDataSource();
                ds.setDriverClassName(driverClassName);
                ds.setUrl(url);
                ds.setUsername(username);
                ds.setPassword(password);

                // 连接池配置
                ds.setInitialSize(5);
                ds.setMaxTotal(20);
                ds.setMaxIdle(10);
                ds.setMinIdle(5);
                ds.setMaxWaitMillis(5000);

                // 设置默认Schema(非必需)
                if (defaultSchema != null && !defaultSchema.isEmpty()) {
                    ds.setDefaultSchema(defaultSchema);
                }

                // 验证连接有效性
                ds.setTestOnBorrow(true);
                ds.setValidationQuery("SELECT 1 FROM DUAL");

                dataSource = ds;
                System.out.println("Oracle连接池初始化成功");
            } catch (Exception e) {
                throw new RuntimeException("初始化Oracle连接池失败: " + e.getMessage(), e);
            }
        }
    }

    /**
     * 获取数据库连接(直接访问静态dataSource)
     */
    public static Connection getConnection() throws SQLException {
        if (dataSource == null) { // 检查数据源是否已初始化
            throw new SQLException("Oracle连接池未初始化,请检查Spring配置或上下文是否加载完成");
        }
        return dataSource.getConnection();
    }

    /**
     * 释放资源
     */
    public static void close(Connection conn, Statement stmt, ResultSet rs) {
        try {
            if (rs != null) rs.close();
            if (stmt != null) stmt.close();
            if (conn != null) conn.close(); // 连接池环境下实际是归还连接
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 执行查询(返回List<Map>)
     */
    public static List<Map<String, Object>> queryForList(String sql, Object... params) {
        List<Map<String, Object>> list = new ArrayList<>();
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try {
            conn = getConnection();
            pstmt = conn.prepareStatement(sql);

            // 设置参数(Oracle参数索引从1开始)
            for (int i = 0; i < params.length; i++) {
                pstmt.setObject(i + 1, params[i]);
            }

            rs = pstmt.executeQuery();
            ResultSetMetaData metaData = rs.getMetaData();
            int columnCount = metaData.getColumnCount();

            while (rs.next()) {
                Map<String, Object> row = new LinkedHashMap<>();
                for (int i = 1; i <= columnCount; i++) {
                    row.put(metaData.getColumnLabel(i), rs.getObject(i));
                }
                list.add(row);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close(conn, pstmt, rs);
        }
        return list;
    }

    /**
     * 执行查询(返回单个Map)
     */
    public static Map<String, Object> queryForMap(String sql, Object... params) {
        List<Map<String, Object>> list = queryForList(sql, params);
        return list.isEmpty() ? null : list.get(0);
    }

    /**
     * 执行更新(INSERT/UPDATE/DELETE)
     */
    public static int update(String sql, Object... params) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        int result = 0;

        try {
            conn = getConnection();
            pstmt = conn.prepareStatement(sql);

            for (int i = 0; i < params.length; i++) {
                pstmt.setObject(i + 1, params[i]);
            }

            result = pstmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close(conn, pstmt, null);
        }
        return result;
    }

    /**
     * 批量更新
     */
    public static int[] batchUpdate(String sql, List<Object[]> paramsList) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        int[] result = null;

        try {
            conn = getConnection();
            pstmt = conn.prepareStatement(sql);

            for (Object[] params : paramsList) {
                for (int i = 0; i < params.length; i++) {
                    pstmt.setObject(i + 1, params[i]);
                }
                pstmt.addBatch();
            }

            result = pstmt.executeBatch();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            close(conn, pstmt, null);
        }
        return result;
    }

    /**
     * 执行事务
     */
    public static boolean executeTransaction(TransactionCallback callback) {
        Connection conn = null;
        boolean result = false;

        try {
            conn = getConnection();
            conn.setAutoCommit(false); // 关闭自动提交,开启事务

            result = callback.doInTransaction(conn);

            if (result) {
                conn.commit();
            } else {
                conn.rollback();
            }
        } catch (SQLException e) {
            try {
                if (conn != null) conn.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            e.printStackTrace();
        } finally {
            try {
                if (conn != null) {
                    conn.setAutoCommit(true);
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            close(conn, null, null);
        }
        return result;
    }

    /**
     * 事务回调接口
     */
    public interface TransactionCallback {
        boolean doInTransaction(Connection conn) throws SQLException;
    }
}

这样用

List<Map<String, Object>> maps = OracleUtils.queryForList("select * from job_zj_statisticalnumber where staticnumber = ?", after.getStaticNumber());

相关推荐
-Xie-5 小时前
Mysql杂志(三十四)——MVCC、日志分类
数据库·mysql
Tech有道5 小时前
字节真实面经:以Mysql为例,讲一下一条SQL的执行过程和原理!
数据库·后端
壹米饭5 小时前
QuestDB数据不能新增问题解决方案
数据库·后端
一个喜欢分享的PHP技术5 小时前
使用JdbcTemplate访问MySQL数据库
数据库
Thepatterraining5 小时前
MySQL灾难恢复实战指南:从日志分析到数据恢复,大厂经验全分享
数据库·mysql
*长铗归来*5 小时前
MySQL新学知识(二)MySQL存储过程
数据库·mysql
科兽的AI小记6 小时前
从Coze到BuildingAI:一个程序员对开源AI应用平台的实战体验
数据库·开源·创业
Boop_wu7 小时前
[MySQL] 数据库设计
java·数据库·oracle
xiaoye37087 小时前
达梦数据库连接配置yaml 文件配置
服务器·数据库·oracle