JDBC

AZEROUG qrupunun 14 Sentyabr görüşü baş tutdu.

Posted on 16 Sentyabr 2013. Filed under: Java, JDBC, Oracle, PL/SQL, SQL | Etiketlər: , , , , , |

14 Sentyabr 2013 tarixində AZEROUG qrupunun növbəti görüşü Azercell Plazada baş tutdu. Təxmini 60 nəfər iştirakçı var idi.

Təşkilati dəstəyə görə Azercell Barama İnnovasiya mərkəzinə təşəkkürümü bildirirəm.

Bu görüşdə Oracle PL/SQL proqramlaşdırma ilə bağlı 2 təqdimat oldu.

Mənim təqdimatım Oracle 12c verilənlər bazasında proqramçılar üçün təqdim edilmiş yeniliklər haqda idi. Təqdimatda SQL, PL/SQL və JDBC ilə bağlı yeniliklər haqda məlumat verdim, VirtualBoxda qurulmuş Oracle 12c bazasında nümunə scriptlər göstərdim.

Təqdimatı buradan yükləyə bilərsiniz.

Görüşdən bəzi şəkillərə baxa bilərsiniz.

Advertisements
Tam Yazını Oxu | Make a Comment ( None so far )

Java proqramından PL/SQL cursorunun istifadəsi

Posted on 19 Fevral 2011. Filed under: Java, JDBC, Oracle, PL/SQL | Etiketlər: , , , , , |

Bu yazıda Java proqramında PL/SQL prosedurunda təyin olunmuş cursor-un istifadəsini izah edəcəm.
Bunun üçün PL/SQL proqramlarında cursor-un nə olduğunu və necə istifadə olunduğunu bildiyinizi fərz edirəm.

Nümunə HR sxeması üzərində belə bir məsələyə baxaq.
Elə bir PL/SQL proqramı yazmaq lazımdır ki, ona verilmiş işçi əgər hansısa bir şöbənin rəhbəridirsə, onda həmin şöbədəki bütün prosedur işçilərin siyahısını qaytarsın. Əgər verilmiş işçi heç bir şöbənin rəhbəri deyilsə, onda özü və əgər varsa, onun tabeliyində olan işçilərin siyahısını qaytarmaq lazımdır. Prosedurdan qayıdan nəticə ona giriş olaraq göndərilmiş işçinin vəziyyətindən asılıdır.
Bu məsələnin cavabı olaraq aşağıdakı PL/SQL proqramını yazmaq olar.

create or replace procedure test_dyn_manager(p_employee_id in number, p_employee_list out sys_refcursor)
is
  l_dept_id number;
  cursor dept_cur 
  is 
    select department_id from departments
    where manager_id=p_employee_id;
begin
  open dept_cur;
  fetch dept_cur into l_dept_id;
  close dept_cur;
  
  if l_dept_id is not null
  then 
    open p_employee_list for 'select employee_id, first_name, last_name, job_id ' ||
      ' from employees where department_id='||l_dept_id || 
      ' order by department_id';      
  else
    open p_employee_list for 
      'select employee_id, first_name, last_name, job_id from employees where manager_id='||p_employee_id ||
      ' union all ' ||
      ' select employee_id, first_name, last_name, job_id from employees where employee_id='||p_employee_id ||
      ' order by employee_id'; 
  end if;
end test_dyn_manager;

Bu prosedurda əvvəlcə işçinin hər hansı bir şöbənin rəhbəri olub olmadığı yoxlanılır.
Əgər şöbə rəhbəridirsə, onda out parametr olaraq təyin olunmuş p_employee_list cursoru həmin şöbədəki işçilərin siyahını verən select sorğusu ilə əlaqələndirilir. Əgər işçi şöbə rəhbəri deyilsə, onda p_employee_list cursoru işçinin özünü və varsa, onun tabeliyindəki işçiləri verən select sorğusu ilə əlaqələndirilir.

Bu proseduru yoxlamaq üçün aşağıda anonim PL/SQL blokunu yazaq.

declare
  --l_emp_id number:= 103; -- Alexander	Hunold IT sobesinin rehberi
  --l_emp_id number := 101; -- Neena	Kochhar sobe rehberi deyil, amma tabeliyinde isciler var   
  l_emp_id number:= 204; -- Hermann Baer rehber deyil, sade iscidir
  l_emp_list sys_refcursor;  
  l_id number;
  l_first_name employees.first_name%type;
  l_last_name employees.last_name%type;
  l_job_id employees.job_id%type;
Begin
  test_dyn_manager(l_emp_id, l_emp_list);
  loop
    fetch l_emp_list into l_id, l_first_name, l_last_name, l_job_id;    
    exit when l_emp_list%notfound;
    dbms_output.put_line('Emp_id=' || l_id || ' first_name=' || l_first_name || ' last_name=' || l_last_name || ' job_id=' || l_job_id);
  end loop;
  close l_emp_list;
end;

İndi isə yazdığımız proseduru Java proqramından çağırıb istifadə edək. Aşağıdakı proseduru çağırmaq üçün lazım olan minimum kod blokunu verirəm. Proqramın tam kodunu yazının sonundakı linkdən proyekti yükləyərək əldə edə bilərsiniz.

            long id = 103;
            String firstName = "";
            String lastName = "";
            String job = "";
            
            String sql = "{call test_dyn_manager(?,?)}";
            callableStatement = connection.prepareCall(sql);
            callableStatement.registerOutParameter(2, OracleTypes.CURSOR);
            callableStatement.setLong(1, id);
            callableStatement.executeUpdate();
            ResultSet rs = (ResultSet) callableStatement.getObject(2);

            while(rs.next()) {
                id = rs.getLong("employee_id");
                firstName = rs.getString("first_name");
                lastName = rs.getString("last_name");
                job = rs.getString("job_id");            
                System.out.print("Id = " + id);
                System.out.print(" employee = " + firstName + " " + lastName);
                System.out.print(" job " + job);
                System.out.println();
            }

Prosedurun 2-ci parametrini out olaraq təyin etmək lazımdır. Bu zaman tip olaraq OracleTypes.CURSOR göstərilməlidir ki, sys_refcursor tipli bu parametrin Javada ResultSet obyekti olaraq oxumaq mümkün olsun.

Ümid edirəm ki, aydın oldu.
Proqramın tam versiyasını aşağıdakı linkdən yükləyə bilərsiniz.
http://www.boxca.com/70cfriqt1gsh/JdbcSysRefCursor.zip.html
Oracle bazasına qoşulmaq üçün lazımi konfiqurasiya məlumatları database.properties faylında yazılıb, öz sisteminizə uyğun dəyişə bilərsiniz.
Prosedurun kodu və test sql, pl/sql sorğuları database.sql faylına yazılıb.

Sual, tənqid və təkliflərinizi şərh olaraq yaza bilərsiniz.
Uğurlar!

Tam Yazını Oxu | Make a Comment ( 4 so far )

Java ilə Oracle PL/SQL proqramlarının istifadəsi

Posted on 15 Fevral 2011. Filed under: Java, JDBC, Oracle, PL/SQL | Etiketlər: , , , , , , |

Bu yazıda Oracle verilənlər bazasındakı PL/SQL prosedur və funksiyalarının Java proqramında istifadəsini göstərəcəyəm.
Nümunə olaraq HR sxemasındakı EMPLOYEES cədvəlini istifadə edəcəyəm.
Əvvəlcə EMPLOYEES cədvəlinə yeni işçi əlavə etmək üçün aşağıdakı PL/SQL prosedurunu yazaq.

create or replace procedure add_employee(
  p_employee_id out employees.employee_id%type,
  p_first_name in employees.first_name%type,
  p_last_name in employees.last_name%type,
  p_email in employees.email%type,
  p_hire_date in employees.hire_date%type,
  p_salary in employees.salary%type,
  p_department_id in employees.department_id%type,
  p_job_id in employees.job_id%type
)
is
begin
  select employees_seq.nextval into p_employee_id from dual;

  -- Oracle 11g bazasında sequence obyektini aşağıdakı kimi istifadə etmək mümkündür. 
  --p_employee_id := employees_seq.nextval;
  
  insert into employees(employee_id, first_name, last_name, email, hire_date, salary, department_id, job_id)
  values( p_employee_id, p_first_name, p_last_name, p_email, p_hire_date, p_salary, p_department_id, p_job_id);
end add_employee;

Bu prosedurda yeni işçiyə aid id sütununun avtomatik generasiyası üçün EMPLOYEES_SEQ obyekti istifadə olunur və onun qiyməti p_employee_id parametrinə mənimsədilib geri qaytarılır. Buna görə də həmin parametr out olaraq təyin edilib.

Bu prosedurunu aşağıdakı anonim PL/SQL bloku ilə yoxlamaq olar.

DECLARE
  l_new_emp_id NUMBER;
BEGIN
  add_employee(p_employee_id => l_new_emp_id, p_first_name => 'Ulvi', p_last_name => 'Qasimov', 
      p_department_id => 60, p_job_id => 'IT_PROG', p_email => 'ulvi@yahoo.com', 
      p_hire_date => to_date('14.02.2011', 'dd.mm.yyyy'), p_salary => 2000);
  dbms_output.put_line('Yeni isci kodu =  ' || l_new_emp_id);
END;

Bu proseduru Java proqramından aşağıdakı kimi çağırmaq olar. Aşağıda ancaq lazımi kod bloklarını yazmışam, proyektin tam versiyasını aşağıdakı linkdən yükləyə bilərsiniz.
Java ilə PL/SQL prosedur və funksiyasını çağırmaq üçün CallableStatement sinifi istifadə olunmalıdır.

String sql = "";
CallableStatement callableStatement = null;
// Yeni isci elave etmek
long id = 0;
String firstName = "Əli";
String lastName = "Əliyev";
String email = "ali@yahoo7.com";
double salary = 2222.0;
String job = "IT_PROG";
Date hireDate = new Date(); // bu gunku tarix
long department = 60;

// ? işarələri parametrləri göstərir, sırasına uyğun olaraq məlumatları vermək lazımdır.
sql = "{call add_employee(?,?,?,?,?,?,?,?)}";
callableStatement =  connection.prepareCall(sql);

// 1-ci parameter <strong>p_employee_id</strong> out parametr olduğuna görə onu ayrıca qeyd etmək lazımdır. 
callableStatement.registerOutParameter(1, Types.INTEGER);
callableStatement.setString(2, firstName);
callableStatement.setString(3, lastName);
callableStatement.setString(4, email);
callableStatement.setDate(5, convert(new Date()));
callableStatement.setDouble(6, salary);
callableStatement.setLong(7, department);
callableStatement.setString(8, job);
// proseduru işlədirik
callableStatement.executeUpdate();
// p_employee_id parametrinin qiymətini çap edirik
id = callableStatement.getLong(1);
System.out.println("Yeni isci kodu = " + id);

Burada bir neçə vacib məqamlar var:
1.JDBC ilə PL/SQL prosedurunu çağırmağın sintaksisi aşağıdakı kimidir:
{call prosedur_adı(parametr1, parametr2, … parametrN)}
Burada hər bir parametr üçün bir sual işarəsi yazılmalıdır.
2.Out parametrlər aşağıdakı kimi təyin edilməlidir:
callableStatement.registerOutParameter(parametr_sira_nomresi, parametr_tipi);
Parametr tipi olaraq java.sql.Types sinifindəki sabit qiymətlərdən uyğun olanı göstərmək lazımdır.
3.executeUpdate() metodu ilə proseduru işlədirik və bundan sonra out parametrlərinin qiymətini oxuyuruq.

İndi isə PL/SQL funksiyasının Java ilə necə istifadə olunmağına baxaq.
Əvvəlcə aşağıdakı kimi sadə bir funksiya yazaq.

create or replace function topla(a in number, b in  number)
return number
is
begin 
  return a+b;
end topla;

Bu funksiyanı Java proqramından aşağıdakı kimi çağıra bilərik.

sql = "{call ? := topla(?,?)}";
callableStatement = connection.prepareCall(sql);
callableStatement.registerOutParameter(1, Types.INTEGER);
callableStatement.setInt(2, 5);
callableStatement.setInt(3, 7);
callableStatement.executeUpdate();
int netice = callableStatement.getInt(1);
System.out.println("Netice = " + netice);

Burada vacib olan məqam funksiyadan qayıdan qiymətin java ilə necə oxunmasıdır.
? := ifadəsində bərabərlikdən əvvəlki ? işarəsi funksiyadan qayıdan qiyməti saxlayan parametrdir və out rejimində təyin edilməlidir.

Ümid edirəm ki, aydın oldu.
Proyektin tam kodunu aşağıdakı linkdən yükləyə bilərsiniz.
http://www.boxca.com/qqsybk73v3ll/JdbcPlsql.zip.html

Tam Yazını Oxu | Make a Comment ( 1 so far )

Java JDBC texnologiyası ilə CLOB və BLOB tipli məlumatlarla işləmək

Posted on 18 İyul 2010. Filed under: Java, JDBC, Oracle, PL/SQL, SQL | Etiketlər: , , , , |

Verilənlər bazasında böyük həcmdə mətn və qeyri mətn(şəkil, musiqi, video və s.) formatında məlumat saxlamaq üçün CLOB və BLOB tipləri istifadə olunur. CLOB(Character Large Object) böyük həcmdə mətn tipli məlumatları, BLOB(Binary Large Object) isə mətn tipli olmayan istənilən məlumatı(video, musiqi, şəkil, MS Office faylları, zip faylları və s.) bazada saxlamaq üçün istifadə olunur.

Java JDBC texnologiyası bütün verilənlər bazalarında CLOB və BLOB tipli məlumatlarla işləmək üçün universal imkan verir. Bu yazıda həmin imkan ətraflı izah ediləcək və nümunə proyekt üzərində əyani şəkildə göstiləcək.

İstifadə olunmuş proqram təminatı aşağıdakı kimidir:

  1. Netbeans 6.9 – open source
  2. Oracle Database 10g R2 Express Edition – pulsuz
  3. Oracle SQL Developer 2.1 – pulsuz

Nümunə olaraq LobManager adlı proyektdə CLOB və BLOB tipli məlumatların bazadan oxunması və yazılması göstəriləcək. Proyekt bloq yazılarında göstərilən kod nümunələrini CLOB olaraq, proqramın ekran görüntüsünü isə BLOB olaraq verilənlər bazasında saxlayan proqramdan ibarət olacaq. Bu proyektdə istifadə olunacaq cədvəlin strukturu aşağıdakı kimidir:

create table program_code(
    id number primary key,
    name varchar2(50), -- name for program source code
    description varchar2(200), -
    source clob, - program source code
    image blob – printscreen
);

İD sütunun primary key olaraq təyin edilmişdir, onun qiymətlərini avtomatik olaraq daxil etmək üçün aşağıdakı kimi bir sequence obyekti yaradaq.

create sequence program_code_seq
minvalue 1
increment by 1;

Əvvəlcə bu cədvələ nümunə məlumat daxil edək. Aşağıdakı anonim PL/SQL kod blokunu Oracle SQL Developer-də işlədək.

declare
 l_new_id number;
begin
 select program_code_seq.nextval into l_new_id from dual;
 insert into program_code(id, name, description) values(l_new_id, 'LobManager', 'Read and write LOB/CLOB data using Java');
 commit;
end;

Oracle 11g VBİS-də sequence obyektini bir başa istifadə etmək mümkündür, amma bu proyektdə Oracle 10g R2 XE istifadə olunduğun görə dual virtual cədvəlindən select etməklə sequence-in qiymətini artırmaq məcburiyyəti var.

CLOB tipli məlumatın bazaya yazılması

Bu tipli məlumatı bazaya yazmaq üçün 2 variant var:

  • ASCII stream
  • Unicode character stream

Məlumatı ASCII stream kimi yazanda unikod hərfləri itir, çünki bu kodlaşdırma sistemində 1 hərf 1 bayt yer tutur, ə,ü,ç,ş,ı,ğ kimi milli hərflərimiz isə bu sistemdə yer almır.
Aşağıda CLOB məlumatını ASCII stream kimi yazmağa aid nümunə kod verilmişdir:

Connection con = ConnectionManager.getConnection();
con.setAutoCommit(false);
String sql = "update program_code set source=? where id=(select max(id) from program_code)";
PreparedStatement ps = con.prepareStatement(sql);
File file = new File("d:\\source.java");
// Use buffered input stream to optimize performance
BufferedInputStream  fin = new BufferedInputStream(new FileInputStream(file));
// Write CLOB as byte stream - unicode characters are lost
ps.setAsciiStream(1, fin, (int)file.length());
int rowCount = ps.executeUpdate();
con.commit();
System.out.println("Write CLOB is successfull. Row count = " + rowCount);
ConnectionManager.close(con);

FileInputStream source.java faylından məlumatı baytlar şəklində oxuyur. Bu fayla proyektdə yer alan ClobManager sinifinin kodlarını yazmışam. Unicode hərflərinin necə yazılacağını yoxlamaq üçün faylın əvvəlində şərh olaraq milli hərflərimizi yazmışam. CLOB məlumatını ASCII stream ilə yazdığımıza görə milli hərflərimiz bazaya səhv yazıldı. Aşağıdakı şəkildə bunu görmək olar.

Tərkibində unikod hərfləri olan məlumatı Character stream kimi yazmaq lazımdır, çünki bu halda milli hərflərimiz düzgün şəkildə baytlara çevrilib yazılır, məlumat itkisi baş vermir. Javada hərflər unikod kodlaşdırma sistemi ilə saxlanılır, ə,ü,ç,ş,ı,ğ kimi milli hərflərimiz bu sistemdə 2 bayt yer tutur.

Aşağıda CLOB məlumatını Unicode Character stream kimi yazmağa aid nümunə kod verilmişdir:

Connection con = ConnectionManager.getConnection();
con.setAutoCommit(false);
String sql = "update program_code set source=? where id=(select max(id) from program_code)";
PreparedStatement ps = con.prepareStatement(sql);
File file = new File("d:\\source.java");
// Use buffered reader to optimize performance
BufferedReader reader = new BufferedReader(new FileReader(file));
// Write CLOB as unicode character stream - unicode characters
ps.setCharacterStream(1, reader, (int)file.length());
int rowCount = ps.executeUpdate();
con.commit();
System.out.println("Write CLOB is successfull. Row count = " + rowCount);
ConnectionManager.close(con);

FileReader sinifi fayldan məlumatları unikod kodlaşdırma sistemi ilə oxuyur. CLOB məlumatını Unicode character stream ilə yazdığımıza görə bu dəfə milli hərflərimiz bazaya düzgün yazıldı. Növbəti şəkildə bunu aydın görmək mümkündür:

CLOB tipli məlumatın bazadan oxunması

Bu tipli məlumatı verilənlər bazasına yazmaq üçün 2 variant var:

  • ASCII stream
  • Unicode character stream

Məlumatı ASCII stream kimi yazanda unikod hərfləri itir, çünki bu kodlaşdırma sistemində 1 hərf 1 bayt yer tutur, ə,ü,ç,ş,ı,ğ kimi milli hərflərimiz isə bu sistemdə yer almır.
Aşağıda CLOB məlumatını ASCII stream kimi oxumağa aid nümunə kod verilmişdir:

Connection con = ConnectionManager.getConnection();
String sql = "select id, name, description, source from program_code where id=(select max(id) from program_code)";
String file = "d:\\clob.txt";
PreparedStatement ps = con.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
rs.next();
System.out.println("ID = " + rs.getLong(1));
System.out.println("Name = " + rs.getString(2));
System.out.println("Description = " + rs.getString(3));
// Use buffered input stream to optimize performance
BufferedInputStream bin = new BufferedInputStream(rs.getAsciiStream(4));
int character;
BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(file));
while((character = bin.read()) != -1) {
 // Write clob data to file
 bout.write(character);
 // Write clob data to console
 System.out.print((char)character);
}
bout.close();
bin.close();
rs.close();
ConnectionManager.close(con);

Aşağıda CLOB məlumatını Unicode Character stream kimi oxumağa aid nümunə kod verilmişdir:

Connection con = ConnectionManager.getConnection();
String sql = "select id, name, description, source from program_code where id=(select max(id) from program_code";
String file = "d:\\clob.txt";
PreparedStatement ps = con.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
rs.next();
System.out.println("ID = " + rs.getLong(1));
System.out.println("Name = " + rs.getString(2));
System.out.println("Description = " + rs.getString(3));
// Use buffered input stream to optimize performance
BufferedReader reader = new BufferedReader(rs.getCharacterStream(4));
int character;
BufferedWriter writer = new BufferedWriter(new FileWriter(file));
while((character = reader.read()) != -1) {
 // Write clob data to file
 writer.write(character);
 // Write clob data to console
 System.out.println(character);
}
writer.close();
reader.close();
rs.close();
ConnectionManager.close(con);

Burada oxuma və yazma əməliyyatlarının performansını artırmaq üçün FileReader obyekti BufferedReader ilə, FileWriter obyekti isə BufferedWriter obyekti ilə birgə istifadə olunmuşdur.

BLOB tipli məlumatı verilənlər bazasına yazmaq

BLOB tipli məlumat baytlardan ibarət olduğuna görə onu bazaya yazmaq üçün binary stream istifadə edilməlidir. Aşağıda BLOB məlumatını bazaya yazmağa aid nümunə kod verilmişdir:

Connection con = ConnectionManager.getConnection();
con.setAutoCommit(false);
String sql = "update program_code set image=? where id=(select max(id) from program_code)";
String file = "d:\\image.png";
PreparedStatement ps = con.prepareStatement(sql);
File file = new File(file);
// Use buffered input stream to optimize performance
BufferedInputStream fin = new BufferedInputStream(new FileInputStream(file));
// Write BLOB as binary stream
ps.setBinaryStream(1, fin, (int) file.length());
int rowCount = ps.executeUpdate();
con.commit();
System.out.println("Write BLOB is successfull. Row count = " + rowCount);
ConnectionManager.close(con);

Burada BLOB tipli məlumat olaraq ekranın printscreen edərək d:\image.png faylına yazmışam, proqram isə həmin şəkli bazaya BLOB olaraq yazır.

