首页 > 解决方案 > 如何在循环中将字符串分配给结果集值?

问题描述

我有一个包含 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);
                }

            }
        }
    });

标签: javasqleclipse

解决方案


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 中,如果主要目的是透明且不可变地通信数据,则定义类要简单得多。只需声明每个成员字段的类型和名称。编译器隐式创建构造函数、getterequalshashCodetoString

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 以了解更多信息。


推荐阅读