استفاده از JDBC در Net.

پنجشنبه 31 اردیبهشت 1394

JDBC یک API بر پایه زبان جاوا می باشد ، و از کلاس ها و توابعی برای ارتباط با پایگاه داده های رابطه ای (Relational Database) تشکیل شده است .در اصل با عنوان Java Database Connectivity API شناخته می شود .

استفاده از JDBC در Net.

امروزه بانک های اطلاعاتی مانند Access, SQL Server,MySQL و غیره ... از جمله ارکان مهم یک نرم افزار کامپیوتری محسوب می شود .برنامه نویسان قدیمی و با تجربه به خوبی یاد دارند که در چند دهه گذشته , خود برنامه نویس علاوه بر نوشتن سناریو و کد های برنامه , می بایست بستر ذخیره سازی دیتا را از پایه بنا نهاده و تمامی اطلاعات را ظبط و مدیریت می نمود . اما با گذشت زمان و کثرت اطلاعات و اهمیت پردازش داده ها ] وظیفه خطیر مدیریت Data به طور تخصصی به نرم افزار های این حیطه واگذار شد .در زبان های برنامه نویسی مدرن امروزی , برنامه نویس تنها به کار برنامه نویسی پرداخته و فقط با یک پل ارتباطی مانند JDBC,ODBC و امثال آن . بدون کوچکترین دانشی از طریقه عملکرد درونی یک بانک اطلاعاتی , با آن ارتباط برقرار میکند .برنامه نویسان جاوا برای ارتباط با بانک اطلاعاتی از پل ارتباطی JDBC استفاده می کنند .به همین جهت در این مقاله به بررسی این پل خواهیم پرداخت .

JDBC چیست ؟

JDBC در حقیقت یک رابط برنامه سازی کاربردی(API) است که به برنامه های جاوا اجازه اتصال و تبادل اطلاعات با بانک اطلاعاتی را می دهد , از آنحایی که با وجود JDBC نیازی به نوشتن برنامه های جداگانه برای ارتباط با بانک اطلاعاتی مختلف نیست .بنابراین نباید نگران تفاوت Data Base ها و ساختار آنها بود .در واقع JDBC تفاوتی بین Oracle و MySQL وجود نداشته و تنها با یک روش مشخص به آنها متصل می گردد , به همین حهت حتی در صورت تغییر نوع بانک اطلاعاتی یا حتی نوع برنامه (به عنوان مثال از تحت ویندوز به تحت وب ) در آینده , مشکلی در کدها ده وجود نخواهد آمد .

وظایف JDBC :

JDBC بطور کلی وظایف زیر را در ارتباط بین یک برنامه نوشته شده با جاوا و بانک اطلاعاتی بر عهده دارد :

_ برقراری ارتباط با بانک اطلاعاتی

_ ارسال دستورات SQL به بانک

_ پردازش و دریافت نتایج برگشتی از بانک

_ قطع ارتباط با بانک اطلاعاتی

JDBC APL

JDBC توسط مجموعه غنی APL , تمامی وظایف خود اعم از اجرای دستورات SQL و گرفتن نتایج از بانک را انجام می دهد .در ضمن این APL ها به شکل رابط ها و کلاسهای طراحی شده , به منظور اجرای انتقال , دستورات روی پایگاه داده رابطه ای تعبیه شده اند .

JDBC و ODBC

تکنولوژی ODBC یکی دیگر از روش های دسترسی به بانک های اطلاعاتی مختلف بوده و امکان دسترسی به بیشتر آنها در محیط های مختلف فراهم می کند .در صورت تمایل به استفاده از ODBC در جاوا , می توان از اوسط ODBC-JDBC استفاده نمود .

JDBC URL

درایو JDBC , برای شناسایی و برقراری ارتباط با بانک اطلاعات از JDBC URL استفاده می کند .ضمناَ هر کدام از DataBase های موجود در دنیا , یک URL مختص به خود دارند .

نرم افزار NET. از فرایند اتصال ایجاد شده استفاده می کند . در ادامه می توانیم به یک نمونه از دستورات استفاده از این تکنولوژی را مشاهده نماییم .

