۳۰ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

JDBC چیست؟ مقدمه ای بر اتصال به پایگاه داده جاوا

یک نمای کلی از معماری JDBC دریافت کنید، سپس یاد بگیرید که چگونه به یک پایگاه داده متصل شوید و با PreparedStatements، تراکنش ها، ادغام اتصال و موارد دیگر، پرس و جوها و پاسخ های SQL را مدیریت کنید.

یک نمای کلی از معماری JDBC دریافت کنید، سپس یاد بگیرید که چگونه به یک پایگاه داده متصل شوید و با PreparedStatements، تراکنش ها، ادغام اتصال و موارد دیگر، پرس و جوها و پاسخ های SQL را مدیریت کنید.

JDBC (اتصال پایگاه داده جاوا) API جاوا است که اتصال به پایگاه داده، صدور پرس و جوها و دستورات، و مدیریت مجموعه نتایج به دست آمده از پایگاه داده را مدیریت می کند. JDBC که به عنوان بخشی از JDK 1.1 در سال ۱۹۹۷ منتشر شد، یکی از اولین کتابخانه های توسعه یافته برای زبان جاوا بود.

JDBC در ابتدا به‌عنوان یک API سمت کلاینت در نظر گرفته شد که یک کلاینت جاوا را قادر می‌سازد تا با منبع داده تعامل داشته باشد. این با JDBC 2.0 تغییر کرد که شامل یک بسته اختیاری برای پشتیبانی از اتصالات JDBC سمت سرور بود. از آن زمان تاکنون، هر نسخه جدید JDBC دارای به‌روزرسانی‌هایی برای بسته سمت مشتری (java.sql) و بسته سمت سرور (javax.sql) است. JDBC 4.3، جدیدترین نسخه تا این لحظه، به عنوان بخشی از Java SE 9 در سپتامبر ۲۰۱۷ با نام JSR 221.

این مقاله مروری بر درایورهای JDBC و JDBC ارائه می‌کند و به دنبال آن مقدمه‌ای عملی برای استفاده از JDBC برای اتصال یک کلاینت جاوا به یک پایگاه داده رابطه‌ای سبک ارائه می‌کند.

چگونه JDBC کار می کند

به عنوان یک توسعه دهنده، می توانید از JDBC برای تعامل با پایگاه داده از داخل یک برنامه جاوا استفاده کنید. همانطور که در شکل ۱ نشان داده شده است، JDBC به عنوان پلی از کد شما به پایگاه داده عمل می کند.

JDBC برنامه های جاوا را به پایگاه های داده متصل می کند.

شکل ۱. JDBC برنامه های جاوا را به پایگاه داده متصل می کند.

JDBC در مقابل ODBC

قبل از JDBC، توسعه دهندگان از Open Database Connectivity (ODBC)، یک رویکرد استاندارد زبان شناس برای دسترسی به سیستم مدیریت پایگاه داده رابطه ای یا RDBMS استفاده می کردند. از برخی جهات، JDBC از ODBC الهام گرفته است. تفاوت این است که JDBC مختص جاوا است و یک رابط در سطح برنامه نویسی ارائه می دهد که مکانیک برنامه های جاوا را در ارتباط با پایگاه داده کنترل می کند.

معماری JDBC

اینترفیس JDBC از دو لایه تشکیل شده است:

  1. JDBC API از ارتباط بین برنامه جاوا و مدیر JDBC پشتیبانی می کند.
  2. درایور JDBC از ارتباط بین مدیر JDBC و درایور پایگاه داده پشتیبانی می کند.

JDBC API و درایور JDBC در طول سال‌ها به‌طور گسترده اصلاح شده‌اند، که منجر به یک کتابخانه غنی از ویژگی، عملکرد و قابل اعتماد شده است.

JDBC API رایجی است که کد برنامه شما با آن تعامل دارد. در زیر آن درایور سازگار با JDBC برای پایگاه داده ای که استفاده می کنید وجود دارد.

شکل ۲ معماری JDBC را نشان می دهد.

اینترفیس JDBC از JDBC API و درایورهای آن تشکیل شده است.

شکل ۲. معماری JDBC از درایورهای JDBC API و JDBC تشکیل شده است.

درایورهای JDBC

به‌عنوان یک برنامه‌نویس برنامه، لازم نیست فوراً نگران اجرای درایوری که استفاده می‌کنید باشید، تا زمانی که امن و رسمی باشد. با این حال، دانستن این نکته مفید است که چهار نوع درایور JDBC وجود دارد:

  1. درایور پل JDBC-ODBC: یک لایه نازک جاوا که از یک درایور ODBC در زیر کاپوت استفاده می کند.
  2. درایور Native API: یک رابط از جاوا به سرویس گیرنده پایگاه داده بومی ارائه می دهد.
  3. درایور میان‌افزار: یک رابط جهانی (“Middleware”) بین جاوا و پروتکل خاص فروشنده RDBMS.
  4. درایور خالص جاوا: درایوری که پروتکل خاص فروشنده را مستقیماً در جاوا پیاده‌سازی می‌کند.
Neo4j 4.0 مقیاس پذیری، امنیت و عملکرد را هدف قرار می دهد

وقتی به معماری و عملکرد فکر می کنید، در نظر گرفتن نوع درایور مورد استفاده شما مفید خواهد بود.

اتصالات و پرس و جوهای پایگاه داده ساده

یکی از مزایای برنامه نویسی در اکوسیستم جاوا این است که احتمالاً یک رابط پایگاه داده JDBC پایدار برای هر پایگاه داده ای که انتخاب می کنید پیدا خواهید کرد. در این آموزش، ما از SQLite برای آشنایی با JDBC استفاده خواهیم کرد، عمدتاً به این دلیل که استفاده از آن بسیار آسان است.

مراحل اتصال به پایگاه داده با JDBC به شرح زیر است:

  1. پایگاه داده ای را که می خواهید به آن دسترسی داشته باشید نصب یا پیدا کنید.
  2. کتابخانه JDBC را اضافه کنید.
  3. مطمئن شوید که درایور JDBC مورد نیاز شما در مسیر کلاس شما قرار دارد.
  4. از کتابخانه JDBC برای به دست آوردن اتصال به پایگاه داده استفاده کنید.
  5. از اتصال برای صدور فرمانهای SQL استفاده کنید.
  6. وقتی کارتان تمام شد، اتصال را ببندید.

این مراحل را با هم طی خواهیم کرد.

پیدا کردن درایور JDBC

برای یافتن یک درایور برای پایگاه داده انتخابی خود، کافی است یک جستجوی وب برای پایگاه داده و JDBC خود انجام دهید. به عنوان مثال، تایپ کردن “mysql jdbc driver” یک درایور برای MySQL نشان می دهد. من شما را به چالش می‌کشم تا یک پایگاه داده در سطح سازمانی بدون درایور JDBC پیدا کنید!

مرحله ۱. SQLite را دانلود و نصب کنید

SQLite یک پایگاه داده بسیار فشرده است. این برای استفاده در تولید در نظر گرفته نشده است، اما یک انتخاب عالی برای آزمایش سریع چیزها است. SQLite از یک فایل به عنوان پایگاه داده عملکردی خود استفاده می کند، بدون اینکه نیازی به نصب سرویس یا دیمون داشته باشد.

برای شروع کار با این نمایش، ابتدا پایگاه نمونه SQLite. فایل .db را از حالت فشرده خارج کرده و در جایی ذخیره کنید که فراموش نکنید. این فایل شامل یک پایگاه داده مبتنی بر فایل کاربردی و طرح و داده های نمونه است که می توانیم از آنها استفاده کنیم.

SQL و JDBC

NoSQL محبوب است اما پایگاه داده های رابطه ای پرکاربردترین نوع ذخیره داده باقی می مانند. پایگاه داده رابطه‌ای یک مخزن ساختاری است که از جداول با ستون‌ها و ردیف‌ها و روابط بین جداول تشکیل شده است. SQL یا زبان پرس و جوی ساختاریافته، زبانی است که معماران داده برای انجام عملیات CRUD (ایجاد، خواندن، به روز رسانی و حذف) روی رکوردها در یک پایگاه داده رابطه ای استفاده می کنند. JDBC یک لایه آداپتور از جاوا به SQL است: به توسعه دهندگان جاوا یک رابط مشترک برای اتصال به پایگاه داده، صدور پرس و جو و دستورات، و مدیریت پاسخ ها می دهد.

Microsoft .NET Community Toolkit 8.2 در MVVM می درخشد

مرحله ۲. JDBC را به برنامه جاوا خود وارد کنید

ما می‌توانیم کدنویسی خود را در یک IDE انجام دهیم، اما کدنویسی مستقیم در یک ویرایشگر متن، سادگی JDBC را بهتر نشان می‌دهد. برای شروع، باید یک نصب JDK سازگار برای سیستم عامل خود داشته باشید.

با فرض اینکه شما یک JDK نصب کرده اید، می توانیم با ایجاد یک برنامه ساده جاوا شروع کنیم. در ویرایشگر متن خود، کد نشان داده شده در فهرست ۱ را جایگذاری کنید. این فایل را WhatIsJdbc.java صدا کنید.


class WhatIsJdbc{
  public static void main(String args[]){
      System.out.println("Hello InfoWorld");
  }
}

اکنون، کد را با وارد کردن دستور کامپایل کنید: javac WhatIsJdbc.java. کامپایل کردن، فایل WhatIsJdbc.class را خروجی می دهد. این فایل را از خط فرمان با فراخوانی اجرا کنید: java WhatIsJdbc.

هنگامی که یک برنامه اصلی جاوا دارید، می‌توانید کتابخانه‌های JDBC را اضافه کنید. کد فهرست ۲ را در سر برنامه ساده جاوا خود جایگذاری کنید.


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

هر یک از این واردها دسترسی به کلاسی را فراهم می کند که اتصال پایگاه داده استاندارد جاوا را تسهیل می کند:

  • اتصال نشان دهنده اتصال به پایگاه داده است.
  • DriverManager اتصال به پایگاه داده را بدست می آورد. (گزینه دیگر DataSource است که برای ادغام اتصال استفاده می شود.)
  • SQLException خطاهای SQL بین برنامه جاوا و پایگاه داده را کنترل می کند.
  • ResultSet و Statement مجموعه‌های نتایج داده‌ها و عبارات SQL را مدل می‌کنند.

به زودی هر یک از اینها را در عمل خواهید دید.

مرحله ۳. درایور JDBC را به کلاس خود اضافه کنید

در مرحله بعد، درایور SQLite را به مسیر کلاس خود اضافه خواهید کرد. به یاد داشته باشید، درایور JDBC کلاسی است که API JDBC را برای یک پایگاه داده خاص پیاده سازی می کند.

به صفحه GitHub برای درایور SQLite بروید و آخرین نسخه را دانلود کنید SQLite .jar. اگر از Maven یا Gradle یا موارد مشابه استفاده می کنید، می توانید درایور را از طریق مخزن Maven. مطمئن شوید که جدیدترین فایل jar. را دریافت کرده و آن را در جایی که به یاد دارید ذخیره کنید.

دفعه بعد که برنامه جاوا خود را اجرا می کنید، آن فایل jar. را از طریق classpath وارد می کنید. راه های مختلفی برای تنظیم مسیر کلاس وجود دارد. فهرست ۳ نحوه انجام آن را با استفاده از سوئیچ خط فرمان نشان می دهد.


java.exe -classpath /path-to-driver/sqlite-jdbc-3.۲۳.۱.jar:. WhatIsJdbc

توجه داشته باشید که ما مسیر کلاس را طوری تنظیم کرده ایم که به درایور و دایرکتوری محلی اشاره کند. به این ترتیب، جاوا همچنان فایل کلاس ما را پیدا خواهد کرد.

مرحله ۴. اتصال پایگاه داده را بدست آورید

