1

我有以下代码:-

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");

由于我的代码只返回一个包含字符串的列,我可以将该行类型转换为:- String[] array = 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++;
}

有没有更简单的方法来做到这一点?

4

1 回答 1

2

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

结果集 executeQuery() 抛出 SQLException

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

你不能改变这个签名。

ResultSet您的意图是在变量中返回整体Array<>[],对于大型结果集,这可能会导致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);
    }
  }
}
于 2013-08-24T15:56:09.997 回答