JDBC操作數據庫工具類(使用阿里Druid原生API創建數據源)


1.數據庫配置類

package com.zdlt.auth.api.common.druid;

import java.util.Properties;

import static com.alibaba.druid.pool.DruidDataSourceFactory.*;

/**
 * 數據庫配置類
 *
 * @author shiyanjun
 * @since 2019-12-15
 */
public class DbConfig {
    /**
     * 獲取數據庫配置
     *
     * @return 配置信息
     */
    public static Properties getDbConfig() {
        Properties properties = new Properties();
        properties.put(PROP_URL, "jdbc:mysql://localhost:3306/authapi");
        properties.put(PROP_USERNAME, "root");
        properties.put(PROP_PASSWORD, "123456");
        properties.put(PROP_INITIALSIZE, "5");
        properties.put(PROP_MINIDLE, "5");
        properties.put(PROP_MAXACTIVE, "10");
        properties.put(PROP_MAXWAIT, "10000");
        return properties;
    }
}

2.數據庫操作工具類

package com.zdlt.auth.api.common.druid;

import lombok.extern.slf4j.Slf4j;

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

/**
 * 數據庫操作工具類
 *
 * @author shiyanjun
 * @since 2019-12-15
 */
@Slf4j
public class DbUtil {
    /**
     * 獲取數據庫連接
     *
     * @param dataSource 數據源
     * @return 連接
     * @throws SQLException
     */
    public static Connection getConnection(DataSource dataSource) throws SQLException {
        return dataSource.getConnection();
    }

    /**
     * 獲取模型項實例數據源
     *
     * @return 數據源
     * @throws Exception
     */
    public static DataSource getDMInstanceDataSource() {
        return DMInstanceDb.INSTANCE.getDataSource();
    }

    /**
     * 執行查詢SQL語句
     *
     * @param dataSource 數據源
     * @param querySql   查詢SQL語句
     * @return 查詢結果
     */
    public static List<Map<String, Object>> executeQuery(DataSource dataSource, String querySql) {
        if (dataSource == null) {
            throw new RuntimeException("DataSource not be null!");
        }
        if (querySql == null || querySql.trim().length() == 0) {
            throw new RuntimeException("Query SQL not be empty!");
        }
        List<Map<String, Object>> resultList = new ArrayList<>();
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        try {
            connection = DbUtil.getConnection(dataSource);
            statement = connection.createStatement();
            resultSet = statement.executeQuery(querySql);
            ResultSetMetaData metaData = resultSet.getMetaData();
            resultList = getResultMap(resultSet, metaData);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DbUtil.closeResource(resultSet, statement, connection);
        }
        return resultList;
    }

    /**
     * 解析結果集
     *
     * @param rs 結果集
     * @param md 結果集元數據
     * @return 表數據
     * @throws SQLException
     */
    private static List<Map<String, Object>> getResultMap(ResultSet rs, ResultSetMetaData md) throws SQLException {
        List<Map<String, Object>> resultList = new ArrayList<>();
        int columnCount = md.getColumnCount();
        while (rs.next()) {
            Map<String, Object> resultMap = new LinkedHashMap<>();
            for (int i = 1; i <= columnCount; i++) {
                String columnName = md.getColumnLabel(i);
                Object columnVal = getType(rs, md, columnName, i);
                resultMap.put(columnName, columnVal);
            }
            resultList.add(resultMap);
        }
        return resultList;
    }

    /**
     * 根據字段名稱和字段類型獲取字段的值
     *
     * @param rs         結果集
     * @param md         結果集元數據
     * @param columnName 字段名稱
     * @param index      字段序號
     * @return 字段的值
     * @throws SQLException
     */
    private static Object getType(ResultSet rs, ResultSetMetaData md,
                                  String columnName, int index) throws SQLException {
        int columnType = md.getColumnType(index);
        switch (columnType) {
            case Types.ARRAY:
                return rs.getArray(columnName);
            case Types.BIGINT:
                return rs.getInt(columnName);
            case Types.BOOLEAN:
                return rs.getBoolean(columnName);
            case Types.BLOB:
                return rs.getBlob(columnName);
            case Types.DOUBLE:
                return rs.getDouble(columnName);
            case Types.FLOAT:
                return rs.getFloat(columnName);
            case Types.INTEGER:
                return rs.getInt(columnName);
            case Types.NVARCHAR:
                return rs.getNString(columnName);
            case Types.VARCHAR:
                return rs.getString(columnName);
            case Types.TINYINT:
                return rs.getInt(columnName);
            case Types.SMALLINT:
                return rs.getInt(columnName);
            case Types.DATE:
                return rs.getDate(columnName);
            case Types.TIMESTAMP:
                return rs.getTimestamp(columnName);
            default:
                return rs.getObject(columnName);
        }
    }

    /**
     * 關閉資源
     *
     * @param statement  語句執行器
     * @param connection 連接
     */
    public static void closeResource(Statement statement, Connection connection) {
        closeStatement(statement);
        closeConnection(connection);
    }

    /**
     * 關閉資源
     *
     * @param resultSet  結果集
     * @param statement  語句執行器
     * @param connection 連接
     */
    public static void closeResource(ResultSet resultSet, Statement statement, Connection connection) {
        closeResultSet(resultSet);
        closeStatement(statement);
        closeConnection(connection);
    }

    /**
     * 關閉結果集
     *
     * @param resultSet 結果集
     */
    public static void closeResultSet(ResultSet resultSet) {
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 關閉語句執行器
     *
     * @param statement 語句執行器
     */
    public static void closeStatement(Statement statement) {
        if (statement != null) {
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 關閉連接
     *
     * @param connection 連接
     */
    public static void closeConnection(Connection connection) {
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

3.數據庫業務枚舉單例

package com.zdlt.auth.api.common.druid;

import com.alibaba.druid.pool.DruidDataSourceFactory;
import com.alibaba.fastjson.JSON;

import javax.sql.DataSource;
import java.util.List;
import java.util.Map;

/**
 * 模型實例數據庫枚舉
 *
 * @author shiyanjun
 * @since 2019-12-15
 */
public enum DMInstanceDb {
    INSTANCE;

    // 模型項實例數據源
    private static DataSource dataSource;

    static {
        if (dataSource == null) {
            try {
                dataSource = DruidDataSourceFactory.createDataSource(DbConfig.getDbConfig());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 獲取數據源
     *
     * @return
     */
    public DataSource getDataSource() {
        return dataSource;
    }

    /**
     * 測試
     *
     * @param args
     */
    public static void main(String[] args) {
        String sql = "select * from system_dict";
        // 使用枚舉單例對象DMInstanceDb.INSTANCE獲取數據源
        DataSource dataSource = DMInstanceDb.INSTANCE.getDataSource();
        List<Map<String, Object>> mapList = DbUtil.executeQuery(dataSource, sql);
        System.out.println(JSON.toJSONString(mapList));
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM