سؤال

وأنا أخطط لتحل محل الأشياء بيان تنفيذها مرارا وتكرارا مع كائنات PreparedStatement لتحسين الأداء. أنا باستخدام الوسائط مثل وظيفة 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():

وينتج قرأه مزود يشبه:

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 الخاص بك، ثم استخدام <لأ href = "http://java.sun.com/j2se/1.5.0/docs/api/java/sql/PreparedStatement.html" يختلط = "noreferrer نوفولو"> PreparedStatement .

إذا كنت استدعاء الإجراءات المخزنة التي تم تحميلها على الخادم SQL الخاص بك، ثم استخدام <لأ href = "http://java.sun.com/j2se/1.5.0/docs/api/java/sql/CallableStatement. أتش تي أم أل "يختلط =" نوفولو noreferrer "> CallableStatement .

واستخدم علامات سؤال عن النائبة لمعلمات وظيفة / الإجراء الذي يتم تمرير والقيم عودة وظيفة التي تتلقاها.

ولقد وضعت وظيفة تسمح لك باستخدام المعلمات المسماة في استعلامات SQL الخاصة بك:

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;
    }

ويمكنك استخدامه بهذه الطريقة:

Map<String, Object> pars = new HashMap<>();
pars.put("name", "O'Really");
String sql = "SELECT * FROM TABLE WHERE NAME = :name";
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top