کلاس مسیر اکنون به درایور دسترسی دارد. در مرحله بعد، فایل برنامه ساده جاوا خود را طوری تغییر دهید که شبیه برنامه فهرست ۴ باشد.


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

 String sql = "SELECT id, username FROM users WHERE id = ?";
    List users = new ArrayList<>();
    try (Connection con = DriverManager.getConnection(myConnectionURL);
         PreparedStatement ps = con.prepareStatement(sql)) {
        ps.setInt(1, userId);
        try (ResultSet rs = ps.executeQuery()) {
            while(rs.next()) {
                users.add(new User(rs.getInt("id"), rs.getString("name")));
            }
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return users;

class WhatIsJdbc{
  public static void main(String[] args) {
    String url = "jdbc:sqlite:path-to-db/chinook/chinook.db";
    try (Connection conn = DriverManager.getConnection(url){

      System.out.println("Got it!");

    } catch (SQLException e) {
      throw new Error("Problem", e);
    } 
  }
}

این کد را کامپایل و اجرا کنید. با فرض اینکه همه چیز خوب پیش برود، یک پیام تأیید کننده دریافت خواهید کرد.

زیرساخت به عنوان کد چیست؟ خودکارسازی زیرساخت‌های شما

درایور مناسبی پیدا نشد

اگر خطایی شبیه “درایور مناسبی برای jdbc:sqlite یافت نشد” دریافت کردید، باید دوباره classpath را ببینید و مطمئن شوید که به درایوری که دانلود کرده اید اشاره می کند. اتصال ناموفق درایور رایج ترین مانع برای مبتدیانی است که از JDBC استفاده می کنند. آن را عرق نکنید؛ فقط آن را تعمیر کنید.

اکنون، ما برای برخی از دستورات SQL آماده هستیم.

مرحله ۵. پایگاه داده را پرس و جو کنید

با در دست داشتن شیء اتصال زنده، می‌توانیم کار مفیدی انجام دهیم، مانند پرس و جو از پایگاه داده. فهرست ۵ نحوه پرس و جو از SQLite را با استفاده از اشیاء Connection و Statement JDBC نشان می دهد.


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


class WhatIsJdbc{
  public static void main(String[] args) {
    String sql = "SELECT id, username FROM users WHERE id = ?";
    String url = "jdbc:sqlite:path-to-db-file/chinook/chinook.db";
    try (Connection conn = DriverManager.getConnection(url);
      Statement stmt = conn.createStatement()) {

      try {
        ResultSet rs = stmt.executeQuery("select * from albums";);
        while (rs.next()) {
          String name = rs.getString("title");
          System.out.println(name);
        }
      } catch (SQLException e ) {
            throw new Error("Problem", e);
      } 

    } catch (SQLException e) {
      throw new Error("Problem", e);
    } 
  }
}

در فهرست ۵ ما از شی Connection خود برای به دست آوردن یک شی Statement استفاده می کنیم: conn.createStatement(). سپس از این شی برای اجرای پرس و جوی SQL استفاده می کنیم: stmt.executeQuery(query).

فرمان executeQuery یک شی ResultSet را برمی گرداند، که سپس از آن برای تکرار روی داده ها با while (rs.next()) استفاده می کنیم. . در این مثال، شما باید عناوین آلبومی را که در مورد آنها پرس و جو کرده ایم به عنوان خروجی ببینید.

توجه داشته باشید که ما همچنین اتصال را از طریق تماس با conn.close() بسته ایم.

اتصالات شبکه با JDBC

رشته اتصال پایگاه داده در فهرست ۵ برای اتصال محلی است: jdbc:sqlite:path-to-db-file/chinook/chinook.db. برای دسترسی به پایگاه داده از طریق شبکه، رشته اتصال باید شامل URL شبکه و (معمولا) اعتبار برای دسترسی به آن باشد.

PreparedStatements، به‌روزرسانی‌های دسته‌ای، و تراکنش‌ها

تاکنون، اصول استفاده از JDBC برای اتصال به پایگاه داده و صدور دستورات SQL را پوشش داده ایم. در حالی که Statement و ResultSet برای سناریوهای رایج به خوبی کار می‌کنند، احتمالاً به گزینه‌های اضافی برای برنامه‌های بزرگتر یا پیچیده‌تر نیاز خواهید داشت. خوشبختانه، کتابخانه JDBC همچنان در حال تکامل است تا اکثر نیازهای دسترسی به پایگاه داده را برآورده کند.