JDBC

يمكن لبرمجة التطبيقات الاتصال بقواعد بيانات خارجية من خلال خدمة JDBC، وهي برنامج يتضمّن تقنية اتصال قاعدة بيانات Java العادية. تدعم خدمة JDBC Google Cloud SQL لـ MySQL وMySQL وMicrosoft SQL Server وقواعد بيانات Oracle.

لتحديث قاعدة بيانات خارجية باستخدام JDBC، يجب أن يفتح النص البرمجي اتصالاً بقاعدة البيانات ثم يقوم بإجراء التغييرات عن طريق إرسال عبارات SQL.

قواعد بيانات Google Cloud SQL

تتيح لك خدمة Google Cloud SQL إنشاء قواعد بيانات ارتباطية مباشرة في السحابة الإلكترونية من Google. يُرجى العلم أنّ خدمة Cloud SQL قد تفرض رسومًا بناءً على استخدامك.

يمكنك إنشاء مثيل Google Cloud SQL باتّباع الخطوات الواردة في البدء السريع لخدمة Cloud SQL.

إنشاء اتصالات Google Cloud SQL

هناك طريقتان لإنشاء اتصال بقاعدة بيانات Google Cloud SQL باستخدام خدمة JDBC من "برمجة التطبيقات":

يتم شرح هذه الطرق أدناه. كلاهما صالح، لكن الطريقة الثانية تتطلب منك تفويض مجموعة من نطاقات IP للوصول إلى قاعدة البيانات الخاصة بك.

تنشئ هذه الطريقة اتصالاً بمثيل Google Cloud SQL MySQL باستخدام الطريقة Jdbc.getCloudSqlConnection(url). يكون عنوان URL لقاعدة البيانات على الشكل jdbc:google:mysql://subname، حيث يشير subname إلى اسم اتصال المثيل الخاص بـ MySQL المدرج في صفحة نظرة عامة على مثيل Cloud SQL ضمن وحدة تحكُّم Google Cloud.

للاتصال بخادم Cloud SQL Server، يُرجى الاطّلاع على Jdbc.getConnection(url).

استخدام Jdbc.getConnection(url)

لاستخدام هذه الطريقة، يجب تفويض نطاقات عناوين IP معيّنة للتوجيه غير الفئوي بين النطاقات (CIDR) حتى تتمكن خوادم "برمجة تطبيقات Google" من الاتصال بقاعدة بياناتك. قبل تشغيل النص البرمجي، أكمل الخطوات التالية:

  1. في مثيل Google Cloud SQL، يمكنك تفويض نطاقات عناوين IP، واحدة تلو الأخرى من مصدر البيانات هذا.

  2. انسخ عنوان URL الذي تم تعيينه لقاعدة البيانات الخاصة بك؛ يجب أن يكون بالشكل jdbc:mysql:subname.

بعد السماح لنطاقات عناوين IP هذه، يمكنك إنشاء اتصالات بمثيل Google Cloud SQL باستخدام إحدى الطرق Jdbc.getConnection(url) وعنوان URL الذي نسخته أعلاه.

قواعد بيانات أخرى

إذا كان لديك بالفعل قاعدة بيانات MySQL أو Microsoft SQL Server أو Oracle، يمكنك الاتصال بها من خلال خدمة JDBC في "برمجة تطبيقات Google".

إنشاء اتصالات أخرى بقاعدة البيانات

لإنشاء اتصال قاعدة بيانات باستخدام خدمة JDBC في "برمجة تطبيقات Google"، يجب تفويض نطاقات عناوين IP من مصدر البيانات هذا في إعدادات قاعدة البيانات.

بعد وضع هذه القوائم المسموح بها، يمكنك إنشاء اتصال بقاعدة البيانات باستخدام إحدى طرق Jdbc.getConnection(url) وعنوان URL لقاعدة بياناتك.

نموذج التعليمات البرمجية

يفترض الرمز النموذجي أدناه أنك تتصل بقاعدة بيانات Google Cloud SQL، وينشئ اتصالات قاعدة بيانات باستخدام الطريقة Jdbc.getCloudSqlConnection(url). وبالنسبة إلى قواعد البيانات الأخرى، عليك استخدام الطريقة Jdbc.getConnection(url) لإنشاء اتصالات قاعدة البيانات.

للحصول على مزيد من المعلومات حول طرق JDBC، راجِع مستندات Java لـ JDBC.

إنشاء قاعدة بيانات ومستخدم وجدول

يستخدم معظم المطوّرين أداة سطر أوامر MySQL لإنشاء قواعد البيانات والمستخدمين والجداول. ومع ذلك، من الممكن فعل الشيء نفسه في "برمجة تطبيقات Google" كما هو موضّح أدناه. يُفضَّل إنشاء مستخدم آخر على الأقل حتى لا يكون من الضروري دائمًا ربط النص البرمجي بقاعدة البيانات باسم root.

service/jdbc.gs
/**
 * Create a new database within a Cloud SQL instance.
 */
function createDatabase() {
  try {
    const conn = Jdbc.getCloudSqlConnection(instanceUrl, root, rootPwd);
    conn.createStatement().execute('CREATE DATABASE ' + db);
  } catch (err) {
    // TODO(developer) - Handle exception from the API
    console.log('Failed with an error %s', err.message);
  }
}