BLOB tipli məlumatı verilənlər bazasından oxumaq

BLOB tipli məlumat baytlardan ibarət olduğuna görə onu bazadan oxumaq üçün binary stream istifadə edilməlidir. Aşağıda BLOB məlumatını bazaya yazmağa aid nümunə kod verilmişdir:

Connection con = ConnectionManager.getConnection();
String sql = "select id, name, description, image from program_code where id=(select max(id) from program_code)";
String file = "d:\\blob.png";
PreparedStatement ps = con.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
rs.next();
System.out.println("ID = " + rs.getLong(1));
System.out.println("Name = " + rs.getString(2));
System.out.println("Description = " + rs.getString(3));
// Use buffered input stream to optimize performance
BufferedInputStream bin = new BufferedInputStream(rs.getBinaryStream(4));
int character;
BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(file));
while ((character = bin.read()) != -1) {
 // Write blob data to file
 bout.write(character);
}
System.out.println("BLOB data is written to " + file + " file");
bout.close();
bin.close();
rs.close();
ConnectionManager.close(con);

Bu proqramda isə bazadan oxuduğum BLOB tipli məlumat şəkildir, proqram həmin şəkli d:\blob.png faylına yazır.

Oracle SQL Developerdə həm CLOB həm də BLOB tipli məlumatları asanca görmək mümkündür.

Bizim nümunədə CLOB məlumat ClobManager.java proqram kodudur, onu görmək üçün aşağıdakı SQL sorğusunu işlədin

select * from program_code

Daha sonra source sütununa mouse ilə 2 dəfə vurun, redaktə rejiminə keçəcək və sağ tərəfdə qələm işarəsi çıxacaq. Həmin işarəyə vurduqda isə aşağıdakı şəkildəki kimi View value adlı pəncərə çıxacaq və onun daxilində ClobManager.java kodunu görmək olar.

BLOB tipli məlumatı görmək üçün də eyni qaydada qələm işarəsinə vururuq və açılan View Value pəncərəsinin aşağı hissəsində View as Image checkbox-unu seçməklə bazaya yazdığımız şəkli görə bilərik.

Proyekti  http://www.boxca.com/z27tv2jpcac0/LobManager.zip.html adresindən yükləyə bilərsiniz.

Suallarınız, təklif və tənqidləriniz üçün şərh yaza bilərsiniz. Ümid edirəm ki, faydalı oldu.

Qaynaqlar

1.Oracle® Database JDBC Developer’s Guide and Reference, 10g Release 2 (10.2) Part Number B14355-04

http://download.oracle.com/docs/cd/B19306_01/java.102/b14355/oralob.htm#g1070326

2.Expert Oracle JDBC Programming

http://www.amazon.com/Expert-Oracle-JDBC-Programming-Menon/dp/159059407X

Tam Yazını Oxu | Make a Comment ( 10 so far )

Java proqramından Oracle bazasına SYSDBA olaraq qoşulmaq

Posted on 18 İyul 2010. Filed under: Java, JDBC, Oracle | Etiketlər: , , , , |

Java proqramında Oracle verilənlər bazasında SYSDBA sistem səlahiyyəti ilə qoşulmaq üçün DriverManager sinifinin overload edilmiş getConnection(String url, Properties prop) metodunu istifadə etmək lazımdır. Bu zaman istifadəçi adını, şifrəni və sysdba sistem səlahiyyətini(system privilege) Properties obyektində göstərmək lazımdır. Aşağıda buna aid sadə bir nümunə proqram kodu verilmişdir.

public class ConnectSysdba {

    public static void main(String[] args) throws Exception {
        String driver = "oracle.jdbc.Driver";
        String url = "jdbc:oracle:thin:@localhost:1521:XE";
        Connection con = null;

        // load jdbc driver
        Class.forName(driver);

        // connection info
        Properties info = new Properties();
        info.put("user", "sys");
        info.put("password", "oracle");
        info.put("internal_logon", "sysdba");

        // connect as sysdba
        con = DriverManager.getConnection(url, info);

        // check username
        String sql = "select user from dual";
        PreparedStatement ps = con.prepareStatement(sql);
        ResultSet rs = ps.executeQuery();
        rs.next();
        System.out.println("Username = " + rs.getString(1));
        rs.close();
        ps.close();
        con.close();
     }
 }
Tam Yazını Oxu | Make a Comment ( 2 so far )

Java ilə Excel hesabatının hazırlanması

Posted on 10 Fevral 2010. Filed under: Java, JDBC, Oracle | Etiketlər: , , , , , |

Bu yazıda verilənlər bazasından məlumatları oxuyub Excel faylına yazmaq konkret bir nümunə proyekt üzərində izah edilmişdir.

İstifadə olunan proqramlar:
1.Netbeans 6.7 + Java SDK 1.6
2.Oracle 10g Express Edition Universal (UTF-8 dəstəkli)
3.Apache POİ 3.6 kitabxanası

Yazacağımız proqram aşağıda hissələrdən ibarətdir:

1.Oracle bazasına qoşulmaq
2.HR sxemasındakı bütün işçilər haqqında məlumatları oxumaq
3.İşçi məlumatlarını Excel faylına yazmaq

1-ci bənddə göstərilən Java ilə Oracle bazasına qoşulmaq barədə aşağıdakı yazılara baxın:
https://raminorucov.wordpress.com/2010/01/24/java-ile-oracle-bazasina-qosulmaq/
https://raminorucov.wordpress.com/2010/01/25/java-ile-konfiqurasiya-faylinin-istifadesi/

2-ci bənddə göstərilən Oracle bazasında işçilər haqqında məlumatı oxumaq üçün aşağıdakı yazıya baxın:
https://raminorucov.wordpress.com/2010/02/01/java-ile-oracle-bazasina-melumat-yazmaq-deyismek-ve-silmek/

3-cü bənddə göstərilən işçi məlumatlarını Excel faylına yazmaq məsələsi bu yazıda nümunə proqram üzərində göstəriləcək.

Əvvəlcə bu ünvandan Apache POİ kitabxanasını (cari versiya 3.6) yükləyin http://poi.apache.org/download.html

Netbeans-də yeni proyekt yaradın və Apache POİ-ni qlobal kitabxana kimi əlavə edin (Java ilə Oracle bazasına qoşulmaq yazısında Netbeans-ə qlobal kitabxana əlavə etmək şəkillərlə göstərilmişdir).

İşçi məlumatlarını saxlamaq və idarə etmək üçün aşağıdakı kimi Employee sinifi əlavə edin. Yazıda çox yer tutmasın deyə, get və set metodları aşağıda göstərilməyib.

public class Employee {
private long id;
private String firstName;
private String lastName;
private double salary;
private String job;
private Date hireDate;
private String department;
private String manager;
}

Daha sonra aşağıdakı kimi DbManager sinifi yaradın. Bu sinifin işi aşağıdakılardan ibarətdir:
1.Konfiqurasiya faylından(database.properties) məlumatları oxumaq
2.Oracle bazasına qoşulmaq
3.SQL sorğusu göndərmək və sorğu nəticəsini qaytarmaq
4.Oracle ilə əlaqəni kəsmək

public class DbManager {
private String url;
private String driver;
private String username;
private String password;
private Connection connection;</code>

public void connect() throws Exception {
loadConfiguration();
Class.forName(driver);
connection = DriverManager.getConnection(url, username, password);
}

private void loadConfiguration() throws Exception{
Properties config = new Properties();
config.load(new FileReader("database.properties"));
url = config.getProperty("jdbc.url");
driver = config.getProperty("jdbc.driver");
username = config.getProperty("jdbc.username");
password = config.getProperty("jdbc.password");
}

public ResultSet runQuery(String sql) throws SQLException {
PreparedStatement ps = connection.prepareStatement(sql);
return ps.executeQuery();
}

public void closeConnection() {
try {
if(connection != null &amp;&amp; !connection.isClosed()) {
connection.close();
}
} catch(SQLException sqlException) {

}
}
}

İndi isə aşağıdakı kimi EmployeeReader sinifi yaradın. Bu sinif isə aşağıdakı işləri yerinə yetirir:
1.SQL sorğusunu fayldan oxumaq
2.DbManager sinifindən olan obyektin köməyi ilə Oracle bazaya qoşulmaq
3.İşçiləri oxuyun Employee obyektinə çevirmək və siyahıya əlavə etmək
4.Baza ilə əlaqəni kəsmək
5.İşçilərin siyahısını qaytarmaq

public class EmployeeReader {</code>

private String readSql() throws Exception {
StringBuilder sql = new StringBuilder();
String line = "";
BufferedReader reader = new BufferedReader(new FileReader("EmployeeReport.sql"));
while((line = reader.readLine()) != null) {
sql.append(line + " ");
}
return sql.toString();
}

public List getEmployeeList() {
List employeeList = new ArrayList();
DbManager dbManager = new DbManager();
try {
String sql = readSql();
System.out.println("SQL = " + sql);
dbManager.connect();
ResultSet resultSet = dbManager.runQuery(sql);
while(resultSet.next()) {
Employee employee = new Employee();
employee.setId(resultSet.getLong("employee_id"));
employee.setFirstName(resultSet.getString("first_name"));
employee.setLastName(resultSet.getString("last_name"));
employee.setJob(resultSet.getString("job_id"));
employee.setHireDate(new java.util.Date(resultSet.getDate("hire_date").getTime()));
employee.setSalary(resultSet.getDouble("salary"));
employee.setDepartment(resultSet.getString("department_name"));
employee.setManager(resultSet.getString("manager"));
employeeList.add(employee);
//System.out.println(employee);
}
} catch(Exception exception) {
exception.printStackTrace();
} finally {
dbManager.closeConnection();
}
return employeeList;
}
}

SQL select sorğusu EmployeeReport.sql faylında yerləşir və aşağıdakı kimidir:

SELECT   E.EMPLOYEE_ID,
E.FIRST_NAME,
E.LAST_NAME,
E.JOB_ID,
E.HIRE_DATE,
E.SALARY,
D.DEPARTMENT_NAME,
M.FIRST_NAME || ' ' || M.LAST_NAME MANAGER
FROM         hr.employees e
LEFT JOIN
hr.departments d
ON e.department_id = D.DEPARTMENT_ID
LEFT JOIN
hr.employees m
ON E.MANAGER_ID = M.EMPLOYEE_ID
ORDER BY   d.department_name, e.first_name, e.last_name

SQL sorğusunu proqram kodunda deyil, ayrıca faylda saxlamağın aşağıdakı faydalaları var:
1.Gələcəkdə sütün adlarını eyni saxlamaq şərti ilə, SQL sorğusunu daha da optimallaşdırmaq olar, bu halda dəyişiklik ancaq bir faylda olacaq, proqram heç bir dəyişiklik olmadan işləməyə davam edəcək, əks halda isə proqram kodunda həmin SQL sorğusunu tapmaq, dəyişmək, proyekti kompilyasiya etmək və serverə yenidən deploy etmək lazımdır.
2.SQL sorğusunu Java kodunda yerləşdirmək üçün çoxlu + işarələri lazımdır, SQL kodunu vizual olaraq görmək və oxumaq çətin olur, sorğunu dəyişdirərkən səhv etmə ehtimalı var (xüsusilə SQL sorğusunda , (, ) işarələri olduqda səhv etmə ehtimalı daha yüksəkdir, bir dəfə başıma gəlib 🙂 )

İndi isə ReportManager sinifi əlavə edin. Kod nisbətən çox olduğuna görə hissə hissə göstərib iş prinsipini izah edəcəm.
Bu sinifin işi aşağıdakılardan ibarətdir:
1.Excel hesabatının başlıq sətrini hazırlamaq (şrift və s. özəllikləri hazırlamaq, sütün adlarını yazmaq)
2.Hesabatın sütünlarını hazırlamaq (şrift və s. özəllikləri hazırlamaq, xanalara məlumat yazmaq)
3.Yekun hesabatı Excel faylı olaraq yaddaşa yazmaq

Aşağıdakı kod fraqmentlərinə baxaq.

private List employeeList;
public void setEmployeeList(List employeeList) {
this.employeeList = employeeList;
}

İşçilərin siyahısı employeeList siyahısında saxlanılır və kənardan verilir.

Yeni Excel sənədi (workbook) və onun içərisində yeni səhifə(sheet ) yaradırıq.

HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("Employees");

Yeni stil və font obyekti yaradırıq, font stilini bold olaraq təyin edirik. Bu stil sütün başlıqları üçün istifadə olunacaq.

HSSFCellStyle titleStyle = createTitleStyle(workbook);
private HSSFCellStyle createTitleStyle(HSSFWorkbook workbook) {
HSSFCellStyle titleStyle = workbook.createCellStyle();
HSSFFont font = workbook.createFont();
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
titleStyle.setFont(font);
return titleStyle;
}

Başlıq sətrinin sütün adlarını yazırıq.

HSSFRow titleRow = createTitleRow(sheet);
private HSSFRow createTitleRow(HSSFSheet sheet) {
HSSFRow titleRow = sheet.createRow(0);
titleRow.createCell(0).setCellValue("Employee id");
titleRow.createCell(1).setCellValue("First name");
titleRow.createCell(2).setCellValue("Last name");
titleRow.createCell(3).setCellValue("Job");
titleRow.createCell(4).setCellValue("Hire date");
titleRow.createCell(5).setCellValue("Salary");
titleRow.createCell(6).setCellValue("Department");
titleRow.createCell(7).setCellValue("Manager");
return titleRow;
}

Başlıq sətrindəki sütün adlarına stil veririk.

for(int i=0;i&lt;titleRow.getPhysicalNumberOfCells();i++) {
titleRow.getCell(i).setCellStyle(titleStyle);
}

İşə qəbul olma tarixini gün.ay.il (05.10.2010) formatında yazmaq üçün yeni stil yaradırıq.

HSSFCellStyle dateStyle = createDateStyle(workbook);
private HSSFCellStyle createDateStyle(HSSFWorkbook workbook) {
HSSFCellStyle dateStyle = workbook.createCellStyle();
CreationHelper createHelper = workbook.getCreationHelper();
dateStyle.setDataFormat(createHelper.createDataFormat().getFormat("dd.mm.yyyy"));
return dateStyle;
}

İşçi məlumatlarını sütunlara yazırıq, tarix üçün xüsusi stil tətbiq edirik.

writeReportData(sheet, dateStyle);
private void writeReportData(HSSFSheet sheet, HSSFCellStyle dateStyle) {
for (int i = 0; i < employeeList.size(); i++) {
Employee employee = employeeList.get(i);
HSSFRow dataRow = sheet.createRow(i + 1);
dataRow.createCell(0).setCellValue(employee.getId());
dataRow.createCell(1).setCellValue(employee.getFirstName());
dataRow.createCell(2).setCellValue(employee.getLastName());
dataRow.createCell(3).setCellValue(employee.getJob());
dataRow.createCell(4).setCellValue(employee.getHireDate());
dataRow.getCell(4).setCellStyle(dateStyle);
dataRow.createCell(5).setCellValue(employee.getSalary());
dataRow.createCell(6).setCellValue(employee.getDepartment());
dataRow.createCell(7).setCellValue(employee.getManager());
}
}

Nəhayət ki, hazır Excel sənədini fayla yazırıq 🙂

FileOutputStream fileOut = new FileOutputStream(reportFile);
workbook.write(fileOut);
fileOut.close();

Bütün bu əməliyyatlar uyğun ardıcıllıqla ReportManager sinifindəki createExcelReport metodunda çağırılır.

public String createExcelReport() throws Exception {
String reportFile = "employee-report.xls";</code>

// create Excel workbook and sheet
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("Employees");

HSSFCellStyle titleStyle = createTitleStyle(workbook);
HSSFRow titleRow = createTitleRow(sheet);

HSSFCellStyle dateStyle = createDateStyle(workbook);
// Set column styles to bold
for(int i=0;i&lt;titleRow.getPhysicalNumberOfCells();i++) {
titleRow.getCell(i).setCellStyle(titleStyle);
}

// Write data
System.out.println("Number of rows = " + employeeList.size());
writeReportData(sheet, dateStyle);
autoSizeColumnWidth(titleRow, sheet);

// write to excel file
FileOutputStream fileOut = new FileOutputStream(reportFile);
workbook.write(fileOut);
fileOut.close();

return reportFile;
}

Proyektin Main sinifindəki main metodu isə aşağıkı kimidir

public static void main(String[] args) throws Exception {
EmployeeReader employeeReader = new EmployeeReader();
ReportManager reportManager = new ReportManager();
reportManager.setEmployeeList(employeeReader.getEmployeeList());
String file = reportManager.createExcelReport();
System.out.println("Report file " + file);
}

Proqram kodu nisbətən uzundur, proyektin tam versiyasını aşağıdakı linklərdən yükləyin və yaxşıca analiz edin:
1.Boxca.com-da JavaExcelDemo proyekti
2.JavaExcelDemo proyekti (faylın adını .zip olaraq dəyişin)

Apache POI-HSSF siniflərini ilə Excel 2003 (*.xls), POI-XSSF sinifləri isə Excel 2007 (*.xlsx) faylları hazırlamaq mümkündür.

Apache POİ kitabxanasının imkanları daha çoxdur, Microsoft Word, Excel, Powerpoint, Outlook, Publisher, Visio və s. proqramların yaratdığı faylları emal etmək mümkündür.

Sual və təklifləriniz(yazını təkmilləşdirmək, maraqlandığınız mövzuda yazı təklifi və s.) üçün şərh yazın.
Uğurlar!

Tam Yazını Oxu | Make a Comment ( 8 so far )

Java ilə Oracle bazasına məlumat yazmaq, dəyişmək və silmək

Posted on 1 Fevral 2010. Filed under: Java, JDBC, Oracle | Etiketlər: , , , , , , , |

Əvvəlki Java ilə Oracle bazasına qoşulmaq yazısında Oracle bazasına qoşulan sadə bir Java proqramının yazılmasına baxmışdıq.
Bu yazıda isə onun davamı olaraq Java ilə Oracle bazasına məlumat yazmaq, dəyişmək və silmək əməliyyatlarını nümunə proqram üzərində göstərəcəm.
Yenə HR sxemasındakı EMPLOYEES cədvəlini istifadə olunacaq. Oracle bazasına qoşulmaq üçün Oracle SQL Developer 2.1 proqramı istifadə olunacaq. Məqsədim, mümkün qədər open source və pulsuz proqramları istifadə etməkdir. Proqramı http://www.oracle.com/technology/software/products/sql/index.html səhifəsindən yükləyin.

Əvvəlcə SQL Developer ilə Oracle bazaya qoşulaq.

Yeni əlaqə yaratmaq

Yeni əlaqə yaratmaq

EMPLOYEES cədvəlinin strukturuna baxaq.

Employees cədvəlinin strukturu

EMPLOYEES cədvəlini üzərində olan məhdudiyyətlərə (constraints) baxaq.

Employees cədvəli üzərində təyin olunmuş məhdudiyyətlər (constraints)

Employees cədvəli üzərində təyin olunmuş məhdudiyyətlər (constraints)

Şəkildən göründüyü kimi bu cədvəl üçün 10 məhdudiyyət  təyin edilib. Buradakı məhdudiyyət (constraint) obyektlərinin adlandırılması ilə bağlı qısa şərh versəm, onları başa düşmək daha asan olacaq.

PK – Primary key – təkrarlana və boş ola bilməz, sətri digərlərindən fərqləndirən açardır.

FK – Foreign key – təkrarlana bilər, sütünu başqa cədvəldəki bir sütün ilə əlaqələndirmək üçündür.

UK – Unique key – təkrarlana bilməz, amma boş ola bilər.

NN – Not null –  sütun boş ola bilməz.

EMP_ – employees cədvəlinin qısa adını göstərir.

Employees cədvəli üzərində təyin edilmiş məhdudiyyət obyektləri və onların açıqlaması:

1. EMP_EMP_ID_PK –  employee_id sütunu primary key olaraq təyin edilib.

2. EMP_DEPT_FK – deparment_id sütunu foreign key olaraq təyin edilib və Departments cədvəlindəki department_id ilə əlaqəlidir.

3. EMP_JOB_FK – job_id sütünu foreign key olaraq təyin edilib və – Jobs cədvəlindəki job_id ilə əlaqəlidir.

4. EMP_MANAGER_FK – manager_id sütünu foreign key olaraq təyin edilib və Employees cədvəlindəki employee_id ilə əlaqəlidir, menecer özü də bir işçidir.

5. EMP_EMAIL_UK – email sütünu unique key olaraq təyin edilib, unikal olmalıdır, təkrarlana bilməz, bütün işçilərin email adresi fərqli olmalıdır.

6. EMP_EMAIL_NN – email sütünu üçün not null şərti qoyulub, boş ola bilməz (“EMAIL” IS NOT NULL).

7. EMP_LAST_NAME_NN – last_name sütünu üçün not null şərti qoyulub, boş ola bilməz (“LAST_NAME” IS NOT NULL).

8. EMP_HIRE_DATE_NN – hire_date sütünu üçün not null şərti qoyulub, boş ola bilməz (“HIRE_DATE” IS NOT NULL).

9. EMP_JOB_NN – job_id sütünu üçün not null şərti qoyulub, boş ola bilməz (“HIRE_DATE” IS NOT NULL).

10. EMP_SALARY_MIN – salary sütünu üçün müsbət ədəd olma şərti qoyulub, 0 və mənfi ədəd ola bilməz (salary > 0).

Employees cədvəlinə yeni işçi haqda məlumat əlavə etmək üçün məcburi olan (not null şərti olmayan) sahələr aşağıdakılardır:

1.Employee_id

2.Last_name

3.Email

4.Hire_date

5.Job_id

Aşağıdakı nümunə Java proqramında Employees cədvəlinə yeni işçi haqda məlumat daxil etmək,  onu oxumaq, məlumatlarını dəyişmək və silmək əməliyyatları göstərilmiş, həmçinin lazımi yerlərdə şərhlər yazılmışdır.

package jdbcdemo2;

import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
import java.util.Properties;

