StringBuilder hql = new StringBuilder(); Map<String, Object> param = new HashMap<String, Object>(); hql.append("UPDATE smsserver_out SET status = 'Z' WHERE status IN ('U', 'Q') "); if (Strings.isNotBlank(affairId)){ hql.append(" and user_id =:affairId"); param.put("affairId",affairId); }检测这段代码可能出现的问题并改善
时间: 2024-01-23 15:03:44 浏览: 244
这段代码的问题在于没有考虑到`affairId`可能为`null`或空字符串的情况,这会导致SQL语句出错。同时,使用了字符串拼接的方式构造SQL语句,容易受到SQL注入攻击。
以下是改善后的代码:
```java
StringBuilder hql = new StringBuilder();
Map<String, Object> param = new HashMap<String, Object>();
hql.append("UPDATE smsserver_out SET status = 'Z' WHERE status IN ('U', 'Q')");
if (StringUtils.isNotBlank(affairId)) {
hql.append(" AND user_id = :affairId");
param.put("affairId", affairId);
} else {
hql.append(" AND user_id IS NULL");
}
try (Session session = sessionFactory.openSession()) {
Transaction tx = session.beginTransaction();
Query query = session.createQuery(hql.toString());
for (Map.Entry<String, Object> entry : param.entrySet()) {
query.setParameter(entry.getKey(), entry.getValue());
}
query.executeUpdate();
tx.commit();
}
```
改善后的代码使用了`org.hibernate.Session`来执行SQL语句,避免了SQL注入攻击。同时,使用了try-with-resource语句来自动关闭`Session`,减少了代码的冗余。在构造SQL语句时,使用了`org.apache.commons.lang3.StringUtils.isNotBlank()`方法来判断`affairId`是否为空或null,避免了出现SQL语句错误的情况。
阅读全文