البرمجة

استرجاع البيانات باستخدام PreparedStatement

في البداية، يبدو أنك ترغب في استرجاع نتائج استعلام SQL كخريطة (Map)، حيث يتكون كل مفتاح من رمز (code) وكل قيمة من قيمة مرتبطة به. في الكود الذي قدمته، تستخدم استعلام SQL مع جملة IN لاسترجاع البيانات التي تتطابق مع قيم في قائمة nameCodesString.

لتحقيق الهدف الذي ترغب فيه، يمكنك استخدام هيكل البيانات Map لتخزين النتائج بعد الاستعلام. يمكنك استخدام HashMap لهذا الغرض، حيث يمكنك استخدام قيمة الرمز كمفتاح وقيمة القيمة كقيمة في الخريطة.

ومن ثم، يمكنك تنفيذ الاستعلام ومعالجة النتائج مباشرة داخل حلقة الـ while ووضع النتائج في الخريطة.

إليك كيف يمكن تطبيق ذلك:

java
import java.util.HashMap; import java.util.Map; // قم بإنشاء خريطة لتخزين النتائج Map resultMap = new HashMap<>(); try (PreparedStatement stmt = conn.prepareStatement( "SELECT n.CODE, l.VALUE " + "FROM TNAME n JOIN TPROPERTIES l ON n.UIDPK = l.OBJECT_UID " + "WHERE n.CODE IN (" + nameCodesString + ")")) { try (ResultSet rs = stmt.executeQuery()) { while (rs.next()) { // استخراج البيانات من النتيجة String nameCode = rs.getString(1); String displayName = rs.getString(2); // وضع البيانات في الخريطة resultMap.put(nameCode, displayName); } } } // الآن لديك خريطة تحتوي على النتائج // يمكنك استخدامها بحرية للوصول إلى القيم باستخدام الرموز كمفاتيح

هكذا، بعد تنفيذ الاستعلام، ستكون لديك خريطة resultMap تحتوي على البيانات التي قمت باسترجاعها، حيث يمكنك استخدام الرموز كمفاتيح للوصول إلى القيم المرتبطة بها.

بهذه الطريقة، يتم الحصول على النتائج المرغوبة بفعالية وباستخدام اتصال واحد بقاعدة البيانات.

المزيد من المعلومات

بالطبع، دعنا نكمل المقال بمزيد من التفاصيل والشروحات حول كيفية تحقيق هذا الهدف بطريقة فعالة وآمنة.

في الكود السابق، قمنا بتنفيذ الاستعلام SQL ومعالجة النتائج داخل حلقة while، ثم وضع البيانات في خريطة resultMap. ولكن هناك بعض النقاط التي يجب أخذها في الاعتبار لضمان الكفاءة والأمان في التطبيق.

  1. تجنب استخدام تعبيرات SQL مباشرة في الاستعلام:
    في الكود السابق، لاحظت أننا قمنا بدمج قيمة nameCodesString مباشرة في الاستعلام SQL. هذا يمكن أن يتسبب في ثغرات أمنية محتملة مثل هجمات حقن SQL (SQL injection). لتجنب ذلك، يُفضل استخدام معلمات مُرتبطة (prepared statements) في الاستعلامات.

  2. استخدام Prepared Statements:
    يجب تحويل الاستعلام إلى استعلام مُعدَّ استعداد (prepared statement) باستخدام معلمات مُرتبطة. هذا يساعد في تجنب هجمات حقن SQL ويزيد من أمان التطبيق.

  3. إغلاق الموارد بشكل صحيح:
    لضمان تحرير الموارد بشكل صحيح وتجنب تسريب الذاكرة، يجب أن نتأكد من إغلاق كل من PreparedStatement و ResultSet في كتلة finally.

  4. التعامل مع الأخطاء:
    يجب تضمين آليات لمعالجة الأخطاء والاستثناءات في التطبيق. يمكن أن تحدث أخطاء في الاتصال بقاعدة البيانات أو في تنفيذ الاستعلام، ويجب التعامل معها بشكل مناسب داخل التطبيق.

لنقم بتحديث الكود ليتماشى مع هذه النقاط:

java
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; public class RetrieveData { public Map retrieveData(Connection conn, List nameCodes) throws SQLException { Map resultMap = new HashMap<>(); PreparedStatement stmt = null; ResultSet rs = null; try { // استخدام prepared statement مع معلمات مُرتبطة String query = "SELECT n.CODE, l.VALUE " + "FROM TNAME n JOIN TPROPERTIES l ON n.UIDPK = l.OBJECT_UID " + "WHERE n.CODE IN (?"; for (int i = 1; i < nameCodes.size(); i++) { query += ", ?"; } query += ")"; stmt = conn.prepareStatement(query); // تعيين قيم المعلمات for (int i = 0; i < nameCodes.size(); i++) { stmt.setString(i + 1, nameCodes.get(i)); } rs = stmt.executeQuery(); // معالجة النتائج ووضعها في الخريطة while (rs.next()) { String nameCode = rs.getString(1); String displayName = rs.getString(2); resultMap.put(nameCode, displayName); } } finally { // إغلاق الموارد بشكل صحيح if (rs != null) { try { rs.close(); } catch (SQLException e) { // يمكنك معالجة الأخطاء هنا } } if (stmt != null) { try { stmt.close(); } catch (SQLException e) { // يمكنك معالجة الأخطاء هنا } } } return resultMap; } }

بهذا الشكل، تم تحسين الكود ليكون أكثر أمانًا وكفاءة، مع استخدام prepared statements، وإغلاق الموارد بشكل صحيح، والتعامل مع الأخطاء المحتملة.

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر