08 java programming jdbc postgresql
TRANSCRIPT
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 1
JDBC & POSTGRESQLNguyễn Hoàng Anh - [email protected]
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 2
Nội dung trình bày● JDBC API● Kiến trúc JDBC ● Thiết lập kết nối đến cơ sở dữ liệu● Statement ● PreparedStatement● CallableStatement ● PostgreSQL – Function
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 3
JDBC API● JDBC API là tập các Java API được sử dụng
để tương tác với cơ sở dữ liệu quan hệ.● Công dụng
● Kết nối cơ sở dữ liệu quan hệ.● Gửi các câu truy vấn đến cơ sở dữ liệu.● Nhận và xử lý các kết quả trả về từ cơ sở dữ liệu
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 4
Kiến trúc JDBC
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 5
Kiến trúc JDBC● Khi làm việc với JDBD, java developer sẽ làm việc như nhau
đối với các hệ cơ sở dữ liệu khác nhau.
● Java developer không phụ thuộc vào một hệ cơ sở dữ liệu cụ thể nào.
● Java developer không cần phải quan tâm đến sự khác nhau khi giao tiếp với các hệ quản trị cơ sở dữ liệu quan hệ khác nhau.
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 6
Thiết lập kết nối đến cơ sở dữ liệu● Bước 1: Thêm thư viện JDBC Driver vào ứng dụng
● Bước 2: Đăng ký Driver - PostgreSQL
Cách 1: Class.forName :
Class.forName(“org.postgresql.Driver”);
Cách 2: DriverManager.registerDriver
Driver driver = new org.postgresql.Driver()
DriverManager.registerDriver(driver);
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 7
Thiết lập kết nối đến cơ sở dữ liệu● PostgreSQL
→ Database: BookOnline
→ user: postgres , password: 123456
→ port: 5432 (default)
→ server: localhost● Java
→ url: jdbc:postgresql://localhost:5432/BookOnline
→ user: root , password: 123456
→ characterEncoding: utf-8
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 8
Thiết lập kết nối đến cơ sở dữ liệu
123456789101112
Driver driver = new org.postgresql.Driver();DriverManager.registerDriver(driver);String conString= "jdbc:postgresql://localhost:5432/BookOnline";Properties info = new Properties();info.setProperty("characterEncoding", "utf8");info.setProperty("user", "postgres");info.setProperty("password", "123456");Connection connection = DriverManager.getConnection(conString, info);. . .connection.close();
12
import java.sql.*; import java.util.*;
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 9
Thiết lập kết nối đến cơ sở dữ liệu● Sau khi thiết lập kết nối đến cơ sở dữ liệu, có
thể ● Gửi các câu truy vấn đến cơ sở dữ liệu.● Nhận và xử lý các kết quả trả về từ cơ sở dữ liệu.
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 10
Các dạng Statement● Statement: Thực hiện các câu truy vấn đơn
giản.● PreparedStatement: Thực hiện các câu truy
vấn có các tham số đầu vào● CallableStatement: Thực hiện các câu truy vấn
có các tham só đầu vào và đầu ra. Cụ thể là các function
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 11
Statement
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 12
Statement● Statement: Thực hiện các câu truy vấn đơn
giản.
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 13
Statement● Cách tạo Statement đơn giản
Statement sm = con.createStatement();
● Các phương thức thường dùng
sm.executeQuery(sql); → select
sm.executeUpdate(sql); → insert, update, delete, drop, create, …
sm.addBatch(sql) & sm.executeBatch() → Batch
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 14
Statement - executeQuery● ResultSet rs = sm.executeQuery(sql);
● ResultSet → forward : rs.next()
1234567891011
Statement statement = con.createStatement();String sql = “SELECT * FROM danh_muuc”;ResultSet rs = statement.executeQuery(sql);while (rs.next()){ int maDanhMuc = rs.getInt(“ma_danh_muc”); String tenDanhMuc = rs.getString(“ten_danh_muc”); System.out.println(maDanhMuc+” “+tenDanhMuc);}rs.close();sm.close();con.close();
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 15
Statement - executeQuery● Forward & Backward
Statement sm= connection.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
● ResultSet rs = sm.executeQuery(sql);
● ResultSet rs
→ forward : rs.next();
→ backward: rs.previous();
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 16
Statement – executeUpdate12345678910
Statement sm = con.createStatement();String sql =“DELETE FROM sach WHERE ma_danh_muc= 1”;int n = sm.executeUpdate (sql);if (n >= 0){ System.out.println(n + “ Sách đã được xóa”);}else{ System.out.println(“Lỗi”);}sm.close();con.close();
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 17
Statement – executeUpdate1234567891011121314
Statement sm = con.createStatement();String sql = String.format(“UPDATE danh_muc SET ten_danh_muc = '%s'” WHERE ma_danh_muc= %d”, maDanhMuc, tenDanhMuc);
int n = sm.executeUpdate (sql);if (n >= 0){ System.out.println(“Cập nhật thành công”);}else{ System.out.println(“Lỗi”);}sm.close();con.close();
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 18
Statement – executeUpdate1234567891011
Statement sm = con.createStatement();String sql = String.format(“INSERT INTO danh_muc (ten_danh_muc) VALUES('%s')”,tenDanhMuc);int n = sm.executeUpdate (sql);if (n >= 0){ System.out.println(“Thêm thành công”);}else{ System.out.println(“Lỗi”);}sm.close();con.close();
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 19
Statement – executeUpdate123456789101112131415
String tenDanhMuc = "C++";String sql= String.format("INSERT INTO danh_muc(ten_danh_muc) VALUES ('%s')", tenDanhMuc);int n=sm.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);if(n>0){ System.out.println("Thêm thành công"); ResultSet rs=statement.getGeneratedKeys(); if(rs.next()){ int mdm = rs.getInt(1); System.out.println("Mã danh mục vừa thêm:" +mdm); }}sm.close();con.close();
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 20
Statement – executeUpdate123456789101112131415161718
String [] tenDanhMucs = {"C++", "C#", "Java"};String sql="INSERT INTO danh_muc(ten_danh_muc) VALUES ";for(int i=0; i<tenDanhMucs.length; i++){ sql=sql + String.format("('%s') ", tenDanhMucs[i]); if(i<tenDanhMucs.length-1){sql=sql + ", ";}}int n=stm.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);if(n>0){ System.out.println("Thêm thành công"); ResultSet rs=statement.getGeneratedKeys(); while(rs.next()){ int mdm = rs.getInt(1); System.out.println("Mã danh mục vừa thêm: " + mdm); }}sm.close();con.close();
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 21
Statement – executeBatch1234567891011
String sql1="INSERT INTO danh_muc(ten_danh_muc) VALUES('Java')";String sql2="INSERT INTO danh_muc(ten_danh_muc) VALUES('PHP')";String sql3="UPDATE DANHMUC SET ten_danh_muc='C' WHERE ma_danh_muc=43";Statement statement=connection.createStatement();statement.addBatch(sql1);statement.addBatch(sql2);statement.addBatch(sql3);int [] n = statement.executeBatch();
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 22
Statement - SQLException1234567
try{ . . .}catch(SQLException ex){ . . .}finally{ con.close();}
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 23
Statement● Statement: Thực hiện các câu truy vấn đơn
giản?
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 24
PreparedStatement
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 25
PreparedStatement● PreparedStatement: Thực hiện các câu truy
vấn có các tham số đầu vào
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 26
PreparedStatement● Cách tạo PreparedStatement đơn giản
PreparedStatement ps =
con.prepareStatement(sql);
● Các phương thức thường dùng
ps.setXXX(index, value); → XXX : int, string, ...
ps.executeQuery(); → select
ps.executeUpdate(); → insert, update, delete, drop, create, …
ps.addBatch() & ps.executeBatch() → Batch
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 27
PreparedStatement - executeQuery● ResultSet rs = sm.executeQuery();
● ResultSet → forward : rs.next()
12345678910111213
String sql = “SELECT * FROM sach WHERE gia_ban < ? AND TenSach LIKE ?”;PreparedStatement ps = con.prepareStatement(sql);ps.setDouble(1, 2000);ps.setString(2, “%java%”);ResultSet rs = ps.executeQuery();while (rs.next()){ int maSach = rs.getInt(“MaSach”); . . .}rs.close();ps.close();con.close();
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 28
PreparedStatement - executeQuery● Forward & Backward
PreparedStatement ps = con.prepareStatement(
sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
● ps.setXXX(index, value);
● ResultSet rs = ps.executeQuery();
● ResultSet rs
→ forward : rs.next();
→ backward: rs.previous();
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 29
PreparedStatement – executeUpdate123456789101112
String sql = “DELETE FROM sach WHERE ma_danh_muc= ?”;PreparedStatement ps = con.prepareStatement(sql);ps.setInt(1, 1);int n = ps.executeUpdate ();if (n >= 0){ System.out.println(n + “ Sách đã được xóa”);}else{ System.out.println(“Lỗi”);}ps.close();con.close();
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 30
PreparedStatement – executeUpdate1234567891011121314
String sql = String.format(“UPDATE danh_muc SET ten_danh_muc = ?” WHERE ma_danh_muc= ?”);PreparedStatement ps = con.prepareStatement(sql);ps.setString(1, “Java”);ps.setInt(2, 1);int n = ps.executeUpdate ();if (n >= 0){ System.out.println(“Cập nhật thành công”);}else{ System.out.println(“Lỗi”);}ps.close();con.close();
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 31
PreparedStatement – executeUpdate123456789101112
String sql = “INSERT INTO danh_muc (ten_danh_muc) VALUES(?)”;PreparedStatement ps = con.prepareStatement(sql);ps.setString(1, “PHP”);int n = ps.executeUpdate ();if (n >= 0){ System.out.println(“Thêm thành công”);}else{ System.out.println(“Lỗi”);}ps.close();con.close();
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 32
PreparedStatement – executeUpdate12345678910111213141516
String tenDanhMuc = "C++";String sql= String.format("INSERT INTO danh_muc(ten_danh_muc) VALUES ('%s')", tenDanhMuc);PreparedStatement ps = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);int n=ps.executeUpdate();if(n>0){ System.out.println("Thêm thành công"); ResultSet rs=ps.getGeneratedKeys(); if(rs.next()){ int mdm = rs.getInt(1); System.out.println("Mã danh mục vừa thêm:" +mdm); }}sm.close();con.close();
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 33
PreparedStatement – executeBatch12345678910
String sql="INSERT INTO danh_muc(ten_danh_muc) VALUES(?)";PreparedStatement ps = con.prepareStatement(sql);ps.setString(1, “Java”);ps.addBatch();ps.setString(1, “PHP”);ps.addBatch();ps.setString(1, “C++”);ps.addBatch();int [] n = ps.executeBatch();
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 34
Statement - SQLException1234567
try{ . . .}catch(SQLException ex){ . . .}finally{ con.close();}
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 35
PreparedStatement● PreparedStatement: Thực hiện các câu truy
vấn có các tham số đầu vào
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 36
PostgreSQL – Simple Function
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 37
PostgreSQL - f_them_danh_muc123456789
create or replace function f_them_danh_muc(i_ten_danh_muc character) returns integer as $$begin
insert into danh_muc(ten_danh_muc) values(i_ten_danh_muc);
return lastval();end;$$language plpgsql;
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 38
JDBC - f_them_danh_muc123456
String sql="{? = call f_them_danh_muc(?)}";CallableStatement cs=con.prepareCall(sql);cs.registerOutParameter(1, Types.INTEGER);cs.setString(2, "Java");cs.execute();int ma_danh_muc = cs.getInt(1);
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 39
PostgreSQL - f_cap_nhat_danh_muc123456789101112
create or replace function f_cap_nhat_danh_muc(i_ma_danh_muc integer, i_ten_danh_muc character) returns integer as $$begin
update danh_muc set ten_danh_muc = i_ten_danh_muc where ma_danh_muc = i_ma_danh_muc;
get diagnostics count = ROW_COUNT;return count;
end;$$language plpgsql;
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 40
JDBC - f_cap_nhat_danh_muc1234567
String sql="{? = call f_cap_nhat_danh_muc(?,?)}";CallableStatement cs=con.prepareCall(sql);cs.registerOutParameter(1, Types.INTEGER);cs.setInt(2, 10);cs.setString(3, "Java");cs.execute();int count = cs.getInt(1);
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 41
PostgreSQL - f_xoa_danh_muc12345678910
create or replace function f_xoa_danh_muc(i_ma_danh_muc integer) returns integer as $$begin
delete from danh_muc where ma_danh_muc = i_ma_danh_muc;
get diagnostics count = ROW_COUNT;return count;
end;$$language plpgsql;
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 42
JDBC - f_xoa_danh_muc123456
String sql="{? = call f_xoa_danh_muc(?)}";CallableStatement cs=con.prepareCall(sql);cs.registerOutParameter(1, Types.INTEGER);cs.setInt(2, 10);cs.execute();int count = cs.getInt(1);
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 43
PostgreSQL - f_lay_danh_sach_danh_muc
12345678910
create or replace function f_lay_danh_sach_danh_muc() returns setof danh_muc as $$begin
return query select ma_danh_muc, ten_danh_muc from danh_muc order by ten_danh_muc asc;
end;$$language plpgsql;
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 44
JDBC - f_lay_danh_sach_danh_muc
123456789101112
String sql = “select ma_danh_muc, ten_danh_muc from f_lay_danh_sach_danh_muc()”;PreparedStatement ps = con.prepareStament(sql);ResultSet rs = cs.executeQuery();while (rs.next()){ int ma_danh_muc rs.getInt(1); String ten_danh_muc = rs.getString(2); . . .}rs.close();cs.close();con.close();
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 45
JDBC - PostgreSQL● Khi function trả về kiểu SETOF
● CallableStatement không hỗ trợ ● Sử dụng Statement hoặc PreparedStament
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 46
PostgreSQL - f_tim_kiem_sach1234567891011
create function f_tim_kiem_sach(i_ten_sach character(64), i_gia_ban double precision) returns setof sach as $$begin
return query SELECT * FROM sach WHERE gia_ban < i_gia_ban AND ten_sach LIKE i_ten_sach;end;$$language plpgsql;
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 47
JDBC – f_tim_kiem_sach
123456789101112131415
String sql = “select ma_sach, ten_sach, gia_ban from f_tim_kiem_sach(?, ?)”;PreparedStatement ps = con.prepareStament(sql);ps.setString(1, “%java%”);ps.setString(2, 200000);ResultSet rs = cs.executeQuery();while (rs.next()){ int maSach = rs.getInt(1); String tenSach = rs.getString(2); double giaBan = rs.getDouble(3); . . .}rs.close();cs.close();con.close();
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 48
JDBC – f_lay_danh_sach_sach
1234567891011
create or replace function f_lay_danh_sach_sach() returns table(ma_sach integer, ten_danh_muc character(64)) as $$begin
return query select s.ma_sach, dm.ten_danh_muc from danh_muc dm inner join sach s
on dm.ma_danh_muc = s.ma_danh_muc order by ten_sach asc;
end;$$language plpgsql;
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 49
JDBC – f_lay_danh_sach_sach
1234567
String sql="select * from f_lay_danh_sach_sach()";PreparedStatement ps=con.prepareStatement(sql);ResultSet rs=ps.executeQuery();while(rs.next()){
System.out.println(rs.getInt(1));System.out.println(rs.getString(2));
}
JAVA PROGRAMMINGJAVA PROGRAMMING – 2012 - V2.1
Nguyễn Hoàng Anh - [email protected] - ĐHKHTN 50
HỎI VÀ ĐÁP