JDBC

Java Data Base Connectivity ---> JDBC

JDBC nədir?

Başlamadan öncə MÜTLƏQ bu linkdəki SQL Sorğularını öyrənin

JDBC - Java DataBase Connectivity (Java Verilənlər Bazası əlaqəsi ) mənasını verir və Java programlaşdırma dili ilə Verilənlər bazası arasında müstəqil əlaqəni təmin edən bir API dır. API- Application Proframming Interface - bir application/servis/platformanın(Youtube, MailChimp, Facebook, Google, Wordpress, DigitalOcean, Grav, Nginx, Ubuntu, Android ...) sahib olduğu yetənəklərin(behaviors) xaricdən , icazə verilən məhdudlaşdırmalar daxilində  istifadəsini təmin edən bir interface-dir.

JDBC arxitekturası

 JDBC arxitekturası 2 hissəyə ayrılır:
  • JDBC API - Application ilə JDBC manager arasındakı əlaqəni təmin edir
  • JDBC Driver API - JDBC manager ilə Driver əlaqəsini dəstəkləyir. Aşağıdakı diaqram bunu daha ətraflı izah edir:

 

  Ümumi JDBC komponentləri 

  • Driver Manager - Bu class, Verilənlər bazası sürücülərinin siyahısını idarə edir
  • Driver - Bu interface, verilənlər bazası ilə əlaqəni ələ alır. Driver obyektləri ilə çox nadir hallarda iş görürük. Bunun əvəzinə, bu tipin obyektlərini dəstəkləyən  DriverManager obyektindən istifadə edirik. 
  • Connection - Bu interface, bütün metodları ilə verilənlər bazası ilə əlaqə qurmaq üçün istifadə edilir
  • Statement- SQL sorğularını bazaya göndərmək üçün bu interface-nin obyektlərindən istifadə edirik. 
  • ResultSet- Statement obyektlərindən istifadə edərək SQL sorğusunu işlətdikdən dərhal sonra, bazadan alınan dataları tutmaq üçün istifadə olunur. 
  • SQLException- Bu class, bir baza applicationunda qarşımıza çıxa biləcək Checked Exceptionları bir araya toplayır
 Bura qədər ancaq sıxıcı nəzəriyyə ilə rastlaşdıq. Burdan sonra daha çox pratik yönümlü kodlar yazacağımızdan yuxarı hissəni rahat başa düşəcəksiniz :-D

Öz sözlərimizlə desək, Əvvəllər biz məlumatı fayllara yazırdıq. Bu isə öz özlüyündə səliqəli oxumada və məlumatların istifadəsində çətinlik yaradır. Bu tipli situasiyalarda isə cədvəllərdən istifadə daha məqsədəyönümlüdür. Buna görə də məlumatı fayllara yox cədvəllərə daha dəqiq desək .sql sonluqlu bazalarda saxlasaq işimiz daha rahat olar. Yəni SQL olması şərt deyil, MongoDB, BigData ola bilər və s. Və ya hər hansısa SQL server ola bilər məsələn MySQL, Oracle SQL,MS SQL Server və s. Biz bu dərslərimizdə MySQL i örnək götürəcəyik. Siz öz istəyinizdən asılı olaraq istədiyinizi seçə bilərsiniz.

Artıq ümumi məlumatı verdiyimizə görə başlaya bilərik. 

JDBC aşağıdakı mərhələlərlə aparılır:


  1. import the package --- paketi import et                    java.sql.*
  2. Load and Register the Driver                 forName("com.mysql.jdbc.Driver")
  3. Establish the Connection ----Connection yarat
  4. Create the Statement --- Statement yarat . 3 tip Statement mövcuddur:           Statement         PreparedStatement             CallableStatement
  5. Execute the query  --- Sorğunu işə sal
  6. Process Result      ---Prosesin nəticəsi
  7. Close --- Bağla
İndi bizim işimiz yuxarıda saydığımız mərhələləri kod şəklində yazmaqdır

1. Paketləri daxil edək:
import java.sql.*;  

Bir bazayla işləmək istəyiriksə, məntiqi olaraq ilk öncə o bazaya qoşulmaq lazımdır. Bazaya qoşulmaq üçün connect() adlı bir metod yazaq:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
public static Connection connect() throws Exception
    {
        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/University";
        String userName = "root";
        String passWord = "123456";
        Connection connection = DriverManager.getConnection(url,userName,passWord);
        return connection;

    }

Class.forname() ---  com.mysql.jdbc.Driver classını load eləmək üçün istifadə olunur. Ancaq yuxarıdakı kodu biz run etsək bizə exception atacaq səbəbi İDE nin com.mysql.jdbc.Driver - ı tanımamasıdır. Bunun üçün nə etməliyik. Bu linkdən  biz jar.zip faylı yükləyib daha sonra onu extract edib .jar faylı əldə etməliyik. Hər İDE nin işləmə prinsipi fərqlidir məsələn NetBeans özü built-in olaraq bu library-ni verir. Amma mən İntellij istifadə edirəm. Bu problemi aradan qaldırmaq üçün öz workspace-də proyekti tapıram və onun içərisinə bu .jar faylı atıram. Daha sonra İDE nin daxilindən Module Settings daha sonra Libraries hissəsindən "+"-a basmaqla bu libraryni bayaqki lib qovluğunun içərisindən tapıb əlavə edirəm və apply edirəm. Budur problem həll olundu.

