Java从选择查询存储多行

时间:2015-03-17 16:09:23

标签: java database local records

这实际上是我的一个旧问题的重演,我完全重做了,因为我的旧问题似乎让人感到困惑。

我编写了一个查询数据库的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
}

总而言之,这个代码可以运行,我可以访问数据库一次,获取我需要的所有数据,将其存储在变量中并按照我的要求使用它们然而这感觉不对,我认为它远非最适合考虑到我只能在Informix-4GL中使用15行代码来实现这一点。

有人可以给我一些更好的方法来获得类似的结果吗?

2 个答案:

答案 0 :(得分:1)

您的代码实际上非常接近于盒子库JDBC。

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

一些例子:

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);
}

这更具惯用性,当然也没有触及可用于使数据库访问更容易的几个框架和库。

答案 1 :(得分:0)

为了有效地使用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将不会是你的最佳选择。