Java的PreparedStatement如何工作?

我计划用PreparedStatement对象替换重复执行的Statement对象以提高性能。 我正在使用像MySQL函数now()和字符串变量这样的参数。

我见过的大多数PreparedStatement查询包含常量值(如10 ,字符串如"New York" )作为参数用于? 在查询中。 我将如何使用now()等函数和变量作为参数? 是否有必要使用? s在查询而不是实际值? 我很困惑。

如果你有变量使用’?’

 int temp = 75; PreparedStatement pstmt = con.prepareStatement( "UPDATE test SET num = ?, due = now() "); pstmt.setInt(1, temp); pstmt.executeUpdate(): 

生成一个sql语句,如下所示:

 UPDATE test SET num = 75, due = now(); 

如果你有一个来自用户输入的变量,你必须使用? 而不是连接字符串。 用户可能会恶意输入字符串,如果将字符串直接放入SQL,它可以运行您不想要的命令。

我意识到这个被过度使用,但它完美地说:

小鲍比表

您不必在PreparedStatement中使用占位符。 就像是:

 PreparedStatement stmt = con.prepareStatement("select sysdate from dual"); 

会工作得很好。 但是,您不能使用占位符,然后将函数调用绑定到它。 这样的东西不能用来调用sysdate函数:

 PreparedStatement stmt = con.prepareStatement("select ? from dual"); stmt.setSomethingOrOther(1, "sysdate"); 

如果要调用SQL Server的内置函数,请使用PreparedStatement 。

如果要调用已加载到SQL Server上的存储过程,请使用CallableStatement 。

使用问号作为您传递的函数/过程参数的占位符以及您正在接收的函数返回值。

我开发了一个函数,允许您在SQL查询中使用命名参数:

 private PreparedStatement generatePreparedStatement(String query, Map parameters) throws DatabaseException { String paramKey = ""; Object paramValue = null; PreparedStatement statement = null; Pattern paramRegex = null; Matcher paramMatcher = null; int paramIndex = 1; try { //Create the condition paramRegex = Pattern.compile("(:[\\d\\w_-]+)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE); paramMatcher = paramRegex.matcher(query); statement = this.m_Connection.prepareStatement(paramMatcher.replaceAll("?"), ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, ResultSet.HOLD_CURSORS_OVER_COMMIT); //Check if there are parameters paramMatcher = paramRegex.matcher(query); while (paramMatcher.find()) { paramKey = paramMatcher.group().substring(1); if(parameters != null && parameters.containsKey(paramKey)) { //Add the parameter paramValue = parameters.get(paramKey); if (paramValue instanceof Date) { statement.setDate(paramIndex, (java.sql.Date)paramValue); } else if (paramValue instanceof Double) { statement.setDouble(paramIndex, (Double)paramValue); } else if (paramValue instanceof Long) { statement.setLong(paramIndex, (Long)paramValue); } else if (paramValue instanceof Integer) { statement.setInt(paramIndex, (Integer)paramValue); } else if (paramValue instanceof Boolean) { statement.setBoolean(paramIndex, (Boolean)paramValue); } else { statement.setString(paramIndex, paramValue.toString()); } } else { throw new DatabaseException("The parameter '" + paramKey + "' doesn't exists in the filter '" + query + "'"); } paramIndex++; } } catch (SQLException l_ex) { throw new DatabaseException(tag.lib.common.ExceptionUtils.getFullMessage(l_ex)); } return statement; } 

你可以这样使用它:

 Map pars = new HashMap<>(); pars.put("name", "O'Really"); String sql = "SELECT * FROM TABLE WHERE NAME = :name";