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获取各列相关信息的代码示例如下:
-
import java.sql.Connection;
-
import java.sql.DriverManager;
-
import java.sql.ResultSet;
-
import java.sql.PreparedStatement;
-
import java.sql.ResultSetMetaData;
-
import java.sql.SQLException;
-
public class TestDemo {
-
public static Connection getConnection() {
-
Connection conn = null;
-
try {
-
Class.forName("com.mysql.jdbc.Driver");
-
String url = "jdbc:mysql://数据库IP地址:3306/数据库名称";
-
String user = "数据库用户名";
-
String pass = "数据库用户密码";
-
conn = DriverManager.getConnection(url, user, pass);
-
} catch (ClassNotFoundException e) {
-
e.printStackTrace();
-
} catch (SQLException e) {
-
e.printStackTrace();
-
}
-
return conn;
-
}
-
public static void main(String[] args) {
-
Connection conn = getConnection();
-
String sql = "select * from AccessType";
-
PreparedStatement stmt;
-
try {
-
stmt = conn.prepareStatement(sql);
-
ResultSet rSet = stmt.executeQuery(sql);
-
ResultSetMetaData data = rSet.getMetaData();
-
for (int i = 1; i <= data.getColumnCount(); i++) {
-
// 获得所有列的数目及实际列数
-
int columnCount = data.getColumnCount();
-
// 获得指定列的列名
-
String columnName = data.getColumnName(i);
-
//String columnName = data.getColumnLabel(i);该函数也能获取列名
-
// 获得指定列的列值
-
int columnType = data.getColumnType(i);
-
// 获得指定列的数据类型名
-
String columnTypeName = data.getColumnTypeName(i);
-
// 所在的Catalog名字
-
String catalogName = data.getCatalogName(i);
-
// 对应数据类型的类
-
String columnClassName = data.getColumnClassName(i);
-
// 在数据库中类型的最大字符个数
-
int columnDisplaySize = data.getColumnDisplaySize(i);
-
// 默认的列的标题
-
String columnLabel = data.getColumnLabel(i);
-
// 获得列的模式
-
String schemaName = data.getSchemaName(i);
-
// 某列类型的精确度(类型的长度)
-
int precision = data.getPrecision(i);
-
// 小数点后的位数
-
int scale = data.getScale(i);
-
// 获取某列对应的表名
-
String tableName = data.getTableName(i);
-
// 是否自动递增
-
boolean isAutoInctement = data.isAutoIncrement(i);
-
// 在数据库中是否为货币型
-
boolean isCurrency = data.isCurrency(i);
-
// 是否为空
-
int isNullable = data.isNullable(i);
-
// 是否为只读
-
boolean isReadOnly = data.isReadOnly(i);
-
// 能否出现在where中
-
boolean isSearchable = data.isSearchable(i);
-
System.out.println(columnCount);
-
System.out.println("获得列" + i + "的字段名称:" + columnName);
-
System.out.println("获得列" + i + "的类型,返回SqlType中的编号:"+ columnType);
-
System.out.println("获得列" + i + "的数据类型名:" + columnTypeName);
-
System.out.println("获得列" + i + "所在的Catalog名字:"+ catalogName);
-
System.out.println("获得列" + i + "对应数据类型的类:"+ columnClassName);
-
System.out.println("获得列" + i + "在数据库中类型的最大字符个数:"+ columnDisplaySize);
-
System.out.println("获得列" + i + "的默认的列的标题:" + columnLabel);
-
System.out.println("获得列" + i + "的模式:" + schemaName);
-
System.out.println("获得列" + i + "类型的精确度(类型的长度):" + precision);
-
System.out.println("获得列" + i + "小数点后的位数:" + scale);
-
System.out.println("获得列" + i + "对应的表名:" + tableName);
-
System.out.println("获得列" + i + "是否自动递增:" + isAutoInctement);
-
System.out.println("获得列" + i + "在数据库中是否为货币型:" + isCurrency);
-
System.out.println("获得列" + i + "是否为空:" + isNullable);
-
System.out.println("获得列" + i + "是否为只读:" + isReadOnly);
-
System.out.println("获得列" + i + "能否出现在where中:"+ isSearchable);
-
}
-
} catch (SQLException e) {
-
e.printStackTrace();
-
}
-
}
-
}
二、如何直接通过ResultSet将数据转为Json对象?
根据以上所述,可以使用ResultMetaData,遍历每一条获取到的数据的列信息,以列名为key,值为value,存入Json对象中即可。
以下代码为简化版,没有考虑列数据的类型,都以String类型统一处理,其实还应该使用getColumnTypeName()函数判断该列的类型,并使用ResultSet对应的getXXX函数获取列的值。
-
public JSONObject mapper(ResultSet rSet) throws SQLException {
-
JSONObject jsonObject = new JSONObject();
-
//获取列数
-
ResultSetMetaData metaData = rSet.getMetaData();
-
int columnCount = metaData.getColumnCount();
-
//遍历每一列
-
for (int i = 1; i <= columnCount; i++) {
-
//获取列名
-
String columnName = metaData.getColumnName(i);
-
String value = rSet.getString(columnName);
-
jsonObject.put(columnName, value);
-
}
-
return jsonObject;
-
}
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