黑马程序员技术交流社区
标题:
java通过jdbc获取查询sql的字段信息
[打印本页]
作者:
专注的一批
时间:
2020-7-15 10:48
标题:
java通过jdbc获取查询sql的字段信息
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;
/**
* 是否是指标
外汇经纪商动态https://www.fx61.com/news
*/
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 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);
}
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2