مصدر بيانات جافا، مثال على مصدر بيانات JDBC

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

مصدر بيانات جافا

في معظم الأحيان نبحث عن ارتباط فضفاض للاتصال حتى نتمكن من تبديل قواعد البيانات بسهولة، وتجميع الاتصالات لإدارة العمليات التنفيذية ودعم الأنظمة الموزعة. مصدر بيانات JDBC هو النهج المفضل إذا كنت تبحث عن أي من هذه الميزات في تطبيقك. واجهة مصدر بيانات جافا متوفرة في حزمة javax.sql وتعلن فقط طريقتين محملتين بالمعلومات getConnection() و getConnection(String str1,String str2).

مصدر بيانات JDBC

من مسؤولية موردي قواعد البيانات المختلفة توفير أنواع مختلفة من تنفيذ واجهة مصدر البيانات. على سبيل المثال، يوفر برنامج تشغيل MySQL JDBC تنفيذًا أساسيًا لواجهة مصدر البيانات بواسطة فئة “com.mysql.jdbc.jdbc2.optional.MysqlDataSource” وينفذ محرك قاعدة بيانات Oracle ذلك بواسطة فئة “oracle.jdbc.pool.OracleDataSource”. توفر هذه الفئات التنفيذية طرقًا يمكننا من خلالها توفير تفاصيل خادم قاعدة البيانات مع بيانات اعتماد المستخدم. بعض الميزات الشائعة الأخرى التي توفرها هذه الفئات التنفيذية لـ JDBC DataSource هي؛

  • تخزين البيانات المعدة مسبقًا لتسريع المعالجة
  • إعدادات وقت انتهاء الاتصال
  • ميزات التسجيل
  • حد أقصى لحجم ResultSet

مثال على JDBC DataSource

لنقم بإنشاء مشروع بسيط لمثال JDBC DataSource ونتعلم كيفية استخدام تنفيذات فئات تنفيذ مصدر البيانات الأساسية لـ MySQL و Oracle للحصول على اتصال قاعدة البيانات. سيبدو مشروعنا النهائي كالصورة أدناه.

مصدر بيانات جافا JDBC – إعداد قاعدة البيانات

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

