Java获取数据库表的字段信息,及如何将ResultSet转为json

原文链接: https://blog.csdn.net/Ego_Ekko/article/details/127576664

一、Java获取数据库表的各个字段的相关信息

在某些开发情景中,需要获取数据库中表的各个字段的相关信息,如字段名,字段类型,字段大小等信息。

DatabaseMetaData 是有关整个数据库的信息:表名、表的索引、数据库产品的名称和版本、数据库支持的操作。 

ResultSet 是关于某个表的信息或一个查询的结果。您必须逐行访问数据行,但是您可以任何顺序访问列。 

ResultSetMetaData 存储的是有关 ResultSet 中列的名称和类型的信息。 

ResultSet 对象是 JDBC 中最重要的单个对象。从本质上讲,它是对一个一般宽度和未知长度的表的一种抽象。几乎所有的方法和查询都将数据作为 ResultSet 返回。ResultSet 包含任意数量的命名列,您可以按名称访问这些列。它还包含一个或多个行,您可以按顺序自上而下逐一访问。

使用 getMetaData() 方法从 ResultSet 中获取 ResultSetMetaData 对象。可以使用此对象获得列的各个相关信息。

使用ResultSetMetaData获取各列相关信息的代码示例如下: 

  1.  
    import java.sql.Connection;
  2.  
    import java.sql.DriverManager;
  3.  
    import java.sql.ResultSet;
  4.  
    import java.sql.PreparedStatement;
  5.  
    import java.sql.ResultSetMetaData;
  6.  
    import java.sql.SQLException;
  7.  
    public class TestDemo {
  8.  
    public static Connection getConnection() {
  9.  
    Connection conn = null;
  10.  
    try {
  11.  
    Class.forName("com.mysql.jdbc.Driver");
  12.  
    String url = "jdbc:mysql://数据库IP地址:3306/数据库名称";
  13.  
    String user = "数据库用户名";
  14.  
    String pass = "数据库用户密码";
  15.  
    conn = DriverManager.getConnection(url, user, pass);
  16.  
    } catch (ClassNotFoundException e) {
  17.  
    e.printStackTrace();
  18.  
    } catch (SQLException e) {
  19.  
    e.printStackTrace();
  20.  
    }
  21.  
    return conn;
  22.  
    }
  23.  
    public static void main(String[] args) {
  24.  
    Connection conn = getConnection();
  25.  
    String sql = "select * from AccessType";
  26.  
    PreparedStatement stmt;
  27.  
    try {
  28.  
    stmt = conn.prepareStatement(sql);
  29.  
    ResultSet rSet = stmt.executeQuery(sql);
  30.  
    ResultSetMetaData data = rSet.getMetaData();
  31.  
    for (int i = 1; i <= data.getColumnCount(); i++) {
  32.  
    // 获得所有列的数目及实际列数
  33.  
    int columnCount = data.getColumnCount();
  34.  
    // 获得指定列的列名
  35.  
    String columnName = data.getColumnName(i);
  36.  
    //String columnName = data.getColumnLabel(i);该函数也能获取列名
  37.  
    // 获得指定列的列值
  38.  
    int columnType = data.getColumnType(i);
  39.  
    // 获得指定列的数据类型名
  40.  
    String columnTypeName = data.getColumnTypeName(i);
  41.  
    // 所在的Catalog名字
  42.  
    String catalogName = data.getCatalogName(i);
  43.  
    // 对应数据类型的类
  44.  
    String columnClassName = data.getColumnClassName(i);
  45.  
    // 在数据库中类型的最大字符个数
  46.  
    int columnDisplaySize = data.getColumnDisplaySize(i);
  47.  
    // 默认的列的标题
  48.  
    String columnLabel = data.getColumnLabel(i);
  49.  
    // 获得列的模式
  50.  
    String schemaName = data.getSchemaName(i);
  51.  
    // 某列类型的精确度(类型的长度)
  52.  
    int precision = data.getPrecision(i);
  53.  
    // 小数点后的位数
  54.  
    int scale = data.getScale(i);
  55.  
    // 获取某列对应的表名
  56.  
    String tableName = data.getTableName(i);
  57.  
    // 是否自动递增
  58.  
    boolean isAutoInctement = data.isAutoIncrement(i);
  59.  
    // 在数据库中是否为货币型
  60.  
    boolean isCurrency = data.isCurrency(i);
  61.  
    // 是否为空
  62.  
    int isNullable = data.isNullable(i);
  63.  
    // 是否为只读
  64.  
    boolean isReadOnly = data.isReadOnly(i);
  65.  
    // 能否出现在where中
  66.  
    boolean isSearchable = data.isSearchable(i);
  67.  
    System.out.println(columnCount);
  68.  
    System.out.println("获得列" + i + "的字段名称:" + columnName);
  69.  
    System.out.println("获得列" + i + "的类型,返回SqlType中的编号:"+ columnType);
  70.  
    System.out.println("获得列" + i + "的数据类型名:" + columnTypeName);
  71.  
    System.out.println("获得列" + i + "所在的Catalog名字:"+ catalogName);
  72.  
    System.out.println("获得列" + i + "对应数据类型的类:"+ columnClassName);
  73.  
    System.out.println("获得列" + i + "在数据库中类型的最大字符个数:"+ columnDisplaySize);
  74.  
    System.out.println("获得列" + i + "的默认的列的标题:" + columnLabel);
  75.  
    System.out.println("获得列" + i + "的模式:" + schemaName);
  76.  
    System.out.println("获得列" + i + "类型的精确度(类型的长度):" + precision);
  77.  
    System.out.println("获得列" + i + "小数点后的位数:" + scale);
  78.  
    System.out.println("获得列" + i + "对应的表名:" + tableName);
  79.  
    System.out.println("获得列" + i + "是否自动递增:" + isAutoInctement);
  80.  
    System.out.println("获得列" + i + "在数据库中是否为货币型:" + isCurrency);
  81.  
    System.out.println("获得列" + i + "是否为空:" + isNullable);
  82.  
    System.out.println("获得列" + i + "是否为只读:" + isReadOnly);
  83.  
    System.out.println("获得列" + i + "能否出现在where中:"+ isSearchable);
  84.  
    }
  85.  
    } catch (SQLException e) {
  86.  
    e.printStackTrace();
  87.  
    }
  88.  
    }
  89.  
    }

