java通过jdbc获取查询sql的字段信息

jar包引入

需要把连接数据库的jar包引入进行,以mysql为例

  <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.17</version>
        </dependenc

代码展现

package com.ourlang.csdn.control;

import org.junit.Test;
import org.springframework.util.StringUtils;

import java.sql.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;

/**
 * BI项目sql查询解析字段类型 名称 长度 是否是数据集工具类
 * https://github.com/ourlang
 * @author ourlang
 */
public class DataSetUtil {
    /**
     * 所有指标类型的集合
     */
    private static List<String> targetList = Arrays.asList("BIT", "TINYINT", "SMALLINT", "INTEGER", "BIGINT", "FLOAT", "FLOAT", "DOUBLE", "NUMERIC", "DECIMAL");

    /**
     * 返回的数据字段对象
     * 如有需要可自行添加
     * getter setter 可以用lombok
     */
    class DataSetEntity {
        /**
         * 字段名称
         */
        private String fieldName;
        /**
         * 字段类型
         */
        private String fieldType;
        /**
         * 长度
         */
        private int fieldSize;
        /**
         * 是否是指标
         */
        private boolean isIndicator;

        private void setFieldName(String fieldName) {
            this.fieldName = fieldName;
        }

        private void setFieldType(String fieldType) {
            this.fieldType = fieldType;
        }

        private void setFieldSize(int fieldSize) {
            this.fieldSize = fieldSize;
        }

        private void setIsIndicator(boolean isIndicator) {
            this.isIndicator = isIndicator;
        }

        @Override
        public String toString() {
            return "DataSetEntity{" +
                    "fieldName='" + fieldName + '\'' +
                    ", fieldType='" + fieldType + '\'' +
                    ", fieldSize=" + fieldSize +
                    ", isIndicator='" + isIndicator + '\'' +
                    '}';
        }
    }

    /**
     * 获取数据库的连接url
     *
     * @param dataBaseType 数据库类型
     * @param ip           连接ip地址
     * @param port         连接端口号
     * @param databaseName 需要连接的数据库名称
     * @return 数据库的连接url
     */
    private static String getConnectionUrl(String dataBaseType, String ip, String port, String databaseName) {
        StringBuilder sb = new StringBuilder();
        // 截断首尾空格,转换为大写
        String upperDataBaseType = dataBaseType.trim().toUpperCase();
        //空类型
        if (StringUtils.isEmpty(upperDataBaseType)) {
            throw new RuntimeException("不认识的数据库类型!");
        }
        switch (upperDataBaseType) {
            case "ORACLE":
                sb.append("jdbc:oracle:thin:@");
                sb.append(ip.trim());
                sb.append(":").append(port.trim());
                sb.append(":").append(databaseName);
                break;
            case "CACHE":
                break;
            case "MYSQL":
                sb.append("jdbc:mysql://");
                sb.append(ip.trim());
                sb.append(":").append(port.trim());
                sb.append("/").append(databaseName);
                sb.append("?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8");
                break;
            case "SQLSERVER":
                sb.append("jdbc:sqlserver://");
                sb.append(ip.trim());
                sb.append(":").append(port.trim());
                sb.append("; DatabaseName=").append(databaseName);
                break;
            //默认oracle
            default:
                sb.append("jdbc:oracle:thin:@");
                sb.append(ip.trim());
                sb.append(":").append(port.trim());
                sb.append(":").append(databaseName);
                break;
        }

        return sb.toString();
    }

    /**
     * 获取数据库连接
     *
     * @param url      数据库的连接url
     * @param username 数据库用户名
     * @param password 数据库密码
     * @return 数据库连接对象
     */
    public static Connection getDatabaseConnection(String url, String username, String password) {
        Connection conn = null;
        try {
            //数据库配置信息对象
            Properties info = new Properties();
            //用户名
            info.put("user", username);
            //密码
            info.put("password", password);
            // Oracle 如果想要获取元数据 REMARKS 信息,需要加此参数
            info.put("remarksReporting", "true");
            //  MySQL 标志位, 获取TABLE元数据 REMARKS 信息
            info.put("useInformationSchema", "true");
            conn = DriverManager.getConnection(url, info);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }


    /**
     * 获取查询sql中的字段数据信息集合
     *
     * @param con 数据库连接
     * @param sql 查询sql
     * @return 字段数据信息集合
     */
    public List<DataSetEntity> getFieldData(Connection con, String sql) throws Exception {
        PreparedStatement ps = con.prepareStatement(sql);
        //执行结果的集合
        ResultSet rs = ps.executeQuery();
        //通过ResultSetMetaData获取字段
        ResultSetMetaData metaData = rs.getMetaData();
        //返回结果定义
        List<DataSetEntity> dataList = new ArrayList<>();
        if (metaData != null) {
            int count = metaData.getColumnCount();
            for (int i = 1; i <= count; i++) {
                DataSetEntity dataSetEntity = new DataSetEntity();

                //获取字段别名
                String aliasName = metaData.getColumnLabel(i);
                //如果没有别名
                if (StringUtils.isEmpty(aliasName)) {
                    //字段名称
                    dataSetEntity.setFieldName(metaData.getColumnName(i));
                } else {
                    dataSetEntity.setFieldName(aliasName);
                }
                //字段长度
                dataSetEntity.setFieldSize(metaData.getColumnDisplaySize(i));

                //字段类型 metaData.getColumnType(i)
                String fieldTypeName = metaData.getColumnTypeName(i);
                dataSetEntity.setFieldType(fieldTypeName);

                //判断字段类型设置是否是指标
                if (targetList.contains(fieldTypeName)) {
                    dataSetEntity.setIsIndicator(true);
                } else {
                    dataSetEntity.setIsIndicator(false);
                }
                dataList.add(dataSetEntity);
            }
        }
        return dataList;
    }

    @Test
    public void test01() throws Exception {
        //获取数据库的连接url
        String url = getConnectionUrl("mysql", "127.0.0.1", "3306", "noadmin");

        Connection databaseConnection = getDatabaseConnection(url, "root", "admin");
        List<DataSetEntity> dataList = getFieldData(databaseConnection, "SELECT dept_id as departmentId,mobile as phoneNumber,name FROM user");

        for (DataSetEntity dataSetEntity : dataList) {
            System.out.println(dataSetEntity);
        }
    }

}

留言交流

如果有什么问题,欢迎大家留言交流

猜你喜欢

转载自blog.csdn.net/qq_37493556/article/details/107319968