-- قم بإنشاء جدول الموظفين
CREATE TABLE `Employee` (
  `empId` int(10) unsigned NOT NULL,
  `name` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`empId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- إدراج بعض البيانات التجريبية
INSERT INTO `Employee` (`empId`, `name`)
VALUES
	(1, 'Pankaj'),
	(2, 'David');

commit;
CREATE TABLE "EMPLOYEE"
  (
    "EMPID"   NUMBER NOT NULL ENABLE,
    "NAME"    VARCHAR2(10 BYTE) DEFAULT NULL,
    PRIMARY KEY ("EMPID")
  );

Insert into EMPLOYEE (EMPID,NAME) values (10,'Pankaj');
Insert into EMPLOYEE (EMPID,NAME) values (5,'Kumar');
Insert into EMPLOYEE (EMPID,NAME) values (1,'Pankaj');
commit;

الآن لننتقل إلى برامج جافا الخاصة بنا. لكي يكون تكوين قاعدة البيانات فصائلًا فصائلًا ، سأقرأها من ملف خاصية. ملف db.properties:

# خصائص قاعدة بيانات MySQL
MYSQL_DB_DRIVER_CLASS=com.mysql.jdbc.Driver
MYSQL_DB_URL=jdbc:mysql://localhost:3306/UserDB
MYSQL_DB_USERNAME=pankaj
MYSQL_DB_PASSWORD=pankaj123

# خصائص قاعدة بيانات Oracle
ORACLE_DB_DRIVER_CLASS=oracle.jdbc.driver.OracleDriver
ORACLE_DB_URL=jdbc:oracle:thin:@localhost:1521:orcl
ORACLE_DB_USERNAME=hr
ORACLE_DB_PASSWORD=oracle

تأكد من أن التكوينات السابقة متطابقة مع إعدادك المحلي. تأكد أيضًا من أن لديك ملفات JAR JDBC لقواعد بيانات MySQL و Oracle مضمنة في مسار البناء للمشروع.

مصدر بيانات جافا JDBC – مثال MySQL ، Oracle

لنكتب فئة مصنع يمكننا استخدامها للحصول على مصدر بيانات MySQL أو Oracle.

package com.journaldev.jdbc.datasource;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import oracle.jdbc.pool.OracleDataSource;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

public class MyDataSourceFactory {

	public static DataSource getMySQLDataSource() {
		Properties props = new Properties();
		FileInputStream fis = null;
		MysqlDataSource mysqlDS = null;
		try {
			fis = new FileInputStream("db.properties");
			props.load(fis);
			mysqlDS = new MysqlDataSource();
			mysqlDS.setURL(props.getProperty("MYSQL_DB_URL"));
			mysqlDS.setUser(props.getProperty("MYSQL_DB_USERNAME"));
			mysqlDS.setPassword(props.getProperty("MYSQL_DB_PASSWORD"));
		} catch (IOException e) {
			e.printStackTrace();
		}
		return mysqlDS;
	}
	
	public static DataSource getOracleDataSource(){
		Properties props = new Properties();
		FileInputStream fis = null;
		OracleDataSource oracleDS = null;
		try {
			fis = new FileInputStream("db.properties");
			props.load(fis);
			oracleDS = new OracleDataSource();
			oracleDS.setURL(props.getProperty("ORACLE_DB_URL"));
			oracleDS.setUser(props.getProperty("ORACLE_DB_USERNAME"));
			oracleDS.setPassword(props.getProperty("ORACLE_DB_PASSWORD"));
		} catch (IOException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return oracleDS;
	}
		
}

لاحظ أن فئتي تنفيذ مصدر بيانات Oracle و MySQL متشابهتين للغاية ، لنكتب برنامج اختبار بسيط لاستخدام هذه الطرق وتشغيل بعض الاختبارات.

package com.journaldev.jdbc.datasource;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.DataSource;

public class DataSourceTest {

	public static void main(String[] args) {
		
		testDataSource("mysql");
		System.out.println("**********");
		testDataSource("oracle");

	}

	private static void testDataSource(String dbType) {
		DataSource ds = null;
		if("mysql".equals(dbType)){
			ds = MyDataSourceFactory.getMySQLDataSource();
		}else if("oracle".equals(dbType)){
			ds = MyDataSourceFactory.getOracleDataSource();
		}else{
			System.out.println("invalid db type");
			return;
		}
		
		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;
		try {
			con = ds.getConnection();
			stmt = con.createStatement();
			rs = stmt.executeQuery("select empid, name from Employee");
			while(rs.next()){
				System.out.println("Employee ID="+rs.getInt("empid")+", Name="+rs.getString("name"));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
				try {
					if(rs != null) rs.close();
					if(stmt != null) stmt.close();
					if(con != null) con.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
		}
	}

}

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

Employee ID=1, Name=Pankaj
Employee ID=2, Name=David
**********
Employee ID=10, Name=Pankaj
Employee ID=5, Name=Kumar
Employee ID=1, Name=Pankaj

مثال Apache Commons DBCP

إذا نظرنا إلى فئة مصنع مصدر البيانات في جافا أعلاه، ستكون هناك مشكلتان رئيسيتان بها.

  1. طرق فئة المصنع لإنشاء MySQL و Oracle مصدر البيانات مرتبطة بشكل وثيق بواجهة برمجة التطبيقات الخاصة بالسائق الخاص بكل منهما. إذا أردنا إزالة دعم قاعدة بيانات Oracle في المستقبل أو إضافة دعم لقاعدة بيانات أخرى، سيتطلب ذلك تغييرًا في الشيفرة.
  2. معظم الشيفرة للحصول على MySQL و Oracle مصدر البيانات متشابهة، الفرق الوحيد هو فئة التنفيذ التي نستخدمها.

تساعدنا واجهة برمجة التطبيقات Apache Commons DBCP على التخلص من هذه المشاكل من خلال توفير تنفيذ DataSource في جافا يعمل كطبقة تجريد بين برنامجنا ومختلف سائقي JDBC. تعتمد مكتبة Apache DBCP على مكتبة Commons Pool، لذا تأكد من وجود كلاهما في مسار البناء كما هو موضح في الصورة. هنا فئة مصنع مصدر البيانات التي تستخدم BasicDataSource وهي تنفيذ بسيط لـ DataSource.

package com.journaldev.jdbc.datasource;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;

public class DBCPDataSourceFactory {

	public static DataSource getDataSource(String dbType){
		Properties props = new Properties();
		FileInputStream fis = null;
		BasicDataSource ds = new BasicDataSource();
		
		try {
			fis = new FileInputStream("db.properties");
			props.load(fis);
		}catch(IOException e){
			e.printStackTrace();
			return null;
		}
		if("mysql".equals(dbType)){
			ds.setDriverClassName(props.getProperty("MYSQL_DB_DRIVER_CLASS"));
            ds.setUrl(props.getProperty("MYSQL_DB_URL"));
            ds.setUsername(props.getProperty("MYSQL_DB_USERNAME"));
            ds.setPassword(props.getProperty("MYSQL_DB_PASSWORD"));
		}else if("oracle".equals(dbType)){
			ds.setDriverClassName(props.getProperty("ORACLE_DB_DRIVER_CLASS"));
            ds.setUrl(props.getProperty("ORACLE_DB_URL"));
            ds.setUsername(props.getProperty("ORACLE_DB_USERNAME"));
            ds.setPassword(props.getProperty("ORACLE_DB_PASSWORD"));
		}else{
			return null;
		}
		
		return ds;
	}
}

كما يمكنك رؤية، يتم إنشاء مصدر بيانات MySQL أو Oracle اعتمادًا على إدخال المستخدم. إذا كنت تدعم قاعدة بيانات واحدة فقط في التطبيق، فلن تحتاج حتى إلى هذه المنطق. ما عليك سوى تغيير الخصائص ويمكنك التبديل من خادم قاعدة بيانات واحد إلى آخر. النقطة الرئيسية التي يوفرها Apache DBCP من خلالها التجربة هي طريقة setDriverClassName(). هنا برنامج العميل الذي يستخدم طريقة الصناعة السابقة للحصول على أنواع مختلفة من الاتصال.

package com.journaldev.jdbc.datasource;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.DataSource;

public class ApacheCommonsDBCPTest {

	public static void main(String[] args) {
		testDBCPDataSource("mysql");
		System.out.println("**********");
		testDBCPDataSource("oracle");
	}

	private static void testDBCPDataSource(String dbType) {
		DataSource ds = DBCPDataSourceFactory.getDataSource(dbType);
		
		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;
		try {
			con = ds.getConnection();
			stmt = con.createStatement();
			rs = stmt.executeQuery("select empid, name from Employee");
			while(rs.next()){
				System.out.println("Employee ID="+rs.getInt("empid")+", Name="+rs.getString("name"));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
				try {
					if(rs != null) rs.close();
					if(stmt != null) stmt.close();
					if(con != null) con.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
		}
	}

}

عند تشغيل البرنامج السابق، سيكون الإخراج هو نفس البرنامج السابق. إذا نظرنا إلى واجهة Java JDBC DataSource والاستخدام السابق، يمكن القيام به أيضًا باستخدام DriverManager العادي. الميزة الرئيسية لـ Java DataSource هي عند استخدامها ضمن سياق ومع JNDI. باستخدام تكوينات بسيطة يمكننا إنشاء تجمع اتصال بقاعدة بيانات يتم الاحتفاظ به بواسطة الحاوية ذاتها. معظم حاويات خدمات الـ Servlet مثل Tomcat و JBoss توفر تنفيذها الخاص لـ Java DataSource وكل ما نحتاجه هو تكوينها من خلال تكوينات بسيطة بناءً على XML ثم استخدام بحث سياق JNDI للحصول على Java DataSource والعمل معه. يساعدنا ذلك من خلال الاهتمام بتجمع وإدارة الاتصال من جانب تطبيقنا إلى الجانب الخادم وبالتالي يمنحنا المزيد من الوقت لكتابة منطق الأعمال للتطبيق. في الدرس التعليمي التالي، سنتعلم كيف يمكننا تكوين DataSource في حاوية Tomcat واستخدامه في تطبيق الويب.

Source:
https://www.digitalocean.com/community/tutorials/java-datasource-jdbc-datasource-example