代码之家  ›  专栏  ›  技术社区  ›  TheLovelySausage

Java存储选择查询中的多行

  •  0
  • TheLovelySausage  · 技术社区  · 10 年前

    这实际上是对我的一个老问题的重复,我已经完全重做了,因为我的老问题似乎让人困惑。

    我编写了一个Java程序,用于查询数据库,并检索几行数据。我以前在Informix-4GL中编写过该程序,我使用一个sql游标在数据库中循环,并将每一行存储到一个“动态记录行”中。我知道在Java中没有一行记录,所以我最终编写了以下代码。

    public class Main {
    
         // DB CONNECT VARIABLE ===========================
         static Connection gv_conn = null;
    
         // PREPARED STATEMENT VARIABLES ==================
         static PreparedStatement users_sel = null;
         static ResultSet users_curs = null;
         static PreparedStatement uinfo_sel = null;
         static ResultSet uinfo_curs = null;
    
         // MAIN PROGRAM START ============================
    
         public static void main(String[] args) {
    
              try {
                   // CONNECT TO DATABASE CODE
              } catch(Exception log) {
                   // YOU FAILED CODE
              }
    
              f_prepare(); // PREPARE THE STATEMENTS
    
              ArrayList<Integer> list_id = new ArrayList<Integer>();
              ArrayList<String> list_name = new ArrayList<String>();
              ArrayList<Integer> list_info = new ArrayList<String>();
              ArrayList<String> list_extra = new ArrayList<String>();
    
              try {
    
                   users_sel.setInt(1, 1);
                   users_curs = users_sel.executeQuery();
    
                   // RETRIEVE ROWS FROM USERS
                   while (users_curs.next()) {
    
                        int lv_u_id = users_curs.getInt("u_id");
                        String lv_u_name = users_curs.getString("u_name");
    
                        uinfo_sel.setInt(1, lv_u_id);
                        uinfo_curs = uinfo_sel.executeQuery();
    
                        // RETRIEVE DATA FROM UINFO RELATIVE TO USER
                        String lv_ui_info = uinfo_curs.getString("ui_info");
                        String lv_ui_extra = uinfo_curs.getString("ui_extra");
    
                        // STORE DATA I WANT IN THESE ARRAYS
                        list_id.add(lv_u_id);
                        list_name.add(lv_u_name);
                        list_info.add(lv_ui_info);
                        list_extra.add(lv_ui_extra);
    
                   }
    
              } catch(SQLException log) {
                   // EVERYTHING BROKE
              }
    
              // MAKING SURE IT WORKED
              System.out.println(
                   list_id.get(0) +
                   list_name.get(0) +
                   list_info.get(0) +
                   list_extra.get(0)
              );
    
              // TESTING WITH ARBITRARY ROWS
              System.out.println(
                   list_id.get(2) +
                   list_name.get(5) +
                   list_info.get(9) +
                   list_extra.get(14)
              );
    
         }
    
         // PREPARE STATEMENTS SEPARATELY =================
    
         public static void f_prepare() {
    
              String lv_sql = null;
    
              try {
    
                   lv_sql = "select * from users where u_id >= ?"
                   users_sel = gv_conn.prepareStatement(lv_sql);
    
                   lv_sql = "select * from uinfo where ui_u_id = ?"
                   uinfo_sel = gv_conn.prepareStatement(lv_sql)
    
              } catch(SQLException log) {
                   // IT WON'T FAIL COZ I BELIEEEVE
              }
    
         }
    
    }
    
    class DBConn {
       // connect to SQLite3 code
    }
    

    总之,所有这些代码都有效,我可以访问数据库一次,获取所需的所有数据,将其存储在变量中,并根据自己的意愿使用它们。然而,这感觉不太好,我认为这远不是用Java实现这一点的最合适的方式,因为我在Informix-4GL中只需要15行代码就可以做到这一点。

    有人能给我一个更好的方法来实现类似的结果吗?

    2 回复  |  直到 10 年前
        1
  •  1
  •   James Watson    10 年前

    为了有效地使用Java,您需要使用自定义对象。这里有很多类内的静态方法。似乎您来自过程背景,如果您尝试将Java用作过程语言,那么使用它不会有多大价值。因此,首先创建一个类型,您可以将其直接放置在类中或将其创建为一个单独的文件:

    class User
    {
       final int id;
       final String name;
       final String info;
       final String extra;
    
       User(int id, String name, String info, String extra)
       {
         this.id = id;
         this.name = name;
         this.info = info;
         this.name = name;
       }
    
       void print()
       {
         System.out.println(id + name + info + extra);
       }
    }
    

    然后循环变为:

          List<User> list = new ArrayList<User>();
    
          try {
    
               users_sel.setInt(1, 1);
               users_curs = users_sel.executeQuery();
    
               // RETRIEVE ROWS FROM USERS
               while (users_curs.next()) {
    
                    int lv_u_id = users_curs.getInt("u_id");
                    String lv_u_name = users_curs.getString("u_name");
    
                    uinfo_sel.setInt(1, lv_u_id);
                    uinfo_curs = uinfo_sel.executeQuery();
    
                    // RETRIEVE DATA FROM UINFO RELATIVE TO USER
                    String lv_ui_info = uinfo_curs.getString("ui_info");
                    String lv_ui_extra = uinfo_curs.getString("ui_extra");
    
                    User user = new User(lv_u_id, lv_u_name, lv_ui_info, lv_ui_extra);
    
                    // STORE DATA
                    list.add(user);
            }
    
          } catch(SQLException log) {
               // EVERYTHING BROKE
          }
    
          // MAKING SURE IT WORKED
          list.get(0).print();
    

    这不一定涉及行数。大多数使用Java的人不会使用这种低级API与数据库进行交互,但一般来说,如果您希望使用最少的行数(这是一个值得怀疑的目标),Java不会是您的最佳选择。

        2
  •  1
  •   Will Hartung    10 年前

    您的代码实际上非常接近于现成的JDBC。

    区别在于,在Java中,我们将拥有一个简单的JavaBean及其集合,而不是每个字段有一个离散的数组集合。

    一些示例:

    public class ListItem {
        Integer id;
        String name;
        Integer info;
        String extra;
    
        … constructors and setters/getters ellided …
    
    }
    
    List<ListItems> items = new ArrayList<>();
    
    
    …
    
    while(curs.next()) {   
        ListItem item = new ListItem();
        item.setId(curs.getInt(1));
        item.setName(curs.getString(2));
        item.setInfo(curs.getInfo(3));
        item.setExtra(curs.getString(4));
    
        items.add(item);
    }
    

    这更为地道,当然也不涉及使DB访问更容易的几个框架和库。