List<Map<String, Object>> whereQuery = new ArrayList<>(); Map<String, Object> map = new HashMap<>(); map.put("column", "owner_code"); map.put("operator", "="); map.put("value", logisticsAccount.getExt1()); Map<String, Object> map1 = new HashMap<>(); map1.put("column", "base_code"); map1.put("operator", "="); map1.put("value", "101"); Map<String, Object> map2 = new HashMap<>(); map2.put("column", "shipment_date"); map2.put("operator", "="); map2.put("value", "20200725"); Map<String, Object> map3 = new HashMap<>(); map3.put("column", "actual_sent_flag"); map3.put("operator", "="); map3.put("value", 2); whereQuery.add(map); whereQuery.add(map1); whereQuery.add(map2); whereQuery.add(map3); request.put("where_query", whereQuery);怎么去优化
时间: 2024-04-27 07:20:58 浏览: 10
这段代码主要是对查询条件进行封装,其中包含多个 Map 对象。优化可以从以下几个方面考虑:
1. 对于相同类型的查询条件,可以将其封装成一个对象,避免重复代码。例如,可以创建一个 QueryCondition 类,包含 column、operator、value 三个属性,并提供相应的 getter 和 setter 方法。
2. 为了提高代码的可读性和可维护性,可以将查询条件的封装操作单独提取出来,封装成一个方法,将 whereQuery 的构造过程放到该方法中。这样可以减少代码的重复性,提高代码的可复用性。
3. 如果查询条件中的值是变量,而不是固定的常量,可以将其封装成一个对象,并提供相应的 getter 和 setter 方法。这样可以方便地修改查询条件,提高代码的灵活性。
4. 如果查询条件比较复杂,可以考虑使用框架提供的查询语句构建器,例如 Hibernate Criteria API 或 MyBatis 的动态 SQL。这样可以避免手动拼接 SQL 语句,提高代码的可读性和可维护性。
相关问题
将sql改成jdbctemplete方式查询 List<List<String>> assetscardcodeQueryList = new ArrayList<>(); ArrayList<String> query1 = new ArrayList<>(); ArrayList<String> query2 = new ArrayList<>(); query1.add("000000009247"); query2.add("000000009247"); assetscardcodeQueryList.add(query1); assetscardcodeQueryList.add(query2); List<List<String>> assetscardcodeAndBukrsQueryList = new ArrayList<>(); ArrayList<String> query3 = new ArrayList<>(); query3.add("400000001644"); query3.add("A017"); query3.add("400000001641"); query3.add("A017"); String sql="select * from table where (cloum1,cloum2) in (( 'A017', '400000001644'), ('A017', '400000001641')) or cloum1 in ('000000009247','000000009247');"
下面是将这个SQL查询改成使用JdbcTemplate执行的代码:
```
List<List<String>> assetscardcodeQueryList = new ArrayList<>();
ArrayList<String> query1 = new ArrayList<>();
ArrayList<String> query2 = new ArrayList<>();
query1.add("000000009247");
query2.add("000000009247");
assetscardcodeQueryList.add(query1);
assetscardcodeQueryList.add(query2);
List<List<String>> assetscardcodeAndBukrsQueryList = new ArrayList<>();
ArrayList<String> query3 = new ArrayList<>();
query3.add("400000001644");
query3.add("A017");
query3.add("400000001641");
query3.add("A017");
String sql = "select * from table where (cloum1,cloum2) in " +
"(?, ?)" + ", ".repeat(assetscardcodeAndBukrsQueryList.size() - 1) + "or cloum1 in " +
"(?" + ", ?".repeat(assetscardcodeQueryList.size() - 1) + ")";
List<Object> params = new ArrayList<>();
for (List<String> cloumPair : assetscardcodeAndBukrsQueryList) {
params.addAll(cloumPair);
}
params.addAll(assetscardcodeQueryList.stream().flatMap(Collection::stream).collect(Collectors.toList()));
List<Map<String, Object>> rows = jdbcTemplate.query(sql, params.toArray(), new RowMapper<Map<String, Object>>() {
@Override
public Map<String, Object> mapRow(ResultSet rs, int rowNum) throws SQLException {
ResultSetMetaData meta = rs.getMetaData();
Map<String, Object> row = new HashMap<>();
for (int i = 1; i <= meta.getColumnCount(); i++) {
row.put(meta.getColumnName(i), rs.getObject(i));
}
return row;
}
});
// 处理查询结果
for (Map<String, Object> row : rows) {
// do something
}
```
这里使用了与前面相同的动态生成SQL语句和参数设置方式,只是将参数列表改成了从Java对象中获取。最终,该方法将返回一个包含查询结果的列表,每个结果都是一个Map对象,其中包含列名和对应的值。你可以根据需要处理该结果集。
boolean exists = false; for (Map<String, Object> exist : jxMjKhTxService.query(current)) { if (exist.get("jsbh").equals(current.get("jsbh")) && exist.get("sm").equals(current.get("sm")) && exist.get("code").equals(current.get("code")) ) { exists = true; break; } } if (!exists) { toBeInserted.add(current); } querry 方法怎么写
根据代码中的 `jxMjKhTxService.query(current)`,看起来是使用某个服务类的 `query` 方法来查询数据的。这个方法应该会返回一个 `List<Map<String, Object>>` 类型的结果。具体实现会因为具体的服务类而异,但是一般的思路是通过数据库等持久化存储方式来查询数据。
如果你需要手写一个类似的查询方法,可以参考以下代码:
```java
public List<Map<String, Object>> query(Map<String, Object> conditions) {
// 假设该方法使用 JDBC 进行查询数据库
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
List<Map<String, Object>> results = new ArrayList<>();
try {
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "myuser", "mypassword");
StringBuilder sql = new StringBuilder("SELECT * FROM mytable WHERE 1=1");
List<Object> params = new ArrayList<>();
for (Map.Entry<String, Object> entry : conditions.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
if (value != null) {
sql.append(" AND ").append(key).append("=?");
params.add(value);
}
}
stmt = conn.prepareStatement(sql.toString());
for (int i = 0; i < params.size(); i++) {
stmt.setObject(i + 1, params.get(i));
}
rs = stmt.executeQuery();
ResultSetMetaData meta = rs.getMetaData();
int columnCount = meta.getColumnCount();
while (rs.next()) {
Map<String, Object> row = new HashMap<>();
for (int i = 1; i <= columnCount; i++) {
String columnName = meta.getColumnName(i);
Object value = rs.getObject(i);
row.put(columnName, value);
}
results.add(row);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return results;
}
```
上述代码是一个简单的使用 JDBC 进行查询的示例。其中,`conditions` 是一个 `Map<String, Object>` 类型的参数,用于指定查询条件。这个方法会根据 `conditions` 中的键值对来构造 SQL 语句,并通过 JDBC 执行查询操作。最终将查询结果封装成一个 `List<Map<String, Object>>` 类型的对象返回。