可以将 executeQuery(String sql) 函数的返回值类型转换为字符串数组吗?

Posted

技术标签:

【中文标题】可以将 executeQuery(String sql) 函数的返回值类型转换为字符串数组吗?【英文标题】:Can executeQuery(String sql) function's return value be typecasted to a String Array? 【发布时间】:2013-08-24 15:46:58 【问题描述】:

我有以下代码:-

sql = "select Col3 from MyOption where OptionKey = (?,?,?,?) and ID = " + _Id;

pst = conn.prepareStatement(sql);
pst.setString(1, "Mail.IMAP.Server");
pst.setString(2, "Mail.IMAP.Port");
pst.setString(3, "Mail.IMAP.AuthUser");
pst.setString(4, "Mail.IMAP.UseTLS");

由于我的代码只返回一个包含字符串的列,我可以将该行类型转换为:- 字符串[] 数组 = pst.executeQuery(); ?

因为迭代结果集并设置属性,例如 properties.setProperty("mail.imap.host", rs.toString());

真的很难。

这里有没有更简单的解决方案,避免遍历整个数组并一一检查?

while (rs.next() && rs.toString().contains("imap")) 

int i = 1;

if(i==1)
properties.setProperty("mail.imap.host", rs.toString());
if(i==2)
properties.setProperty("mail.imap.port", rs.toString());
if(i==3)
properties.setProperty("mail.imap.auth", rs.toString());
if(i==4)
properties.setProperty("mail.imap.starttls.enable", rs.toString());
i++;

有更简单的方法吗?

【问题讨论】:

【参考方案1】:

回答您的问题: 不,不可能,因为(来自 PreparedStatement javadoc)

ResultSet executeQuery() throws SQLException

在此 PreparedStatement 对象中执行 SQL 查询并返回 查询生成的 ResultSet 对象。

而且您无法更改此签名。

您的意图是在Array<>[] 变量中返回整个ResultSet,对于大型结果集,这可能会导致OutOfMemoryException。 您可以考虑使用 Spring JDBC 支持和 JDBCTemplate.queryForList() 来轻松使用 ResultSet 映射

编辑: 关于您的代码,最好的选择是将查询更改为:

select Col3,MyOption from MyOption where OptionKey in (?,?,?,?) and ID = " + _Id";

while(rs.hasNext()) 
  String option = rs.getString(2);
  String optionValue = rs.getString(1);
  String propertyName = null;
  if(option.contains("imap")) 
    switch(options) 
      case "Mail.IMAP.Server":
        propertyName = "mail.imap.host";
        break;
      case "Mail.IMAP.Port":
        propertyName = "mail.imap.port";
        break;
      case "Mail.IMAP.AuthUser":
        propertyName = "mail.imap.auth";
        break;
      case "Mail.IMAP.UseTLS":
        propertyName = "mail.imap.starttls.enable";
        break;
    
    if(null != propertyName) 
      properties.setProperty(propertyName, optionValue);
    
  

【讨论】:

您的回答会更容易接受,如果您可以建议任何其他设置属性的方式 'if(i==2) properties.setProperty("mail.imap.port ", rs.toString());'或者可能是一个更优雅的解决方案,逐个获取属性。在此先感谢

以上是关于可以将 executeQuery(String sql) 函数的返回值类型转换为字符串数组吗?的主要内容,如果未能解决你的问题,请参考以下文章

type 语句中的方法 executeQuery(string) 不适用于 arguments(),我哪里出错了?使用 Eclipse

execute,executeQuery,executeUpdate的区别是什么?

for 循环中 jdbc executeQuery(sql);出错

ResultSet RS_resultxtgg=connDbBean.executeQuery(sqlxtgg);

GORM 的这个实现目前不支持基于字符串的查询,如 [executeQuery]

jTable将所有内容排序为String