/**
 * Create a new user for your database with full privileges.
 */
function createUser() {
  try {
    const conn = Jdbc.getCloudSqlConnection(dbUrl, root, rootPwd);

    const stmt = conn.prepareStatement('CREATE USER ? IDENTIFIED BY ?');
    stmt.setString(1, user);
    stmt.setString(2, userPwd);
    stmt.execute();

    conn.createStatement().execute('GRANT ALL ON `%`.* TO ' + user);
  } catch (err) {
    // TODO(developer) - Handle exception from the API
    console.log('Failed with an error %s', err.message);
  }
}

/**
 * Create a new table in the database.
 */
function createTable() {
  try {
    const conn = Jdbc.getCloudSqlConnection(dbUrl, user, userPwd);
    conn.createStatement().execute('CREATE TABLE entries ' +
      '(guestName VARCHAR(255), content VARCHAR(255), ' +
      'entryID INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(entryID));');
  } catch (err) {
    // TODO(developer) - Handle exception from the API
    console.log('Failed with an error %s', err.message);
  }
}

الكتابة في قاعدة البيانات

توضح الأمثلة أدناه كيفية كتابة سجل واحد إلى قاعدة البيانات بالإضافة إلى مجموعة من 500 سجل. يُعد التجميع أمرًا حيويًا للعمليات المجمَّعة.

لاحِظ أيضًا استخدام العبارات المميّزة بالمعلَمات، والتي تتم الإشارة إلى المتغيّرات فيها من خلال ?. ولمنع هجمات حقن SQL، عليك استخدام العبارات التي تتضمن معلَمات للتخلص من جميع البيانات التي يوفرها المستخدم.

service/jdbc.gs
/**
 * Write one row of data to a table.
 */
function writeOneRecord() {
  try {
    const conn = Jdbc.getCloudSqlConnection(dbUrl, user, userPwd);

    const stmt = conn.prepareStatement('INSERT INTO entries ' +
      '(guestName, content) values (?, ?)');
    stmt.setString(1, 'First Guest');
    stmt.setString(2, 'Hello, world');
    stmt.execute();
  } catch (err) {
    // TODO(developer) - Handle exception from the API
    console.log('Failed with an error %s', err.message);
  }
}

/**
 * Write 500 rows of data to a table in a single batch.
 */
function writeManyRecords() {
  try {
    const conn = Jdbc.getCloudSqlConnection(dbUrl, user, userPwd);
    conn.setAutoCommit(false);

    const start = new Date();
    const stmt = conn.prepareStatement('INSERT INTO entries ' +
      '(guestName, content) values (?, ?)');
    for (let i = 0; i < 500; i++) {
      stmt.setString(1, 'Name ' + i);
      stmt.setString(2, 'Hello, world ' + i);
      stmt.addBatch();
    }

    const batch = stmt.executeBatch();
    conn.commit();
    conn.close();

    const end = new Date();
    console.log('Time elapsed: %sms for %s rows.', end - start, batch.length);
  } catch (err) {
    // TODO(developer) - Handle exception from the API
    console.log('Failed with an error %s', err.message);
  }
}

القراءة من قاعدة البيانات

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

service/jdbc.gs
/**
 * Read up to 1000 rows of data from the table and log them.
 */
function readFromTable() {
  try {
    const conn = Jdbc.getCloudSqlConnection(dbUrl, user, userPwd);
    const start = new Date();
    const stmt = conn.createStatement();
    stmt.setMaxRows(1000);
    const results = stmt.executeQuery('SELECT * FROM entries');
    const numCols = results.getMetaData().getColumnCount();

    while (results.next()) {
      let rowString = '';
      for (let col = 0; col < numCols; col++) {
        rowString += results.getString(col + 1) + '\t';
      }
      console.log(rowString);
    }

    results.close();
    stmt.close();

    const end = new Date();
    console.log('Time elapsed: %sms', end - start);
  } catch (err) {
    // TODO(developer) - Handle exception from the API
    console.log('Failed with an error %s', err.message);
  }
}

إغلاق الاتصالات

يتم إغلاق اتصالات JDBC تلقائيًا عند انتهاء تنفيذ نص برمجي. (تجدر الإشارة إلى أنّ استدعاء google.script.run واحد يتمّ احتسابه كعملية تنفيذ كاملة، حتى إذا ظلّت صفحة خدمة HTML التي أدّت إلى الاتصال مفتوحة).

ومع ذلك، إذا علمت أنّك انتهيت من عملية ربط أو عبارة أو مجموعة نتائج قبل نهاية النص البرمجي، ننصحك بإغلاقها يدويًا من خلال استدعاء JdbcConnection.close() أو JdbcStatement.close() أو JdbcResultSet.close().

يؤدي عرض تنبيه أو مربّع حوار طلب أيضًا إلى إنهاء أي اتصالات JDBC مفتوحة. أما عناصر واجهة المستخدم الأخرى المعروضة، مثل القوائم أو مربّعات الحوار المخصّصة والأشرطة الجانبية التي تتضمّن محتوى مخصّص، فلن تظهر

Google وGoogle Workspace والعلامات والشعارات ذات الصلة هي علامات تجارية تملكها Google LLC. وجميع أسماء الشركات والمنتجات الأخرى هي علامات تجارية مملوكة للشركات ذات الصلة بها.