Java遍历SQL Resultset判断类型并添加Player/Coach到列表的实现方法
首先你要明确一个前提:JDBC返回的ResultSet是纯数据库查询的结构化数据,本身不携带任何Java类的类型信息,你不可能直接对结果集行用instanceof判断类型,必须在你的tblmember表中新增类型标识字段来区分该行存储的是球员还是教练数据,比如新增字段fld_member_type,约定值为0对应Player类、值为1对应Coach类即可,也可以直接复用表中已有的、能区分成员身份的字段做判断。
另外你现有代码有两处明显错误:
- SQL语句结尾多写了一个多余的单引号,执行时会直接报SQL语法错误
- 循环前的
if(r.next())会让你直接跳过结果集的第一行数据,直接删除即可,while(r.next())本身就会自动判断是否还有未读取的行
修正后的完整代码如下:
// 修正SQL的多余单引号 String sql = "SELECT * FROM tblmember;"; System.out.println("Before query"); ResultSet r = stmt.executeQuery(sql); ArrayList<Member> rlist = new ArrayList<>(); // 去掉多余的if(r.next())判断 while(r.next()) { // 读取类型标识字段判断要生成的对象类型 int memberType = r.getInt("fld_member_type"); if (memberType == 0) { // 构造Player对象,可根据实际需求补全构造参数 rlist.add(new Player(r.getInt("fldmemberid"), r.getString("fldfirstname"))); } else if (memberType == 1) { // 构造Coach对象,可根据实际需求补全构造参数 rlist.add(new Coach(r.getInt("fldmemberid"), r.getString("fldfirstname"))); } }
如果你的类型标识用的是字符串类型,把判断逻辑改成r.getString("fld_member_type").equals("PLAYER")即可。
内容的提问来源于stack exchange,提问作者Matt Nguyen
相关产品推荐
相关产品推荐