/**
*
* @author Ramin Orujov
*/
public class Main {
private static String url;
private static String driver;
private static String username;
private static String password;

public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
String sql = “”;

try {
// bazaya qoşulmaq üçün ıazımi məlumatları konfiqurasiya faylında oxu
loadConfiguration();

// Oracle JDBC drayveri yüklə
Class.forName(driver);
// Bazaya qoşul
connection = DriverManager.getConnection(url, username, password);

// Yeni isci elave etmek
long id = 0;
String firstName = “Əli”;
String lastName = “Əliyev”;
String email = “ali@yahoo.com”;
double salary = 2000.0;
String job = “IT_PROG”;
Date hireDate = new Date(); // bu gunku tarix

// Yeni işçi əlavə etmək üçün SQL sorğusu
// ? işarələri parametrləri göstərir, sırasına uyğun olaraq məlumatları vermək lazımdır.
sql = “insert into employees(employee_id, first_name, last_name, email, hire_date, job_id, salary) ” +
” values(employees_seq.nextval, ?, ?, ?, ?, ?, ?)”;
preparedStatement = connection.prepareStatement(sql);
// 1-ci parametr (? işarəsi) ad
preparedStatement.setString(1, firstName);
// 2-ci parametr (? işarəsi) soyad
preparedStatement.setString(2, lastName);
// 3-cü parametr (? işarəsi) email adresi
preparedStatement.setString(3, email);
// 4-cü parametr (? işarəsi) işə qəbul tarixi
// java.util.Date obyektini java.sql.Date obyektine cevirmek lazimdir
preparedStatement.setDate(4, convert(hireDate));
// 5-ci parametr (? işarəsi) vəzifə kodu
preparedStatement.setString(5, job);
// 6-cı parametr (? işarəsi) maaş
preparedStatement.setDouble(6, salary);

// sql sorğusunu işlədirik, dəyişiklik edilmiş sətir sayını yoxlayırıq
int count = preparedStatement.executeUpdate();
if (count == 1) {
// 1 sətir əlavə edildi, deməli insert uğurlu oldu
System.out.println(“Yeni isci elave edildi”);
} else {
// əks halda məlumat cədvələ əlavə edilmədi
System.out.println(“Problem! Yeni isci elave edilmedi”);
}

// Əlave etdiyimiz işçini ad və soyadına görə tapıb oxumaq
sql = “select employee_id, first_name, last_name, email, hire_date, salary from employees where first_name=? and last_name=?”;
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, firstName);
preparedStatement.setString(2, lastName);
resultSet = preparedStatement.executeQuery();

// Əgər resultset obyektində məlumat varsa, onu oxu
if(resultSet.next()) {
id = resultSet.getLong(“employee_id”);
firstName = resultSet.getString(“first_name”);
lastName = resultSet.getString(“last_name”);
// java.sql.Date obyektini java.util.Date obyektine cevirmek lazimdir
hireDate = convert(resultSet.getDate(“hire_date”));
salary = resultSet.getDouble(“salary”);
System.out.println(“Id = ” + id);
System.out.println(“Employee = ” + firstName + ” ” + lastName);
System.out.println(“Hire date ” + hireDate + ” ” + salary);
System.out.println(“Salary ” + salary);
}

// İşçinin maaşını 20% artırmaq üçün update sorğusu
sql = “update employees set salary=1.2*salary where employee_id=?”;
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setLong(1, id);
count = preparedStatement.executeUpdate();
if (count == 1) {
System.out.println(“Iscinin maasi 20% artirildi”);
} else {
System.out.println(“Problem! Iscinin maasi artirilmadi”);
}

// İşcini silmək üçün SQL sorğusu
sql = “delete employees where employee_id=?”;
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setLong(1, id);
count = preparedStatement.executeUpdate();
if (count == 1) {
System.out.println(“Isci bazadan silindi”);
} else {
System.out.println(“Problem! Isci bazadan silinmedi”);
}

} catch (IOException ex) {
System.out.println(“Konfiqurasiya faylini oxumaqda problem var”);
} catch (ClassNotFoundException ex) {
System.out.println(“Oracle jdbc driver yuklenmedi”);
ex.printStackTrace();
} catch (SQLException ex) {
System.out.println(“Baza ile elaqeli problem var”);
ex.printStackTrace();
} finally {
try {
resultSet.close();
preparedStatement.close();
connection.close();
} catch(SQLException ex) {}
}
}

// bazaya qosulmaq ucun lazimi melumatlari konfiqurasiya faylinda oxumaq
private static void loadConfiguration() throws IOException{
Properties config = new Properties();
config.load(new FileReader(“database.properties”));
url = config.getProperty(“jdbc.url”);
driver = config.getProperty(“jdbc.driver”);
username = config.getProperty(“jdbc.username”);
password = config.getProperty(“jdbc.password”);
}

// java.sql.Date obyektini java.util.Date obyektine cevirmek
private static java.util.Date convert(java.sql.Date sqlDate) {
return new java.util.Date(sqlDate.getTime());
}

// java.util.Date obyektini java.sql.Date obyektine cevirmek
private static java.sql.Date convert(java.util.Date javaDate) {
return new java.sql.Date(javaDate.getTime());
}
}

Netbeansdə hazırlanmış proyektin tam versiyasını buradan yükləyə bilərsiniz.
1. Boxca.com-dan JdbcDemo2 proyekti
2. Əlavədən JdbcDemo2 proyekti (fayl adını .zip olaraq dəyişin).

Aydın olmayan məqamlar üçün suallarınızı və istədiyiniz başqa mövzular üçün təkliflərinizi şərh olaraq yazın.

Uğurlar!

Tam Yazını Oxu | Make a Comment ( 8 so far )

Java ilə Oracle bazasına qoşulmaq

Posted on 24 Yanvar 2010. Filed under: Java, JDBC, Oracle | Etiketlər: , , , |

Bu yazıda Oracle bazasına qoşulan nümunə bir proqramın yazılmasına baxacıq.

İstifadə etdiyimiz proqram təminatı bunlardır:

1.Netbeans 6.7 + Java SDK 1.6
2.Oracle Express Edition universal

Proqram aşağıdakı hissələrdən ibarətdir:

1.Oracle bazasına qoşulmaq
2.Məlumat oxumaq

Java ilə verilənlər bazasına qoşulmaq üçün JDBC (Java Database Connectivity) texnologiyası istifadə olunur. Əvvəlcə qoşulmaq istədiyimiz verilənlər bazasına uyğun olan JDBC drayveri əldə etmək lazımdır. Oracle JDBC drayverini aşağıdakı saytdan yükləmək olar.
http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html
JDBC Driver Downloads siyahısından Oracle bazasının müxtəlif versiyalarına uyğun drayverlər verilmişdir, ən yeni olan Oracle Database 11g Release 2 (11.2.0.1.0) üçün drayveri yükləyək, çünki əvvəlki bütün versiyalar ilə uyğundur. 2-ci səhifədə yuxarıda “Accept License Agreement” seçib lisenziya razılaşmasını qəbul edin və siyahıda 1-ci olan ojdbc5.jar faylını yükləyirik. Əgər Oracle saytına login olmamısınızsa, onda istifadəçi adı və şifrəni soruşacaq. OTN-də qeydiyyatdan keçmisinizsə, istifadəçi adını və şifrənizi yazın, daxil olun, drayveri yükləyin. Əks halda sign up now səhifəsinə gedib qeydiyyatdan keçin, avtomatik olaraq drayveri yükləmə səhifəsinə qayıdacaqsınız.

Netbeansdə yeni java proyekti yaradın.

