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")));
}
}
我正忙于在 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")));
}
}