Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java存储Select查询中的多行_Java_Database_Local_Records - Fatal编程技术网

Java存储Select查询中的多行

Java存储Select查询中的多行,java,database,local,records,Java,Database,Local,Records,这实际上是我的一个老问题的重做,我已经完全重做了,因为我的老问题似乎让人困惑 我编写了一个Java程序,用于查询数据库,并打算检索几行数据。我以前用Informix-4GL编写过这个程序,我使用sql游标在数据库中循环,并将每一行存储到“动态记录行”中。我知道Java中没有记录行,所以我最终得到了以下代码 public class Main { // DB CONNECT VARIABLE =========================== static Connect

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

我编写了一个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
}
公共类主{
//数据库连接变量===========================
静态连接gv_conn=null;
//准备语句变量==================
静态PreparedStatement用户\u sel=null;
静态结果集用户\u curs=null;
静态PreparedStatement uinfo_sel=null;
静态结果集uinfo_curs=null;
//主程序启动============================
公共静态void main(字符串[]args){
试一试{
//连接到数据库代码
}捕获(异常日志){
//你的代码失败了
}
f_prepare();//准备语句
ArrayList_id=新的ArrayList();
ArrayList_name=新的ArrayList();
ArrayList_info=新建ArrayList();
ArrayList_extra=新建ArrayList();
试一试{
用户选择设置(1,1);
users\u curs=users\u sel.executeQuery();
//从用户检索行
while(用户\u curs.next()){
int lv___id=users_curs.getInt(“u_id”);
String lv___name=users_curs.getString(“u_name”);
uinfo_sel.setInt(1,lv__id);
uinfo_curs=uinfo_sel.executeQuery();
//从UINFO中检索相对于用户的数据
String lv_ui_info=uinfo_curs.getString(“ui_info”);
String lv_ui_extra=uinfo_curs.getString(“ui_extra”);
//在这些数组中存储所需的数据
列表id.添加(lv\u\u id);
列表名称。添加(lv名称);
列表信息。添加(lv\U ui\U信息);
列表额外。添加(lv额外);
}
}捕获(SQLException日志){
//一切都坏了
}
//确保它有效
System.out.println(
列表\u id.get(0)+
列表\u名称。获取(0)+
列表信息获取(0)+
列表\u额外获取(0)
);
//使用任意行进行测试
System.out.println(
列表\u id.get(2)+
列出您的姓名。获取(5)+
列表信息获取(9)+
列出额外获得(14)
);
}
//单独编制报表=================
公共静态无效f_prepare(){
字符串lv_sql=null;
试一试{
lv_sql=“从您id>=”的用户中选择*”
用户选择=gv连接准备状态(lv\U sql);
lv_sql=“从uinfo中选择*,其中ui__id=?”
uinfo_sel=gv_连接准备声明(lv_sql)
}捕获(SQLException日志){
//它不会失败,因为我相信
}
}
}
DBConn类{
//连接到SQLite3代码
}
所有这些代码都是有效的,我可以一次访问数据库,获取我需要的所有数据,将其存储在变量中,然后根据我的喜好使用它们。但是,这感觉不太正确,我认为在Java中,考虑到我在Informix-4GL中只需要15行代码就可以做到这一点,这远远不是最适合的方法


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

您的代码实际上非常接近box stock 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);
}
公共类列表项{
整数id;
字符串名;
整数信息;
额外的字符串;
…省略了构造函数和setter/getter…
}
列表项=新建ArrayList();
…
while(curs.next()){
ListItem=新建ListItem();
item.setId(curs.getInt(1));
item.setName(curs.getString(2));
item.setInfo(curs.getInfo(3));
item.setExtra(curs.getString(4));
项目。添加(项目);
}

这是一个更为惯用的方法,当然也不涉及使DB访问更容易的几个框架和库。

为了有效地使用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();
List List=new ArrayList();
试一试{
用户选择设置(1,1);
users\u curs=users\u sel.executeQuery();
//从用户检索行
while(用户\u curs.next()){
int lv___id=users_curs.getInt(“u_id”);
String lv___name=users_curs.getString(“u_name”);
uinfo_sel.setInt(1,lv__id);
uinfo_curs=uinfo_sel.executeQuery();
//从UINFO中检索相对于用户的数据
String lv_ui_info=uinfo_curs.getString(“ui_info”);
String lv_ui_extra=uinfo_curs.getString(“ui_extra”);
用户用户=新用户(lv\u\u id、lv\u\u名称、lv\u ui\u信息、lv\u ui\u额外);
//存储数据
列表。添加(用户);
}
}捕获(SQLException日志){
//一切都坏了
}
//确保它有效
list.get(0.print();
这不一定解决行数问题。大多数使用Java的人都这样做