如何将字符连接到preparedstatement中的SQL字符串

时间:2013-11-27 08:39:27

标签: java sql

当我连接一个字符即tid时 在Java中使用此字符串。我会得到 其中sc.CategoryCode = C. 但我确实需要 其中sc.CategoryCode ='C' 当我在开始时添加单引号时 并在tid的末尾 喜欢 其中sc.CategoryCode ='“+ tid +”'“; 我去拿 其中sc.CategoryCode ='C“ 这看起来很奇怪。 谢谢 千斤顶

String str = "select sc.* from SubCategory sc"
           + "  where sc.CategoryCode = " + tid;

2 个答案:

答案 0 :(得分:5)

你不应该像这样建立你的SQL - 你应该使用参数化的SQL:

// TODO: Closing the statement etc
String sql = "select sc.* from SubCategory sc where sc.CategoryCode = ?";
PreparedStatement statement = conn.prepareStatement(sql);
statement.setString(tid); // Or statement.setString(String.valueOf(tid))
ResultSet results = statement.executeQuery();

使用参数化SQL的原因:

  • 避免SQL injection attacks
  • 避免不必要的(也可能是有问题的)转化,特别是日期/时间
  • 保持代码(SQL)与数据(参数)分开,这有助于提高可读性

答案 1 :(得分:0)

我不知道你是否正在使用jdbc模板...我给你发了一个例子。

选择:

private static final String SELECT_SANCIONS_GIM = "SELECT * " + "FROM "
            + Constants.T_GPT_V_DETALL_SANCIO_GIM + " WHERE "
            + Constants.EXP_ID_ENS + " =:idEns" + " AND " + Constants.EXP_ANY_EXP
            + " =:anyExp" + " AND " + Constants.EXP_NUM_EXP + " =:numExp" + " AND "
            + Constants.ACRONIM_EXP + " =:acr";

// =:变量

我使用Stringbuilder,看看:

StringBuilder sql = new StringBuilder();
sql.append(SELECT_SANCIONS_GIM);
MapSqlParameterSource parameters = new MapSqlParameterSource();           

    parameters.addValue("idEns",clauExpedient.getIdEns() );
    parameters.addValue("anyExp",clauExpedient.getAnyExp());
    parameters.addValue("numExp",clauExpedient.getNumExp() );
    parameters.addValue("acr", clauExpedient.getAcrProcediment());

我希望它有所帮助。