اتصال به انواع پایگاه داده در جاوا – بخش دوم

java-database-login-form

با سلام خدمت کاربران عزیز روکسو، در قسمت اول این آموزش اتصال به پایگاه داده ی Access و MySQL را مورد بررسی قرار دادیم.

در این بخش ابتدا به آموزش اتصال به پایگاه داده NetBeans می پردازیم و در انتها، یک پروژه و ساخت یک فرم Login ساده را مورد بررسی قرار می دهیم.

اتصال به پایگاه داده در NetBeans

توجه: طبق گفته ی شرکت سازنده ی Netbeans این پایگاه داده بر اساس MySql بوده و تمامی دستورات آن مطابق MySql است.

قبل از ایجاد پروژه و کدنویسی باید یک پایگاه داده و جدول در Netbeans ایجاد کنید.

مطابق شکل زیر به سربرگ Window و قسمت services رفته و از پنجره ی باز شده بر روی قست Java DB راست کلیک کرده و گزینه ی Create Database را انتخاب کنید.

انتخاب گزینه services

ایجاد کردن Database

مانند هر پایگاه داده ای باید برای آن نامی انتخاب کنید و در صورت نیاز نام کاربری و رمز عبور آن را مشخص کنید.

بعد از چند لحظه پایگاه داده ایجاد شده مانند شکل زیر قابل دسترسی است.

مشاهده ی Database ایجاد شده

در اینجا نام پایگاه داده ی من DB و نام کاربری و رمز عبور آن root و پورت اتصال آن 1527 است؛ بر روی آن راست کلیک کرده و گزینه ی Connect را انتخاب کنید تا به دیتابیس متصل شوید مطابق شکل زیر یک جدول مطابق با نیاز خود ایجاد کنید.

ایجاد جدول در Database

خب کار با این بخش به پایان رسید.

مطابق آموزش قسمت قبل مهم ترین بخش، ایجاد کانکشن و اتصال به پایگاه داده بوده و بقیه ی قسمت ها کاملا مشابه با قسمت قبلی آموزش است.

یک پروژه ی جدید ایجاد کنید و در قسمت Libraries راست کلیک و گزینه ی Add Library را انتخاب کنید. توجه کنید که این کتابخانه ها نیاز به دانلود و import ندارند و جز کتابخانه های اصلی جاوا هستند.

Libraries List

در لیست کتابخانه هایی که مشاهده می کنید MySQL JDBC Driver و Java DB Driver را به پروژه اضافه کنید، مطابق شکل زیر باید 4 آیتم به بخش کتابخانه ها اضافه شوند.

کتابخانه های اضافه شده در قسمت کتابخانه ی پروژه

کد نوشته برای نصب درایور و ایجاد کانکشن به این صورت است.

package DataBase;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.*;
public class ConnectToNetbeans {
    Connection con=null;

    public ConnectToNetbeans() {
        Connect();  
    }
    private void Connect(){
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:derby://localhost:1527/DB","root","root");
            System.out.println("connect");
        } catch (ClassNotFoundException | SQLException ex) {
            System.err.println(ex.getMessage());
        }
    }

قسمت مربوط به نصب درایور که کاملا شبیه قسمت قبل بوده و فقط اسم درایور آن متفاوت است.

رشته ی نوشته شده در قسمت ایجاد کانکشن jdbc:derby://localhost:1527/DB مربوط به عکس شماره 3 هست که باید دقیقا کپی شود و root اولی نام کاربری و root دومی رمز عبور پایگاه داده است که در زمان ایجاد، برای آن در نظر گرفتم.

استفاده از Statement ها و Result set ها و به طور کلی دستورات Sql با کد جاوا، برای هر نوع پایگاه داده ای یکسان است و فقط نوع درایور ،اتصالات و کتابخانه ی آن ها متفاوت است.

چنانچه به دستورهای زبان SQL‌ مسلط نیستید لطفا دوره آموزش SQL‌ را که به صورت رایگان منتشر شده است مطالعه بفرمایید:

ایجاد و اتصال به پایگاه داده در کنار پروژه

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

قبل از هر کاری کتابخانه ی مورد نیاز با نام derby.jar را حتما از اینجا دانلود کنید؛

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

بنابراین این کتابخانه را در قسمت کتابخانه ی پروژه ای که ایجاد کرده اید، اضافه کنید. برای تولید یک فرم Login ساده یک کلاس از نوع Jframe Form در پروژه ی خود ایجاد و آن را به شکل زیر پیاده سازی کنید .

عکس کلاس Jframe با طراحی فرم Login

نوع کامپوننت های به کار برده شده در فرم و اسم آنها (ID) مطابق کد زیر است .

    private javax.swing.JButton BtnCancel;
    private javax.swing.JButton BtnLogin;
    private javax.swing.JPasswordField JTXTPass;
    private javax.swing.JTextField JTXTUser;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JPanel jPanel1;Com

یک کلاس جدید (فاقد متد Main) ایجاد و فیلدها و متدهای زیر را به آن اضافه کنید.

private Connection con = null;
private static final String  DB_URL = "jdbc:derby:database;create=true";
private static Statement stm =null;

فیلد از نوع رشته ای با نام DB_URL را می توان مهم ترین قسمت کد در نظر گرفت. کلمه ی database در واقع نام دیتابیس است و شما می توانید آنرا تغییر دهید .عبارت create=true در واقع اجازه ی ساخت دیتابیس را صادر می کند.

دیتابیس ساخته شده از قسمت File در منوی سمت چپ Netbeans در پوشه ای هم نام با پروژه قابل دسترسی است .(در صورت پیدا نکردن این بخش به سربرگ Window رفته و گزینه ی File را انتخاب کنید یا در صفحه کلید Ctrl+2 را بزنید تا منو ظاهر شود)

مشاهده ی database ایجاد شده در قسمت file

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

void CreateConnection(){
        try {
            Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
            con = DriverManager.getConnection(DB_URL);
            System.out.println("Database Create");
        } catch (ClassNotFoundException | SQLException ex) {
            System.err.println(ex.getMessage());
        }
     }

به قسمت org.apache.derby.jdbc.EmbeddedDriver توجه کنید که وظیفه ی نصب درایور را بر عهده دارد.

خب تا اینجا پایگاه داده ساخته شد حالا باید درون آن، جدول ایجاد کنیم که توسط تابع زیر این کار انجام می شود؛ توجه داشته باشید که کلیه ی تغییرات در این روش باید به صورت کد نویسی انجام شود.

public void CreateTable(){
         String TABLE_NAME = "TLogin";
         String SQLTable="create table " + TABLE_NAME + "("
                 +"ID char(5) primary key,\n"
                 +"Username varchar(100),\n"
                 +"Password varchar(100)"+")";
        try {
            stm=con.createStatement();
            DatabaseMetaData dtm=con.getMetaData();
            ResultSet set = dtm.getTables(null, null, TABLE_NAME.toUpperCase(), null);
            if(set.next()){
                System.out.println("table:"+ TABLE_NAME+" already exist");
            }else{
              stm.execute(SQLTable);
            }
        } catch (SQLException ex) {
            System.err.println(ex.getMessage());
        }   
     }

فیلد TABLE_NAME نام جدول و فیلد SQLTable دستور ایجاد جدول را دربر دارد؛ واسط DatabaseMetaData و متد  getTables که خروجی آن به صورت ResultSet است در واقع بررسی می کنند که آیا جدولی با این نام موجود است یا خیر که توسط set.next بررسی می شود.

در واقع اگر ResultSet توانست بر روی سطر های جدول حرکت کند پس جدول قبلا ایجاد شده و دستور داخل if اجرا می شود (خروجی set.next از نوع boolean است) در غیر این صورت بخش else اجرا شده که نتیجه ی آن ساختن جدول است؛

توجه داشته باشید که این جدول دارای 3 ستون با نام های ID, username و password است.

متد زیر دارای دو وردی از نوع String می باشد که به ترتیب نام کاربری و رمزعبور وارد شده در JTextField و JPasswordField خواهد بود.

 public boolean checkUser(String user,String pass){
         String SqlCmd="select * from TLogin";
        try {
            stm=con.createStatement();
            ResultSet set = stm.executeQuery(SqlCmd);
            while(set.next()){
                String username = set.getString("Username");
                String password = set.getString("Password");
                if(username.equals(user) && password.equals(pass)){
                    return true;
                }
            }
        } catch (SQLException ex) {
            System.err.println(ex.getMessage());
        }
        return false;
     }

