说我有两个表 :正在运行多个'select where id = ...'比运行单个'select where id in(...)'更糟?
ID ATTRIBUTE
------ -----------
1 'FOO'
2 'BAR'
4 'BIZZ'
ID ATTRIBUTE2
------ -----------
1 'FOO2'
2 'BAR2'
3 'BIZZ2'
现在我想获取所有这些属性。我有两种方法可以做到这一点,我可以一次查询两个表,一个ID,或者我可以查询两个表中的所有ID,并通过结果集提取属性。
选项1:
List<MyObj> myObjs = new ArrayList<MyObj>();
for (int i = 1; i<5; i++)
{
String sql1 = "select attribute from table1 where id = ?";
String sql2 = "select attribute2 from table2 where id = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, i);
PreparedStatement ps2 = conn.prepareStatement(sql2);
ps2.setInt(1,i);
ResultSet rs1 = ps.executeQuery();
ResultSet rs2 = ps2.executeQuery();
myObjs.add(new MyObj(i, rs1.getString("attribute1"), rs2.getString("attribute2"));
//No null handling but.
}
选项2:
String sql1 = "select id, attribute from table1 where id in (?)";
String sql2 = "select id, attribute2 from table2 where id in (?)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setArray(1, new ArrayList<Integer>(1,2,3,4,5);
PreparedStatement ps2 = conn.prepareStatement(sql2);
ps2.setArray(1, new ArrayList<Integer>(1,2,3,4,5);
ResultSet rs1 = ps.executeQuery();
ResultSet rs2 = ps2.executeQuery();
Hashmap<Integer,MyObj> myObjs = new HashMap<Integer, MyObj>();
while (rs.next())
{
myOjbs.add(rs.getInt("id")), new MyObj(rs.getInt("id"), rs.getString("attribute")));
}
while (rs2.next())
{
myObjs.get(rs2.getInt("id")).setAttribute2(rs2.getString("attribute2"))
}
选项1似乎用于处理场景中的一个属性可能会丢失简单得多。但是,重复的SQL调用可能会重复数百万次。选项2的SQL调用较少,但需要处理列表可能不同步的情况。
问题是 - 这些解决方案之一显然是错的吗?