黑马程序员技术交流社区

标题: 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