java - 如何在循环中将字符串分配给结果集值?
问题描述
我有一个包含 meta_key 值的 SQL 语句。当我使用 while/next 运行结果集时,值会正确显示。我想做的是将每个值分配给一个唯一命名或编号的字符串,以便在后续语句中使用,以将这些值发布到网站。
除了将结果值分配给字符串之外,我一切正常......我确信我这样做就像一个等级初学者,所以我提前道歉。
try {
Connection conn = DriverManager.getConnection(
"jdbc:mysql://sftp.databaseengine.com:3306/table", "user",
"password");
String getcomp = "SELECT DISTINCT wpgc.user_id, wpgc.status, wpgc.content_id, wpu.meta_key,\r\n"
+ " CASE wpu.meta_value WHEN 'm' THEN 'MALE' WHEN 'f' THEN 'FEMALE'\r\n"
+ " WHEN 'Louisiana' THEN 'LA' ELSE wpu.meta_value END AS '1',\r\n"
+ " wpu.user_id, wpgc.timestamp \r\n"
+ " FROM wp_grassblade_completions AS wpgc\r\n"
+ " JOIN wp_usermeta AS wpu ON wpgc.user_id = wpu.user_id\r\n"
+ " WHERE wpgc.user_id = ? \r\n"
+ " AND wpu.meta_key IN ('mepr_full_name', 'mepr_address', 'mepr_city', 'mepr_state',\r\n"
+ " 'mepr_zip_code', 'mepr_home_phone_with_area_code',\r\n"
+ " 'mepr_drivers_license_or_id', 'mepr_id_state',\r\n"
+ " 'mepr_Last_four_of_social_security_number',\r\n"
+ " 'mepr_date_of_birth_mmddyyyy', 'mepr_sex_mf', 'mepr_height',\r\n"
+ " 'mepr_weight')\r\n";
PreparedStatement pst = conn.prepareStatement(getcomp);
pst.setString(1, user_id);
ResultSet rs = pst.executeQuery();
while (rs.next()) {
for (int i = 0; i < 13; ++i) {
String value = rs.getString(5);
if i = 1 {}
System.out.println(i + " column " + (value));
rs.next();
}
}
}
catch (Exception e) {
System.out.println("Exception on " + user_id);
}
}
}
});
解决方案
Map
AMap
是键值对的集合。A NavigableMap
(或SortedMap
)按排序顺序维护键,如果您关心的话。
搜索以了解更多信息,因为这已被多次介绍。
NavigableMap< Integer , String > map = new TreeMap<>() ;
map.put( 1 , "Alice" ) ;
map.put( 2 , "Bob" ) ;
在你的情况下:
map.put( i , value ) ;
并了解 Java 中的自动装箱、基元和对象之间的转换。
record
作为使用映射的替代方法,您可以从定义的自定义类中实例化对象以保存检索到的值。
在 Java 16 中,如果主要目的是透明且不可变地通信数据,则定义类要简单得多。只需声明每个成员字段的类型和名称。编译器隐式创建构造函数、getterequals
和hashCode
和toString
。
record Pair ( int id, String value ) {}
用法。
List< Pair > list = new ArrayList<>() ;
…
list.add ( new Pair( i , value ) ) ;
…
当然,您会发明类和字段的名称以更具描述性。
计数行
我不确定,因为我没有研究您的代码,但您不希望for
在结果集处理中出现循环。对于计数器,使用这个:
int i = 0 ;
while (rs.next()) {
i ++ ;
…
}
或者更好的是,在 SQL 中动态生成 1、2、3 数字序列,作为查询中定义的额外列。搜索 Stack Overflow 或姊妹网站 DBA.StackExchange.com 以了解更多信息。