در این آموزش قصد داریم اتصال به پایگاه داده های مختلف در جاوا را مورد بررسی قرار دهیم به دلیل بالا بودن حجم مطالب، این آموزش در دو بخش در اختیار کاربران عزیز roxo قرار داده می شود .
توجه کنید که هدف این آموزش فقط برای ایجاد کانکشن بین جاوا و پایگاه داده است و کوئری ها و دستورات sql با کد جاوا و متدهای آن ها در بخش جداگانه ای به صورت مفصل مورد بررسی قرار می گیرد همچنین کاربران عزیز باید آشنایی اولیه با ایجاد Schema و Table داشته باشند.
برای اتصال به این پایگاه داده نیاز اضافه کردن کتابخانه ی mysql-connector-java-5.1.47.jar است که می توانید از اینجا دانلود کنید .
یک پروژه ی جاوا در NetBeans ایجاد کنید، کتابخانه ای که از لینک بالا دانلود کرده اید را از حالت زیپ خارج کرده و import کنید.
این کتابخانه وظیفه ی نصب درایور برای اتصال به پایگاه داده را بر عهده دارد. پس توسط دستور زیر درایور اتصال نصب می شود.
Class.forName("com.mysql.jdbc.Driver");
دستور بالا خطای ClassNotFoundException را نمایش می دهد. بنابراین باید در بلوک try-catch قرار بگیرد.
بعد از نصب درایور، نیاز به یک کانکشن داریم تا خط اصلی ارتباط میان پایگاه داده و جاوا را برقرار کند.
برای این منظور پکیج java.sql را import کرده و کد زیر را اضافه می کنیم و به توضیح آن می پردازیم.
Connection connect = DriverManager.getConnection(url, user, pass);
توجه کنید که Connection یک واسط است (Interface) و نمی توان به صورت مستقیم از آن شی سازی کرد. پس با استفاده از چند ریختی، یک شی از آن ایجاد می کنیم.
کلاس DriverManager دارای سه متد static اصلی است که مهم ترین آن برای ایجاد کانکشن، متد getConnection که دارای سه ورودی از نوع String بوده و این ورودی ها به ترتیب Url و Username ,password است .
منظور از Url چیست؟
url در واقع آدرس پایگاه داده و پورت و به طور کلی در بردارنده ی اطلاعات پایگاه داده است که برای اتصال به MySql باید به شکل زیر عمل کرد.
تذکر مهم: قبل از انجام تمامی مراحل بالا باید MySQL Workbench استارت شود. اگر در زمان نصب MySQL Workbench برای آن username و password در نظر گرفته اید، زمان استارت کردن MySQL Workbench باید username و password را وارد کرده و از همین دو فیلد برای ایجاد کانکشن استفاده کنید.
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb","root","1234");
عبارت بعد از localhost پورت اتصال است که به طور پیش فرض 3306 می باشد.
mydb نام پایگاه داده در سیستم من هست شما باید نام پایگاه داده ای (Schema) که قبلا برای خود انتخاب کردید را به جای آن وارد کنید (برای اطلاع از پورت می توانید در MySQL Workbench سربرگ Server و server status بروید مطابق شکل زیر).
در اینجا نام کاربری من root و پسورد 1234 است.
این خط نیز خطای SQLException نمایش می دهد. پس باید در بلوک try-catch قرار بگیرد، در صورتی که تمامی مراحل ذکر شده درست انجام شود کانکشن برقرار شده و تمامی Table های ایجاد شده در Schema مورد نظر قابل دستیابی هستند و می توان با دستورات کوئری، آن ها را ایجاد ،پیمایش و ... کرد.
در زیر کدهای برنامه را مشاهده می کنید:
package DataBase; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class DataBaseHandler { Connection connection=null; Statement statement=null; public DataBaseHandler() { CreateMySql(); } public void CreateMySql(){ String user="root"; String pass="1234"; String url="jdbc:mysql://localhost:3306/mydb"; try { Class.forName("com.mysql.jdbc.Driver"); connection = DriverManager.getConnection(url,user,pass); System.out.println("Connect to mySql"); statement = connection.createStatement(); ResultSet set = statement.executeQuery("select * from mytest"); while(set.next()){ System.out.println(set.getString("Age")); } } catch (ClassNotFoundException | SQLException ex) { System.err.println(ex.getMessage()); } } }
System.out.println("Connect") برای اطمینان از این که عملیات کانکشن به درستی انجام شده استفاده شده است و کاربرد دیگری ندارد.
از connection ایجاد شده در واسط statement استفاده می کنیم. به طور ساده می توان گفت statement بستری را برای اجرای کوئری ها بر روی database ایجاد می کند. با استفاده از متد executeQuery دستورات sql را اجرا می شود که خروجی آن از نوع Resultset است. این خروجی در واقع اطلاعات سطر ها را در خود نگه می دارد.
در این مثال نام جدول (Table) من mytest است که قبلا در MySQL Workbench در mydb ایجاد کرده ام. این جدول دارای سه ستون با نام های ID Name و Age است.
دستور set.getString که پارامتر ورودی آن نام ستونی (یا شماره ی ستون که از 1 شروع می شود) از جدول است باعث می شود که در دستور set.next در حلقه ی while تا زمانی که به آخرین سطر برسد اجرا می شود (مانند Iterator عمل می کند).
در اینجا من ستون Age را با دستور print چاپ کردم که خروجی آن شکل زیر است.
No suitable driver found for jdbc:mysql://localhost:3306/mydb
نصب اولیه ی درایور به درستی انجام نشده.
Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
پورت اتصال به درستی انتخاب نشده است.
Unknown database 'mydb2'
نام دیتابیس اشتباه است
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near
دستورات کوئری اشتباه وارد شده و مطابق با Sql نیست
Column 'NAME0' not found.
در اینجا نام ستون اصلی Name بوده، پس دلیل خطا کاملا مشخص است
Access denied for user 'root'@'localhost' (using password: YES)
نام کاربری یا رمز عبور اشتباه است (نام کاربری root توسط خود من انتخاب شده، نام کابری نمایش داده برای شما همان نام کاربری است که در زمان نصب MySQL Workbench انتخاب کرده اید).
تذکر مهم: قبل از شروع آموزش ابتدا باید با استفاده از نرم افزار Access یک پایگاه داده و جدول و ستون های مورد نیاز ایجاد کنید و آن را با نامی مناسب و پسوند accdb ذخیره نمایید، بعد از ذخیره ی فایل می توانید نرم افزار Access را ببندید تنها بخش مورد نیاز ما فایل ذخیره شده با پسوند accdb است و از این به بعد تغییرات (insert ، delete ، update و...) بر روی این فایل اعمال می شود.
مانند قبل یک پروژه ی جدید در NetBeans ایجاد کنید برای ارتباط با پایگاه داده ی Access باید فایل کتابخانه ی مناسب آن را اضافه کنید. فایل zip را می توانید از اینجا دانلود کنید فایل زیپ را باز کنید در پوشه ی lib چهار عدد فایل jar با نام های
و یک عدد فایل jar در مسیر اصلی فایل با نام ucanaccess-4.0.4 وجود دارد. تمامی 5 فایل باید در پروژه در قسمت مربوط به کتابخانه اضافه شوند (import کردن آن ها ضرورت ندارد).
مانند مثال اتصال به MySql در این مورد هم نیاز به نصب درایور با استفاده از کد زیر است:
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
حالا باید کانکشن بین کد جاوا و فایل database را ایجاد کنیم:
Connection con = DriverManager.getConnection("jdbc:ucanaccess://D:\\AData.accdb");
مشاهده می کنید که نوع ایجاد کانکشن همانند مراحل بالا بوده و فقط نوع url آن متفاوت است.
فایل ذخیره شده در مرحله ی اول را مطابق کد به url اضافه کنید، بعد از بخش jdbc:ucanaccess://
شما باید آدرس فایل را در کد جایگزین نمایید که در اینجا فایل من در مسیر اصلی درایور D قرار دارد .
در این مثال پایگاه داده، چهار ستون به نام های ID، FirstName، LastName و Average ایجاد کرده ام.
همان طور که مشاهده می کنید، جدول با اسم Tbl دارای 2 سطر (رکورد یا ردیف) می باشد که قرار است یک رکورد جدید با استفاده از کد جاوا به جدول اضافه و در پایان تمامی رکوردها را در خروجی نمایش دهد.
با استفاده از کوئری insert یک سطر جدید به جدول اضافه کردیم که خروجی آن را در تصویر زیر مشاهده می کنید.
جدول در محیط Access بعد از اضافه کردن سطر جدید به این شکل است:
package DataBase; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class ConnectToAccess { public ConnectToAccess() { connectAccess(); } public void connectAccess(){ String insert="insert into Tbl values(3,'amir','lotfi',18.63)"; try { Class.forName("net.ucanaccess.jdbc.UcanaccessDriver"); Connection con = DriverManager.getConnection("jdbc:ucanaccess://D:\\AData.accdb"); Statement stm = con.createStatement(); System.out.println("Connect"); boolean add=stm.execute(insert); ResultSet rs= stm.executeQuery("select * from Tbl"); while(rs.next()){ System.out.println(rs.getString(1) + "\t" +rs.getString(2) + "\t" + rs.getString(3)+ "\t" + rs.getDouble(4)); } } catch (ClassNotFoundException | SQLException ex) { System.err.println(ex.getMessage()); } } }
کاربرد ResultSet
و Statement
کاملا شبیه به مثال قبلی است. اما متد execute
، شبیه به متد executeQuery
است، با این تفاوت که عملیات هایی مانند insert یا delete و... نیاز به ResultSet
(در بردارنده ی اطلاعات سطرها) ندارند.
این دستورات یا با موفقیت اجرا یا با خطا مواجه می شوند، پس از متد execute
استفاده می کنیم که خروجی آن به صورت boolean بوده و در صورت موفقیت مقدار true را بر می گرداند که میتوان در جای مناسب از آن استفاده کرد.
متد rs.getDouble(4)
برای گرفتن اطلاعات سطر 4 است. با توجه به این که سطر چهارم از نوع Double می باشد، از این متد استفاده شده و باقی قسمت های برنامه در مثال قبلی توضیح داده شد.
لازم به ذکر است خطا های احتمالی این بخش نیز کاملا مشابه MySql است.
بخش اول آموزش به پایان رسید. در بخش دوم آموزش ایجاد پایگاه داده در NetBeans و ایجاد پایگاه داده در کنار پروژه بدون هیچ برنامه ی خاصی که فوق العاده ترین روش برای ایجاد پایگاه داده است را مورد بررسی قرار داده و در پایان با یک پروژه ی کوچک و کاربردی آموزش را به پایان می رسانیم.
موفق باشید
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.