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

63次阅读

共计 4285 个字符,预计需要花费 11 分钟才能阅读完成。

jar 包引入

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

mysql

mysql-connector-java

8.0.17

代码展示

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 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 须要连贯的数据库名称
智汇代理申请 https://www.kaifx.cn/broker/t…

* @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 getFieldData(Connection con, String sql) throws Exception {

PreparedStatement ps = con.prepareStatement(sql);

// 执行后果的汇合

ResultSet rs = ps.executeQuery();

// 通过 ResultSetMetaData 获取字段

ResultSetMetaData metaData = rs.getMetaData();

// 返回后果定义

List 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 dataList = getFieldData(databaseConnection, “SELECT dept_id as departmentId,mobile as phoneNumber,name FROM user”);

for (DataSetEntity dataSetEntity : dataList) {

System.out.println(dataSetEntity);

}

}

}

正文完
 0