2-ci səhifədə proyektin adını, yerini seçin, istifadə edəcəyimiz kitabxanaları ayrı qovluqda saxlamaq üçün “Use dedicated folder for storing libraries” seçin və finish düyməsinə vurun.

Yüklədiyimiz Oracle drayveri Netbeansdə qlobal kitabxana kimi əlavə edək, bu halda onu digər proyektlərdə də istifadə etmək olar.

Bunun üçün Tools menyusundan Libraries seçin.

Sol tərəfdə aşağıdakı “New Library” düyməsinə vurun və açılan pəncərədə Oracle_JDBC_Driver yazın.

Kitabxanamız sol tərəfdəki siyahıya əlavə ediləcək, onu seçib sağ tərəfdəki Add JAR/Folder düyməsinə vurun, yüklədiyimiz ojdbc5.jar faylını seçin və OK düyməsinə vurun. Oracle JDBC drayveri artıq qlobal kitabxana olaraq əlavə elədik.

Əlavə etdiyimi kitabxananı proyektə əlavə etmək üçün Windows menyusundan Projects seçin, sol tərəfdə Netbeansdəki proyektlərin siyahısı görünəcək, buradan proyektimizi seçirik, onun Libraries qovluğu üzərində sağ düyməni vurun, kontekst menyudan Add Library seçirik.

Açılan pəncərədən İmport düyməsinə vurub qlobal kitabxanaların siyahısında Oracle_JDBC_Driver seçirik, sıra ilə İmport LibraryAdd Library düymələrinə vururuq, nəticədə Oracle drayver proyektə əlavə olundu.

Əvvəldən qeyd edim ki, Oracle-ın nümunə istifadəçisi olan HR ilə qoşulub, ona aid Employees cədvəli ilə işləyəcik (istifadəçi adı və şifrə hr)

Əvvəlcə proqramın tam mətnini göstərib, daha sonra onun üzərində izah edim.

package jdbcdemo;

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

public class Main { 
	public static void main(String[] args) {
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null; 
		try {
			Class.forName("oracle.jdbc.OracleDriver");
			String url = "jdbc:oracle:thin:@localhost:1521:XE";
			String username="hr";
			String password="hr";
			connection = DriverManager.getConnection(url, username, password); 
			String sql = "select employee_id, first_name, last_name, salary from employees";
			preparedStatement = connection.prepareStatement(sql);
			resultSet = preparedStatement.executeQuery();
			while(resultSet.next()) {
				long id = resultSet.getLong("employee_id");
				String firstName = resultSet.getString("first_name");
				String lastName = resultSet.getString("last_name");
				System.out.println("" + id + " " + firstName + " " + lastName);
			}
		} catch (ClassNotFoundException ex) {
			System.out.println("Oracle jdbc driver yuklenmedi");
			ex.printStackTrace();
		} catch (SQLException ex) {
			System.out.println("Baza ile elaqeli problem var");
			ex.printStackTrace();
		} finally {
			try {
				resultSet.close();
				preparedStatement.close();
				connection.close();
			} catch(SQLException ex) {}
		}
	}
} 

İndi isə proqramı hissə hissə başa salım.

Class.forName("oracle.jdbc.OracleDriver"); Oracle drayveri yaddaşa yükləyir, əgər drayver tapılmasa, bu halda ClassNotFoundException xətası yaranacaq, onu try-catch bloku ilə tutub istifadəçiyə xəta mesajı göstərmək lazımdır.

String url = "jdbc:oracle:thin:@localhost:1521:XE";<br />
String username="hr";<br />
String password="hr";<br />
connection = DriverManager.getConnection(url, username, password);

Bu hissədə Oracle bazaya qoşuluruq.
Qoşulma sətrinin formatı belədir: jdbc:oracle:thin:@Oracle_Server:PORT:ORACLE_SERVİS_ADI
Bizim proyektdə ORACLE_SERVER=localhost yazılıb, çünki Oracle eyni işləyir, əgər başqa kompüterdə yüklü olan Oracle serverə qoşulmaq istəyiriksə, bu halda ya onun İP adresini, ya da şəbəkədəki adını yazmaq lazımdır.
Port = 1521, əgər dəyişiklik edilməyibsə, Oracle server avtomatik olaraq 1521-ci portdan gələn sorğuları qəbul edir.
ORACLE_SERVİS_ADI=XE, bir serverdə birdən çox Oracle baza qurulu ola bilər, onların hər birinin ayrı servis adı ilə işləyir, bu misalda servis adı=XE
Qoşulmaq üçün DriverManager sinifinin getConnection metodu istifadə olunur, ona parametr olaraq qoşulma sətri, istifadəçi adı və şifrə göndərilir. Əgər qoşulma zamanı hər hansı bir xəta baş versə, bu halda SQLException xətası yaranacaq və onu try-catch bloku ilə tutub, istifadəçiyə uyğun xəta mesajı göstərmək lazımdır.

String sql = "select employee_id, first_name, last_name, salary from employees";
preparedStatement = connection.prepareStatement(sql);
resultSet = preparedStatement.executeQuery();

Burada sadə bir SQL sorğusu verilib, işçilərin kodunu, ad, soyadını və maaşını öyrənmək istəyirik.
PreparedStatement sinifini ilə bazaya istənilən sorğunu göndərmək mümkündür, executeQuery metodu ilə bazaya select sorğusu göndərmək olur.
executeQuery metodu cavab olaraq resultSet obyekti qaytarır və bu obyektdə cədvəldən seçdiyimiz məlumatlar saxlanılıb.

while(resultSet.next()) {
    long id = resultSet.getLong("employee_id");
    String firstName = resultSet.getString("first_name");
    String lastName = resultSet.getString("last_name");
    System.out.println("" + id + " " + firstName + " " + lastName);
}

Bu kod blokunda isə resultSet obyektindən məlumatları oxuyub konsolda göstəririk.

Ən sonda isə finally bloku ilə resultSet, preparedStatement və connection obyektlərini bağlayıb, baza ilə əlaqəni kəsirik.

finally {
   try {
      resultSet.close();
      preparedStatement.close();
      connection.close();
   } catch(SQLException ex) {}
}

Yazının sonuna gəldik, ümid edirəm ki, hər şey aydın oldu. Qaranlıq qalan məqamlar üçün şərh yazmaqdan çəkinməyin.

Proyektin tam versiyasını buradan yükləyə bilərsiniz.
Proyektin tam variantı
Zip faylının yüklənməsinə icazə verilmədiyinə görə faylın adını jdbdemo.doc olaraq dəyişdim, odur ki, kompüterinizə yüklədikdən sonra jdbcdemo.zip olaraq dəyişin.

Boxca.com-dan yükləmək üçün http://www.boxca.com/vkyeegmu6fkh/JdbcDemo.zip.html


Bazaya məlumat yazmaq, dəyişmək və silmək növbəti yazılarda olacaq.
Uğurlar!

Tam Yazını Oxu | Make a Comment ( 22 so far )

    Haqqında

    Java ilə obyekt yönlü proqramlaşdırma, Java web proqramlaşdırma, Oracle SQL, PL/SQL proqramlaşdırma, optimallaşdırma

    RSS

    Subscribe Via RSS

    • Subscribe with Bloglines
    • Add your feed to Newsburst from CNET News.com
    • Subscribe in Google Reader
    • Add to My Yahoo!
    • Subscribe in NewsGator Online
    • The latest comments to all posts in RSS

    Meta

Liked it here?
Why not try sites on the blogroll...