Java阵列记录解决方案

时间:2015-03-16 14:43:04

标签: java arrays storage

我忙于用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中做一些similair的推荐方法,是否可以将数据存储在Java等效的动态记录数组中,然后使用某种形式的标识符从中选择数据?

以下是我在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中重新创建的功能。

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

2 个答案:

答案 0 :(得分: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")));
    }
}

答案 1 :(得分:0)

使用HashMap。它基本上是一个字典,按键排列,...无论你想要什么,它都是一个键值存储,你可以选择你的密钥。 HashMap具有O(1)个操作(理论上)并禁止重复键。享受。