Java 记录数组解决方案

Java Array Of Record Solution

我正忙于在 Java 中重写一个 Informix-4GL 程序,我在从数据库中检索数据时遇到了一些问题。

目前我正在使用 SQLite3 进行测试,我正在从 windows 命令行编译和执行我的代码(此时不使用任何 IDE)。

我遇到的问题是我太习惯使用 Informix-4GL 动态记录数组,如下所示:

dataArray dynamic array of record
   data_id     integer,
   data_name   char(15),
   data_desc   char(15)
end record

我可以随意填充,然后使用

检索数据(例如插入的第三行)
display dataArray[3].data_id

我想知道在 Java 中做类似事情的推荐方法,是否可以将数据存储在 Java 等同于动态记录数组然后 select 使用某种形式的标识符从中获取数据?

以下是我在 Informix-4GL 中的做法,以使其更清晰

main

   define

      lv_string string,                   # general variables
      lv_cnt integer,
      lr_table record like table.*,

      dataArray dynamic array of record   # the values I am storing in array
         data_id     integer,
         data_name   char(15),
         data_desc   char(15)
      end record

   let lv_string = "select * from table ",   # prepared statement 01
                   "where 1=1"
   prepare data_prep from lv_string
   declare data_curs cursor for data_prep

   let lv_string = "select * from table02 ",   # prepared statement 01
                   "where id = ?"
   prepare data02_prep from lv_string

   let lv_cnt = 0

   foreach data_curs into lr_table.*   # loop through sql return results

      let lv_cnt =  lv_cnt + 1

      let dataArray[lv_cnt].data_id = lr_table.id       # store variables
      let dataArray[lv_cnt].data_name = lr_table.name

      execute data02_prep using lr_table.id             # store variables from
         into dataArray[lv_cnt].data_desc               # different table

   end foreach

   if dataArray.getLength() = 5 then         # use the data I have stored
      display "there are 5 rows in here"
   end if

   if dataArray.getLength() = 17 then        # very flexible
      display dataArray[5].data_id,
              dataArray[9].data_name
              dataArray[14].data_desc
   end if

end main

这不是实际的程序,但我只是采用了我想在 java 中重新创建的功能。

这有什么好处是我可以查询数据库一次并关闭连接,我不需要在整个程序期间再次查询数据库。

使用HashMap。它基本上是一个字典,一个键数组,...无论你想怎么称呼它,它都是一个键值存储,你可以在其中选择你的键。 HashMap 具有 O(1) 操作(理论上)并禁止重复键。享受。

我认为在您的情况下,使用 ArrayList 要容易得多。例子

public class Sample {
    List<Data> datas = new ArrayList<Data>();

    datas.add(new Data("1", "2" ,"3"));
    datas.add(new Data("4", "5" ,"6"));

    datas.get(0); // should give you the first data
}

class Data {
    Object id,name,desc;
    Data(Object id, Object name, Object desc) {
        this.id = id;
        this.name = name;
        this.desc = desc;
    }
}

顺便说一下,我认为你在 HashMap 上遇到的问题(你说的被覆盖的那个)是因为你没有覆盖 equal 和 hashcode 方法,因为这两种方法用于将对象放入 HashMap。

希望这对你有帮助:D

=============

假设您的行变量指的是 ResultSet,那么您可以这样做。

public void doFill(ResultSet row) {
    while(row.next()) {
        datas.add(new Data(row.getObject("id"), row.getObject("name"), row.getObject("desc")));
    }
}