首页 > 解决方案 > 我们可以替换Java中字符串中开头和结尾都有符号的部分来识别吗?

问题描述

我有一个字符串 SELECT *FROM USERS WHERE ID = '@userid@' AND ROLE = '@role@' 现在我已经用实际值替换了 @...@ 之间的任何字符串。

预期产出SELECT *FROM USERS WHERE ID = '4' AND ROLE = 'Admin'

这个替换将通过一个方法发生,我已经写了这个逻辑

public String replaceQueryKeyWithValueFromKeyValues(String query, int reportId) {
    try {
        REPMReportDao repmReportDao = new REPMReportDao();
        int Start = 0;
        int end;
        if (query.contains("@")) {
            boolean specialSymbolFound = false;
            for (int i = 0; i < query.length(); i++) {
                if (query.charAt(i) == '@') {
                    if (!specialSymbolFound) {
                        Start = i + 1;
                        specialSymbolFound = true;
                    } else {
                        specialSymbolFound = false;
                        end = i;
                        query = query.replace(query.substring(Start - 1, end + 1), repmReportDao.getReportManagerKeyValue(query.substring(Start - 1, end + 1).replaceAll("@", ""), reportId));

                    }
                }
            }
            return query;
        } else {
            return query;
        }

    } catch (Exception e) {
        logger.log(Priority.ERROR, e.getMessage());
        return e.getMessage();
    }
}

它工作正常,但如果存在单个“@”符号而不是开始和结束,它将失败。喜欢 :

SELECT  *FROM USERS WHERE emailid = 'xyz@gmail.com' AND ROLE = '@role@'

在这里,它应该替换唯一的角色“@role@”,并且应该保留电子邮件原样。

预期输出 =>SELECT *FROM USERS WHERE emailid = 'xyz@gmail.com' AND ROLE = 'Admin'

标签: javasqljdbctemplatenamed-parameters

解决方案


使用字符串替换来生成数据库查询被认为是非常糟糕的做法,因为您的代码容易受到 SQL 注入攻击。我无法从您提供的小代码示例中看出,但绝大多数大型 Java 项目都使用Spring Framework,它允许您使用JdbcTemplate或(我的偏好)NamedParameterJdbcTemplate。两者都允许您以安全的方式替换变量。


推荐阅读