String url --- Bu mənim göndərəcəyim bazanın adresidir. Hər bir server üçün fərqli ola bilir. Məsələn yuxarıdakı kod parçasında biz MySQL i nümunə götürmüşük. localhost mənim öz komputerim olduğunu göstərir hansı ki, TCP dərsində buna toxunmuşduq. 3306 mənim port adresimdir. mysql yüklənən zaman bu default olaraq gəlir sonradan dəyişdirilməsi mümkündür. University isə qoşulacağım əsas bazanın adıdır. Diqqətli olun - Bazanın(Database) adıdır Table-in yox

String userName --- Bu mənim istifadəçi adımdır. MySQL qurulan zaman default olaraq "root" istifadəçisi yaradılır hansı ki, bu əsas sistem istifadəçisidir. İstəsəz sonradan özünüz yenisini yarada bilərsiniz.

String passWord ---"root" istifasəçisinin şifrəsini göstərir.

Connection connection --- Ən önəmli hissə. Bazaya qoşulmaq üçün istifadə olunan interfeys. İnterface olduğundan "new" ilə obyektini yaratmaq mümkün deyil amma bunun əvəzinə biz DriverManager -in köməyi ilə connection - a "dəyər" verə bilirik. Gördüyümüz kimi DriverManager.getConnect()- metodu 3 dəyişən aldı və lazım olan bazaya qoşula bildi
və sonda həmin connection - u return elədi.

Uğurla Bazaya qoşulduq. Bazaya qoşulmaq üçün Statement istifadə etmədik çünki hələlik heç bir SQL sorğusunu execute etməyə ehtiyac duymadıq. Sadəcə olaraq bazaya qoşulduq.

İndi qoşulmaq istədiyim bazada(University) olan bir table-a nəzər yetirək. Table-ın adı MOCK_DATA.


Deməli bizim bir MOCK_DATA table-mız var. Java dilində desək MockData class-mız. Bu MOCK_DATA nın 3 columnu var. Java dilində desək 3 dəyişəni(variable). Bunlar id hansı ki tipi int dir. Java da olan qarşılığı da elə int olacaq. ikincisi first_name hansı ki varchar tipindədir biz buna Java da String deyə bilərik.
Buna görə də gəlin MockData adında bir class yaradaq. və OOP ə əməl edək. Səbəbini daha sonra biləcəyik. Harada işimizə yarayacağı daha sonra bəlli olacaq.






 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public class MockData
{
    private int id;
    private String firstName;
    private String lastName;

    public MockData(int id, String firstName, String lastName)
    {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public int getId()
    {
        return id;
    }

    public void setId(int id)
    {
        this.id = id;
    }

    public String getFirstName()
    {
        return firstName;
    }

    public void setFirstName(String firstName)
    {
        this.firstName = firstName;
    }

    public String getLastName()
    {
        return lastName;
    }

    public void setLastName(String lastName)
    {
        this.lastName = lastName;
    }

    @Override
    public String toString() {
        return
                "id=" + id +
                ", firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'';
    }
}
Bayaq Bazaya qoşulduq. İndi isə gəlin Bazadan məlumat çəkək.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public static List<MockData> getAllMockData() throws Exception
    {
        List<MockData> result = new ArrayList<>();
        try(Connection con = Database.connect();)
        {
            Statement st = con.createStatement();
            st.execute("SELECT * FROM MOCK_DATA ");
            ResultSet rs = st.getResultSet();
            while(rs.next()){
                int id = rs.getInt("id");
                String name = rs.getString("first_name");
                String surname = rs.getString("last_name");
                result.add(new MockData(id,name,surname));
            }





        }
        catch(Exception ex){
            ex.printStackTrace();
        }
        return result;

    }

Təbii olaraq biz sorğudan birdən çox nəticə ala bilərik. Və biz MOCK_DATA table-a qoşuluruq və biz onun yerini tutması üçün MockData class-ı yaratmışıq.
Həmin o alacağım 1-dən çox nəticəni mən bir List də toplamaq istəyirəm. Ona görə də  Line 3-də bir List yaratmışam.
Dərsin girişində dediyimiz kimi bizə SQLException atıla bilər buna görə də iki yolumuz var. Ya try,catch ya da   throws dan istifadə etməkdir. Biz burda Try-with-resources istifadə etdik çünki yuxarıda 7 mərhələ saymışdıq və onlardan 7-si connectionu bağlamaq idi ona görə də biz Try-with-resources işlətdik.

Daha sonra,biz artıq sorğunu execute etməliyik buna görə də statement-ə ehtiyac var.Statement özü də bir interface olduğundan birbaşa dəyər atamaq mümkün deyil

No comments:

Post a Comment