二、如何直接通过ResultSet将数据转为Json对象?

根据以上所述,可以使用ResultMetaData,遍历每一条获取到的数据的列信息,以列名为key,值为value,存入Json对象中即可。

以下代码为简化版,没有考虑列数据的类型,都以String类型统一处理,其实还应该使用getColumnTypeName()函数判断该列的类型,并使用ResultSet对应的getXXX函数获取列的值。

  1.  
    public JSONObject mapper(ResultSet rSet) throws SQLException {
  2.  
    JSONObject jsonObject = new JSONObject();
  3.  
    //获取列数
  4.  
    ResultSetMetaData metaData = rSet.getMetaData();
  5.  
    int columnCount = metaData.getColumnCount();
  6.  
    //遍历每一列
  7.  
    for (int i = 1; i <= columnCount; i++) {
  8.  
    //获取列名
  9.  
    String columnName = metaData.getColumnName(i);
  10.  
    String value = rSet.getString(columnName);
  11.  
    jsonObject.put(columnName, value);
  12.  
    }
  13.  
    return jsonObject;
  14.  
    }

 

package com.pero.datasource;

import com.alibaba.druid.pool.DruidDataSourceFactory;
import com.mysql.jdbc.ResultSetRow;
import com.sun.corba.se.spi.ior.IdentifiableFactory;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
* @author Pero
* @version 1.0
* @title: JDBCUtilsByDruid
* @date 2022/10/29 22:33
*/

public class JDBCUtilsByDruid {
private static DataSource ds;

//在静态代码块中对ds初始化
static {
Properties properties = new Properties();
try {
properties.load(new FileInputStream("src\\druid.properties"));
ds = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
throw new RuntimeException(e);
}
}

//获取connection
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}

//关闭资源,将连接放回连接池
public void close(ResultSet resultSet, Statement statement, Connection connection){
try {
if (resultSet != null){
resultSet.close();
}
if (statement != null){
statement.close();
}
if (connection != null){
connection.close();
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}

package com.pero.datasource;

import org.junit.Test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

/**
* @author Pero
* @version 1.0
* @title: JDBCUtilsByDruid_Use
* @date 2022/10/29 23:30
*/

public class JDBCUtilsByDruid_Use {
@Test
public void testUseDruid(){
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
String sql = "insert into admin values (?,?)";

try {
connection = JDBCUtilsByDruid.getConnection(); //com.alibaba.druid.pool.DruidPooledConnection
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,"pero");
preparedStatement.setInt(2,951357);
preparedStatement.executeUpdate();
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
JDBCUtilsByDruid.close(null,preparedStatement,connection);
}
}

@Test
public void testSelect(){
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
String sql = "select * from admin";

try {
connection = JDBCUtilsByDruid.getConnection();
preparedStatement = connection.prepareStatement(sql);
resultSet = preparedStatement.executeQuery();
while(resultSet.next()){
String name = resultSet.getString("name");
int password = resultSet.getInt("password");
System.out.println(name + "\t" + password);
}
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
JDBCUtilsByDruid.close(resultSet,preparedStatement,connection);
}

}
}

#key=value
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/pero_db01?rewriteBatchedStatements=true
#url=jdbc:mysql://127.0.0.1:3306/pero_db01
username=root
password=pero
#initial connection size
initialSize=10
#min idle connection size
minIdle=5
#max active connection size
maxActive=20
#max wait time (5000 mil seconds)
maxWait=5000

 

//获取总记录数
      ResultSet rs = statement.executeQuery("select count(*) from user_info where userid='00000001' and userpass='admin'" );


     if (rs.next())
       {
             //rs.getInt(int columnIndex )-------->columnIndex the first column is 1, the second is 2, ...
             recordCount = rs.getInt(1);
       }


       就是rs.getInt(1)而已!

转载于:https://my.oschina.net/amui/blog/702803

posted @ 2024-07-11 17:59  枫树湾河桥  阅读(79)  评论(0编辑  收藏  举报
Live2D