ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – 如何基于JDBC结果集创建表

2019-10-01 21:17:01  阅读:264  来源: 互联网

标签:java mysql database jdbc resultset


我正在构建一个报告工具,我需要在远程数据库上执行查询并将结果集存储在我自己的数据库中(因为我没有远程数据库的写权限,我还需要缓存结果以防止进一步执行).此外,我需要这种功能,因此我可以将两个结果集连接在一起,并根据生成的结果生成结果.

现在,我的问题是我不知道如何基于jdbc ResultSet创建表.是否有任何开源工具或脚本可以处理这个问题?

我的应用程序基于Spring 3.1.0并使用JDBC来查询本地和远程数据库.我想存储结果的本地数据库是MySQL 5.5.20. (这是一个存储在MySQL中的好主意吗?它是否提供了足够的性能?)

解决方法:

我们可以从结果集中提取最近的匹配结构并构造一个表.
但就表名,键,引擎类型,字段是否可为空等等而言,这不是精确的副本.

以下代码段可帮助您以获得适当结果的方式继续操作.

String sql = "select * from visitors";
ResultSet rs = stmt.executeQuery( sql );
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
String tableName = null;
StringBuilder sb = new StringBuilder( 1024 );
if ( columnCount > 0 ) { 
    sb.append( "Create table " ).append( rsmd.getTableName( 1 ) ).append( " ( " );
}
for ( int i = 1; i <= columnCount; i ++ ) {
    if ( i > 1 ) sb.append( ", " );
    String columnName = rsmd.getColumnLabel( i );
    String columnType = rsmd.getColumnTypeName( i );

    sb.append( columnName ).append( " " ).append( columnType );

    int precision = rsmd.getPrecision( i );
    if ( precision != 0 ) {
        sb.append( "( " ).append( precision ).append( " )" );
    }
} // for columns
sb.append( " ) " );

System.out.println( sb.toString() );

执行上面的部分代码,打印下面的字符串:

Create table visitors ( ip VARCHAR( 6 ), bro VARCHAR( 6 ) )

让我希望这有助于您继续前进.

类似的例子可以在:Create a table using ResultSet ???找到

更新1:

how can I deal with types that only exist in one database and does not exist in another

仅依赖于客户端应用程序的结果集时,您无法执行任何操作.
它应始终是主选择查询,从几何,地址等复合数据类型中选择适当的数据.
例子:选择addess.city,address.zipcode,x(geometry_column),y(geometry_column)

举几个数据类型的示例:
MySQL有Spatial Support的定义.但我不确定它们与SQL Server’s implementation of Spatial Data相比有多好.

geometry是复合数据类型,因此无法通过直接查询进行检索.
您需要依赖函数来解析来自此类数据列的数据,并以可读,可识别的数据格式返回.
示例:create table geom(g geometry);
将结果集从使用JAVA的geom中的select g转换为create table语句将导致列g的unknwon数据类型.

Create table geom ( g UNKNOWN )

在列g上使用x(g),y(g)坐标函数将返回正确且可接受的数据类型.
查询选择x(g),从geom的y(g)将被转换为

Create table  ( x(g) DOUBLE( 23, 31 ), y(g) DOUBLE( 23, 31 ) ) 

更新2:
结果集可能是使用关系组合多个表生成的.结果集字段也有可能由表达式及其别名组成.因此,生成的列字段或别名的数据类型是动态决定的.元数据不知道查询中的表,列名及其原始/父数据类型的确切名称.

所以,这是不可能的

>表的单个名称并使用它.
>父列的数据类型并使用它.

注意:这也适用于所有其他跨数据库特定的数据类型,如NVARCHAR等.
但是,请参阅this posting for an alternative to NVARCHAR usage in MySQL.

在尝试这种动态数据迁移之前,客户端应用程序应该知道相应的数据类型并相应地使用它们.

另请参阅Data types and ranges for Microsoft Access, MySQL and SQL Server以获取更多信息.

标签:java,mysql,database,jdbc,resultset
来源: https://codeday.me/bug/20191001/1840035.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有