Frage

Ich plane wiederholt ausgeführt Statement-Objekte mit PreparedStatement Objekten zu ersetzen Leistung zu verbessern. Ich verwende Argumente wie die MySQL-Funktion now() und String-Variablen.

Die meisten der PreparedStatement Abfragen ich konstante Werte enthalten gesehen haben (wie 10 und Strings wie "New York") als Argumente für die ? in den Abfragen verwendet. Wie würde ich mich über Funktionen wie now() und Variablen als Argumente verwenden? Ist es notwendig, die ?s in den Abfragen anstelle von Istwerten zu benutzen? Ich bin ganz verwünscht.

War es hilfreich?

Lösung

Wenn Sie Variablen verwenden, um die '?'

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

Erzeugt eine SQL-Anweisung, die wie folgt aussieht:

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

Andere Tipps

Wenn Sie eine Variable, die aus Benutzereingaben kommen, ist es wichtig, dass Sie das verwenden? anstatt die Saiten verketten. Benutzer können eine Zeichenfolge eingeben böswillig, und wenn Sie die Zeichenfolge direkt in SQL-Drop kann es einen Befehl ausführen Sie hatte nicht die Absicht.

Ich weiß, das ist überstrapaziert, aber es sagt, es ist perfekt:

Little Bobby Tables

Sie müssen keine Platzhalter in einem PreparedStatement verwenden. So etwas wie:

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

würde gut funktionieren. Sie können jedoch nicht einen Platzhalter verwenden und dann einen Funktionsaufruf, um es binden. So etwas kann nicht verwendet werden, um die sysdate Funktion aufzurufen:

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

Wenn Sie in Funktionen des SQL Server aufgebaut rufen Sie dann mit PreparedStatement .

Wenn Sie gespeicherte Prozeduren aufrufen, die auf Ihren SQL-Server geladen wurden dann a href verwenden <= "http://java.sun.com/j2se/1.5.0/docs/api/java/sql/CallableStatement. html“rel = "nofollow noreferrer"> Callablestatement .

Verwenden Fragezeichen als Platzhalter für Funktion / Prozedur Parameter, die Sie übergeben und Rückgabewerte von Funktionen Sie empfangen.

Ich habe eine Funktion entwickelt, die Sie benannte Parameter in SQL-Abfragen verwenden kann:

private PreparedStatement generatePreparedStatement(String query, Map<String, Object> 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;
    }

Sie können es auf diese Weise verwendet werden:

Map<String, Object> pars = new HashMap<>();
pars.put("name", "O'Really");
String sql = "SELECT * FROM TABLE WHERE NAME = :name";
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top