با استفاده از کوئری select کل جدول بررسی می شود در صورتی که username و password موجود در یک سطر جدول با username و password  وارد شده در فیلدهای فرم یکی باشند مقدار true ( دستورات داخل if اجرا می شود ) و در صورت عدم برابری مقدار false توسط متد بازگردانده می شود.

از آنجایی که نمی توان به صورت مثال های قبلی به جدول رکورد اضافه کنیم باید توسط یک تابع کمکی این کار را انجام دهیم.

public void InsertUser(){
         String SqlCmd ="insert into TLogin values('100','root','1234')";
        try {
            stm=con.createStatement();
            stm.execute(SqlCmd);
            System.out.println("add");
        } catch (SQLException ex) {
            
        } 
     }

من در اینجا یک user با نام کاربری root  و رمزعبور 1234 و ID=100 اضافه کردم.

توجه داشته باشید که ستون ID در این جدول از نوع primary key بوده و نمی توان رکوردی جدید با ID مشابه در این جدول ایجاد کرد.

نسخه کامل کدهای بالا به این صورت است.

package loginform;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DatabaseHandler {
private Connection con = null;
private static final String  DB_URL = "jdbc:derby:database;create=true";
private static Statement stm =null;

    public DatabaseHandler() {
        CreateConnection();
        CreateTable();
        InsertUser();
    }
    
         void CreateConnection(){
        try {
            Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
            con = DriverManager.getConnection(DB_URL);
            System.out.println("Database Create");
        } catch (ClassNotFoundException | SQLException ex) {
            System.err.println(ex.getMessage());
        }
     }
     public void CreateTable(){
         String TABLE_NAME = "TLogin";
         String SQLTable="create table " + TABLE_NAME + "("
                 +"ID char(5) primary key,\n"
                 +"Username varchar(100),\n"
                 +"Password varchar(100)"+")";
        try {
            stm=con.createStatement();
            DatabaseMetaData dtm=con.getMetaData();
            ResultSet set = dtm.getTables(null, null, TABLE_NAME.toUpperCase(), null);
            if(set.next()){
                System.out.println("table:"+ TABLE_NAME+" already exist");
            }else{
              stm.execute(SQLTable);
            }
        } catch (SQLException ex) {
            System.err.println(ex.getMessage());
        }
         
     }
     public boolean checkUser(String user,String pass){
         String SqlCmd="select * from TLogin";
        try {
            stm=con.createStatement();
            ResultSet set = stm.executeQuery(SqlCmd);
            while(set.next()){
                String username = set.getString("Username");
                String password = set.getString("Password");
                if(username.equals(user) && password.equals(pass)){
                    return true;
                }
            }
        } catch (SQLException ex) {
            System.err.println(ex.getMessage());
        }
        return false;
     }
     public void InsertUser() {
        String SqlCmd = "insert into TLogin values('100','root','1234')";
        try {
            stm = con.createStatement();
            stm.execute(SqlCmd);
            System.out.println("add");
        } catch (SQLException ex) {

        }
    }
}

در کلاسی که از نوع Jframe form ایجاد کردید یک شئ از کلاس قبل بسازید و در بخش مربوط Action کلید ورود، تابع checkUser را استفاده کنید.(مطابق شکل زیر)

بخش Action

قسمت مربوط به Action و کدهای آن

خروجی پروژه

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

نکته 1: کلیه ی خطاهای احتمالی در مبحث پایگاه داده با استفاده از برنامه نویسی جاوا کاملا مشابه یکدیگر بوده که در قسمت اول آموزش به طور کامل به آن ها اشاره شد.

نکته  2: هدف از این آموزش بررسی دستورات پایگاه داده و ایجاد صفحه ی Login نبوده و آموزش آن ها در این بخش به صورت جداگانه انجام شده است؛

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

موفق باشید.

نویسنده شوید

دیدگاه‌های شما (2 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

مهدی
20 مرداد 1399
سلام. من در قسمت کد نوشته شده برای نصب درایور مشکل دارم الان باید اون کد تو کلاس اصلی باشه یا یه کلاس جدید یا یه jform میزنمیم؟ بعد اینجا ConnectToNetbeans اسم کلاستونه؟

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

morteza
25 خرداد 1399
سلام من در اولش مشکل دارم اصلا create database غیره فعاله واسم چکار کنم ؟

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.