我有以下代码: -
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的列,可以将行类型转换为: - 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++;
}
有更简单的方法吗?
答案 0 :(得分:2)
回答你的问题:
不,是不可能的,因为(来自PreparedStatement javadoc)
ResultSet executeQuery() throws 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);
}
}
}