一个存实体的list集合,根据实体的三个属性查询数据库,希望将这三个属性存到map中,每200条执行一次批量查询,代码实现
时间: 2024-03-17 08:46:21 浏览: 159
mybatis 批量将list数据插入到数据库的实现
好的,我可以给出一个Java代码的示例,假设实体类为`Entity`,三个属性分别为`prop1`、`prop2`和`prop3`,数据库表名为`table_name`:
```java
// 存储实体的list集合
List<Entity> entityList = new ArrayList<>();
// 存储实体属性的map
Map<String, Entity> entityMap = new HashMap<>();
// 批量查询的大小
int batchSize = 200;
// 遍历存储实体的list集合,将实体对象按照属性组成的字符串作为key,存入map中
for (Entity entity : entityList) {
String key = entity.getProp1() + "-" + entity.getProp2() + "-" + entity.getProp3();
entityMap.put(key, entity);
// 当map中的实体数量达到batchSize时,进行批量查询
if (entityMap.size() == batchSize) {
// 拼接SQL语句,使用IN语句查询对应的实体
String sql = "SELECT * FROM table_name WHERE (prop1, prop2, prop3) IN (";
List<String> keyList = new ArrayList<>(entityMap.keySet());
for (int i = 0; i < keyList.size(); i++) {
sql += "(?, ?, ?)";
if (i < keyList.size() - 1) {
sql += ",";
}
}
sql += ")";
// 执行批量查询
PreparedStatement ps = conn.prepareStatement(sql);
int index = 1;
for (String k : keyList) {
String[] props = k.split("-");
ps.setString(index++, props[0]);
ps.setString(index++, props[1]);
ps.setString(index++, props[2]);
}
ResultSet rs = ps.executeQuery();
while (rs.next()) {
String key = rs.getString("prop1") + "-" + rs.getString("prop2") + "-" + rs.getString("prop3");
Entity entity = entityMap.get(key);
// 更新实体对象的其他属性
entity.setOtherProp1(rs.getString("other_prop1"));
entity.setOtherProp2(rs.getString("other_prop2"));
// ...
}
rs.close();
ps.close();
// 清空map
entityMap.clear();
}
}
// 注意,最后还要进行一次批量查询,以确保所有的实体都被查询到
if (!entityMap.isEmpty()) {
// 拼接SQL语句,使用IN语句查询对应的实体
String sql = "SELECT * FROM table_name WHERE (prop1, prop2, prop3) IN (";
List<String> keyList = new ArrayList<>(entityMap.keySet());
for (int i = 0; i < keyList.size(); i++) {
sql += "(?, ?, ?)";
if (i < keyList.size() - 1) {
sql += ",";
}
}
sql += ")";
// 执行批量查询
PreparedStatement ps = conn.prepareStatement(sql);
int index = 1;
for (String k : keyList) {
String[] props = k.split("-");
ps.setString(index++, props[0]);
ps.setString(index++, props[1]);
ps.setString(index++, props[2]);
}
ResultSet rs = ps.executeQuery();
while (rs.next()) {
String key = rs.getString("prop1") + "-" + rs.getString("prop2") + "-" + rs.getString("prop3");
Entity entity = entityMap.get(key);
// 更新实体对象的其他属性
entity.setOtherProp1(rs.getString("other_prop1"));
entity.setOtherProp2(rs.getString("other_prop2"));
// ...
}
rs.close();
ps.close();
// 清空map
entityMap.clear();
}
```
这段代码中使用了`PreparedStatement`和`ResultSet`来进行批量查询和结果获取,可以避免SQL注入和结果集的处理。需要注意的是,最后还要进行一次批量查询,以确保所有的实体都被查询到。
阅读全文