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);
}
}
}