using System;  
using Codemesh.JuggerNET;  
using Java.Lang;  
using Java.Sql;  
using Java.Util;  
  
  
public class Application  
{  
    public static void  Main( string[] args )  
    {  
        //the database filename  
        string  db_file_name_prefix = args.Length > 0 && !"-info".Equals( args[ 0 ].ToLower() ) ? args[ 0 ] : "test_db";  
  
        //for now just terminate if we're invoked with the -info option  
        if( args.Length > 0 && "-info".Equals( args[ 0 ].ToLower() ) )   
            return;  
  
        //the database connection  
        Connection      conn = null;  
  
        try  
        {  
            IJvmLoader  loader = JvmLoader.GetJvmLoader( true, true, TraceFacility.TraceJvm, TraceLevel.TraceErrors );  
  
            // put the hsqldb classes (driver) on the bootclasspath to work around a   
            // limitation in the DriverManager when invoked from .NET  
            loader.AppendBootClassPath = "../lib/hsqldb.jar;../../lib/hsqldb.jar";  
  
            // make the JDBC driver available by preloading it  
            Class.ForName("org.hsqldb.jdbcDriver");  
  
            // connect to the database.   This will load the db files and start the  
            // database if it is not alread running.  
            // db_file_name_prefix is used to open or create files that hold the state  
            // of the db.  
            // It can contain directory names relative to the  
            // current working directory  
            conn = DriverManager.GetConnection( "jdbc:hsqldb:" + db_file_name_prefix,  
                                                "sa",                     // username  
                                                "");                      // password  
  
            // create a table and insert some entries  
            // this will only worl the first time and throw an exception every following time  
            // because the table already exists   
            try  
            {  
                Update( conn, "CREATE TABLE sample_table ( id INTEGER IDENTITY, str_col VARCHAR(256), num_col INTEGER)");  
  
                // add some rows - will create duplicates if run more then once  
                // the id column is automatically generated  
                Update( conn, "INSERT INTO sample_table(str_col,num_col) VALUES('Ford', 100)");  
                Update( conn, "INSERT INTO sample_table(str_col,num_col) VALUES('Toyota', 200)");  
                Update( conn, "INSERT INTO sample_table(str_col,num_col) VALUES('Honda', 300)");  
                Update( conn, "INSERT INTO sample_table(str_col,num_col) VALUES('GM', 400)");  
                Update( conn, "INSERT INTO sample_table(str_col,num_col) VALUES('BMW', 80)");  
                Update( conn, "INSERT INTO sample_table(str_col,num_col) VALUES('Mercedes-Benz', 60)");  
                Update( conn, "INSERT INTO sample_table(str_col,num_col) VALUES('VW', 800)");  
            }  
            catch( SQLException sqle )  
            {  
                Console.WriteLine( sqle.Message );  
            }  
            catch( Throwable it )  
            {  
                Console.WriteLine( it.StackTrace );  
            }  
            catch( System.Exception ie )  
            {  
                Console.WriteLine( ie.ToString() );  
            }  
  
            try  
            {  
                Console.WriteLine( "---------------" );  
  
                // do a query  
                Query( conn, "SELECT * FROM sample_table WHERE num_col < 250");  
  
                Console.WriteLine( "---------------" );  
  
                // do another query  
                Query( conn, "SELECT str_col FROM sample_table WHERE num_col >= 100");  
  
                Console.WriteLine( "---------------" );  
  
                conn.Close();  
            }  
            catch( Throwable t )  
            {  
                Console.WriteLine( "Caught throwable of type {0}", t.GetClass().GetName() );  
                Console.WriteLine( t.ToString() );  
                return;  
            }  
            catch( JuggerNETFrameworkException jnfe )  
            {  
                Console.WriteLine( "Caught framework exception" );  
                Console.WriteLine( jnfe.Message );  
                Console.WriteLine( jnfe.StackTrace );  
                return;  
            }  
  
            return;  
        }  
        catch( System.Exception se )  
        {  
            Console.WriteLine( se.ToString() );  
        }  
    }  
  
    public static void  Dump( ResultSet rs )  
    {  
        // the order of the rows in a cursor  
        // are implementation dependent unless you use the SQL ORDER statement  
        ResultSetMetaData meta   = rs.GetMetaData();  
        int               colmax = meta.GetColumnCount();  
        int               i;  
        object            o = null;  
  
        // the result set is a cursor into the data.  You can only  
        // point to one row at a time  
        // assume we are pointing to BEFORE the first row  
        // rs.next() points to next row and returns true  
        // or false if there is no next row, which breaks the loop  
        for (; rs.Next(); )   
        {  
            for (i = 0; i < colmax; ++i)   
            {  
                o = rs.GetObject(i + 1);    // Is SQL the first column is indexed  
  
                // with 1 not 0  
                Console.Write( "{0} ", o.ToString() );  
            }  
  
            Console.WriteLine( "" );  
        }  
    }  
  
  
    public static void Update( Connection conn, String expression)  
    {  
        Statement st = null;  
  
        st = conn.CreateStatement();    // statements  
  
        int i = st.ExecuteUpdate(expression);    // run the query  
  
        if (i == -1)   
        {  
            Console.WriteLine( "db error : {0}", expression );  
        }  
  
        st.Close();  
    }  
  
  
    public static void      Query( Connection conn, String expression )  
    {  
        Statement st = null;  
        ResultSet rs = null;  
  
        st = conn.CreateStatement();         // statement objects can be reused with  
  
        // repeated calls to execute but we  
        // choose to make a new one each time  
        rs = st.ExecuteQuery(expression);    // run the query  
  
        // do something with the result set.  
        Dump(rs);  
        st.Close();      
        // NOTE!! if you close a statement the associated ResultSet is closed   
        // too so you should copy the contents to some other object.  
        // the result set is invalidated also  if you recycle an Statement  
        // and try to execute some other query before the result set has been  
        // completely examined.  
    }  
}

 

 

احسان حسینی

نویسنده 42 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید