• Các trình điều khiển JDBC đưa ra các kết nối cơ sở dữ liệu và thực hiện các giao thức protocol để trao đổi các truy vấn và kết quả giữa khách hàng và cơ sở dữ liệu.. Giao tiếp trong
Trang 1LÀM VIỆC VỚI
CƠ SỞ DỮ LIỆU
Trang 2Nội dung
• Khái niệm JDBC
• Các bước sử dụng JDBC trong ứng dụng Java
• Các đối tượng Statement
• ResultSet
– ResultSet cuộn được
– ResultSet cập nhật
Trang 3Khái niệm về JDBC
• Là một phần của các hàm Java API cho môi trường ứng dụng Java.
• JDBC thì tương tự như ODBC drivers, ADO.NET data
providers và OLE DB providers.
• Để kết nối đến CSDL, JDBC yêu cầu trình điều khiển
(driver) cho mỗi CSDL
• Các trình điều khiển JDBC đưa ra các kết nối cơ sở dữ
liệu và thực hiện các giao thức (protocol) để trao đổi các
truy vấn và kết quả giữa khách hàng và cơ sở dữ liệu.
• Các trình điều khiển JDBC được chia làm 4 nhóm.
Trang 4Loại 1: JDBC-ODBC bridge
• Cầu nối JDBC-ODBC: Cung cấp
các truy cập JDBC thông qua các
truy cập ODBC Driver này
chuyển các lời gọi JDBC thành lời
gọi các hàm trong ODBC
• Gói driver cho JDBC-ODBC:
sun.jdbc.odbc.JdbcOdbcDriver
• Client -> JDBC Driver -> ODBC
Driver -> Database
Trang 5Loại 1: JDBC-ODBC bridge
• Ưu điểm: Dễ kết nối, kết
nối thẳng đến CSDL.
• Khuyết điểm: ODBC
driver phụ thuộc vào hệ điều hành và đòi hỏi client phải được cài driver
• Tốc độ truy xuất chậm.
• Trên Access, ODBC driver
bị lỗi khi chuyển mã ký
tự
Trang 6Loại 2: Native-API partly Java driver
• Chuyển các lệnh gọi JDBC thành các lệnh gọi
API trên máy client của CSDL (như Oracle,
SyBase, DB2, …).
• Như vầy, nó đòi hỏi trên máy client cần phải
nạp trước một số lệnh nhị phân của các trình
chạy trên máy client của CSDL.
• JDBC driver loại này phụ thuộc nền tảng sử
dụng.
• Không phải CSDL nào cũng có driver dạng này.
• Driver này tương tích hầu hết tất cả các ứng
dụng Java ngoại trừ Applet.
Trang 7Loại 3: Network-Protocol driver
• Đây là dạng driver giao thức mạng
Driver này chuyển các lệnh gọi JDBC
thành các giao thức mạng độc lập với
hệ quản trị CSDL (DBMS
Independent Net Protocol).
• Chính phần mềm trên máy chủ trung
gian này có thể kết nối các máy
khánh có nên Java với nhiều loại
CSDL khác nhau.
• Client -> JDBC Driver ->
Network-protocol driver -> Middleware-Net
Server -> bất cứ CSDL nào
Trang 8Loại 3: Network-Protocol driver
• Ưu điểm: JDBC này rất linh hoạt vì có thể kết nối đến
nhiều loại hệ quản trị CSDL khác nhau mà không cần cài đặt driver dưới máy client
• Khuyết điểm: Phụ thuộc nhiều vào nhà cung cấp
Trang 9Loại 4: Native-Protocol driver
• Đây là dạng driver với giao thức
gốc hoàn toàn Java Được viết
hoàn toàn bằng Java
• Biến các lệnh gọi JDBC thành các
giao thức mạng gọi trực tiếp từ hệ
quản trị CSDL
• Trình này cho phép gọi trực tiếp từ
máy khách đến máy chủ chứa
Trang 10Loại 4: Native-Protocol driver
• Ưu điểm: JDBC này không cần chuyển sang lời gọi
nào (như ODBC)
• Không cần lớp trung gian để liên hệ với các CSDL
• Được viết bằng Java nên hoàn toàn không phụ thuộc nào nền tảng sử dụng
• Cải thiện hiệu suất truy cập
• Khuyết điểm: Cần driver riêng cho từng loại CSDL
Trang 11Cơ chế hoạt động của JDBC
• Chương trình Java tạo một đối tượng kết nối để kết nối với cơ sở dữ liệu.
• Tạo một đối tượng lệnh (Statement) và chuyển các câu SQL đến CSDL thông qua đối tượng này
Trang 13Giao tiếp trong gói java.sql
Array Kiểu mảng.
Blob Kiểu dữ liệu Blob.
CallableStatement Giao diện dùng để thực thi các các hàm đã được cài sẵn (Stored
Procedure).
Clob Kiểu dữ liệu Clob.
Connection Một phiên kết nối với CSDL cụ thể.
DatabaseMetaData Thông tin về toàn bộ CSDL.
Driver Giao diện mà các trình điều khiển đều phải cài đặt.
NClob Kiểu dữ liệu Nclob.
ParameterMetaData Đối tượng dùng để lấy thông tin về kiểu và thuộc tình cho mỗi tham số
được đánh dấu trong đối tượng PreparedStatement
PreparedStatement Đối tượng dành cho các câu lệnh được biên dịch trước (precompiled
SQL statement).
Ref Một tham khảo đến giá trị của một dữ liệu có cấu trúc.
ResultSet Tập hợp các records cho phép truy xuất đến cac bảng trong CSDL.
Trang 14Giao tiếp trong gói java.sql
ResultSetMetaData Một đối tượng dùng để lấy thông tin về loại và thuộc tính cùa các cột trong một
đối tượng ResultSet.
RowId Một thể hiện của giá trị cột trong SQL.
Savepoint Một điểm lưu, một điểm trong giao dịch hiện tại, có thể được tham chiếu thông
qua phương thức Connection.rollback.
SQLData Giao tiếp dùng để ánh xạ kiểu dữ liệu người dùng.
SQLInput Luồng dữ liệu nhập chứa các giá trị biểu diễn các kiểu dữ liệu cấu trúc hay phân
biệt.
SQLOutput Luồng dữ liệu xuất cho việc ghi xuống CSDL các thuộc tính của các kiểu dữ liệu
người dùng.
SQLXML Kiểu ánh xạ cho kiểu XML trên SQL.
Statement Đối tượng dùng để thực thi các câu lệnh SQL và nhận về kết quả.
Struct Mô tả dữ liệu kiểu cấu trúc.
Trang 15Lớp trong gói java.sql
Date Biểu diễn kiểu DATE.
DriverManager Một dịch vụ quản lý bộ các JDBC Driver.
Chú ý: Giao tiếp DataSource, phần mới trong JDBC 2.0 API, cải tiến một cách khác để kết nối đến một data source.
DriverPropertyInfo Thông tin driver để tạo kết nối.
SQLPermission Quản lý quyền truy cập cho các kết nối.
Time Biểu diễn kiểu TIME.
Timestamp Biểu diễn kiểu TIMESTAMP.
Types Lớp định nghĩa các hằng cho phép định danh các kiểu dữ liệu
SQL, hay còn gọi là kiểu dữ liệu JDBC.
Trang 16Ngoại lệ trong gói java.sql
BatchUpdateException Ngoại lệ xảy ra thi thực thi các bó lệnh.
DataTruncation Ngoại lệ xảy ra khi có sự cắt bớt dữ liệu lúc đọc hoặc ghi.
SQLException Ngoại lệ khi lỗi trong các câu truy vấn SQL.
SQLWarning Ngoại lệ cung cấp các thông tin nhắc nhở khi truy cập
CSDL.
Trang 17Giao tiếp trong gói javax.sql
ConnectionEventListener Giao tiếp dùng trong các thành phần chia sẻ.
ConnectionPoolDataSour
ce Là nguồn tạo các đối tượng PooledConnection.
DataSource Là nguồn tạo các đối tượng Connection.
PooledConnection Đối tượng kết nối cung cấp và quản lý các điểm kết nối chia sẻ.
RowSet Giao tiếp này hỗ trợ cho mô hình JavaBeans.
RowSetInternal Đối tượng biểu hiện như một máy đọc hay ghi.
RowSetListener Giao tiếp này được tạo bởi một thành phần muốn được thông báo
các sự kiện đã xảy ra cho một RowSet.
RowSetMetaData Đối tượng chứa các thông tin cho đối tượng RowSet.
RowSetReader Đối tượng để đọc trong RowSet.
RowSetWriter Đối tượng để ghi trong RowSet.
XAConnection Đối tượng cung cấp các hỗ trợ cho các giao dịch phân bố.
XADataSource Là nguồn của đối tượng XAConnection.
Trang 18Lớp trong gói javax.sql
ConnectionEvent Chứa sự kiện kết nối.
RowSetEvent Các sự kiện khi có thay đổi trong RowSet.
StatementEvent Các sự kiện khi một câu lệnh truy vấn được kết nối.
Trang 19Sử dụng trình điều khiển JDBC
• Thực hiện một kết nối với CSDL: gọi phương thức
getConnection() để nhận về đối tượng Connection
• Thực hiện các lệnh:
– Các câu lệnh có thể được thực hiện tức thì thông qua đối tượng Statement, hay là một câu lệnh được biên dịch
trước thông qua đối tượng PreparedStatement ,hay là một
lệnh gọi các thủ tục lưu trữ sẵn (store procedures) thông
qua đối tượng CallableStatement.
– Các câu lệnh SQL được thực hiện thông qua phương thức
executeQuery() hoặc executeUpdate().
Trang 20Các bước khi cần truy cập CSDL
– Đăng ký trình điều khiển JDBC
– Thiết lập một nối kết đến cơ sở dữ liệu
– Tạo và thực thi câu lệnh SQL
– Xử lý các kết quả
– Đóng nối kết cơ sở dữ liệu
Trang 21Ví dụ sử dụng JDBC – ODBC Driver
Trang 22Ví dụ sử dụng JDBC - Trình giao thức gốc
hoàn toàn Java (SQL Server)
Trang 23Đăng ký trình điều khiển JDBC
dữ liệu, cần đăng ký (nạp) trình điều khiển JDBC.
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Class.forName("com.microsoft.sqlserver.jdbc.SQLServer Driver");
Trang 24Thiết lập kết nối đến CSDL
• Phương thức:
DriverManager.getConnection(url, username, password):
– Kết quả trả về là 1 đối tượng Connection.
– url: chuỗi kết nối có dạng jdbc:subprotocol:subname
• subprotocol: giao thức con tương ứng với loại của HQTCSDL.
• subname: tên của CSDL.
– username: tên người dùng khi đăng nhập vào CSDL.
– password: mật khẩu người dùng khi đăng nhập vào CSDL.
Trang 25Tạo và thực thi câu lệnh SQL
Trang 26Tạo và thực thi câu lệnh SQL
• Phương thức lấy về dữ liệu của đối tượng Statement:
– executeQuery(): truy xuất thông tin từ cơ sở dữ liệu Tham số đầu vào là một câu truy vấn Select (chuỗi ký tự) Kết quả trả
về là một đối tượng ResultSet.
• Đối tượng ResultSet: chứa tập kết quả trả về khi thực hiện câu truy vấn dạng Select.
• Thí dụ:
ResultSet rs = s.executeQuery( "select * from CHUCVU“ );
Trang 27Tạo và thực thi câu lệnh SQL
• Phương thức cập nhật dữ liệu của Statement:
– Phương thức executeUpdate(): cho phép thực thi các
câu truy vấn hành động như Insert, Update, Delete
hoặc các câu lệnh định nghĩa dữ liệu như Create Table, DropTable.
– Cú pháp: int executeUpdate(String sql):
• sql: chuỗi chứa câu lệnh SQL
• Kết quả trả về là một giá trị int mang ý nghĩa là số dòng
(mẩu tin) chịu tác động bởi việc thực thi câu lệnh.
• Thí dụ:
int rows = s executeUpdate ( “Delete NHANVIEN Where MANV=‘NV001’” );
Trang 28Xử lý kết quả - Lớp ResultSet
• Một đối tượng ResultSet chứa tập kết quả (dạng bảng) trả về từ việc thực thi 1 câu truy vấn Select.– Ban đầu con trỏ chỉ đến trước dòng đầu tiên của
tập kết quả trả về
– Phương thức next() của đối tượng ResultSet cho phép di chuyển sang dòng kế tiếp
– Kết quả trả về của phương thức là true nếu việc
di chuyển thành công; false nếu không còn dòng nào để di chuyển
Trang 29Xử lý kết quả - Lớp ResultSet
• Một số phương thức của đối tượng ResultSet:
– getInt(): lấy về giá trị int từ dòng hiện hành.
– getString(): lấy về giá trị String từ dòng hiện hành.
– getDate(): lấy về giá trị Date từ dòng hiện hành.
– getFloat(): lấy về giá trị float từ dòng hiện hành.
– getObject(): lấy về giá trị từ dòng hiện hành và xem
giá trị này như là 1 object.
• Thông thường, các phương thức có 1 tham số là tên cột (hoặc số thứ tự cột) trong bảng.
Trang 30Đóng kết nối
nối đến cơ sở dữ liệu.
Statement , Connection
Trang 31Đối tượng PreparedStatement
Trang 32Đối tượng PreparedStatement
• Tạo đối tượng PreparedStatement: sử dụng
phương thức prepareStatement() của đối tượng
Connection (tham số của phương thức này là câu truy vấn SQL dạng chuỗi):
• Ví dụ:
PreparedStatement s = con prepareStatement( "Update Matches Set Won=?, Lost=? Where MatchNo=?“ );
• Trong thí dụ trên, các dấu ? là các tham số Do đó
trước khi thực thi, các tham số này cần được gán giá trị
Trang 33Đối tượng PreparedStatement
• Gán trị cho tham số:
– Phương thức setType (<STT>, <Giá trị>);
• Type: Kiểu dữ liệu của tham số cần gán.
• STT: số thứ tự của tham số, bắt đầu là 1.
• Giá trị: giá trị sẽ gán cho tham số.
Trang 34Đối tượng PreparedStatement
• Cập nhật dữ liệu:
– Phương thức executeUpdate(): kết quả trả về là
1 giá trị int mang ý nghĩa là số dòng (mẩu tin) bị tác động khi thực thi câu truy vấn
• Lấy về dữ liệu:
– Phương thức executeQuery(): kết quả trả về là 1 đối tượng ResultSet
Trang 35CallableStatement s=con.prepareCall( “{call spPlayers}“ );
// spPlayers: tên của 1 store procedure
• Thực thi câu lệnh SQL: phương thức
executeQuery() hoặc executeUpdate()
• Đối tượng CallableStatement có thể nhận các tham
số tương tự như đối tượng PreparedStatement
Trang 36Scrollable ResultSet
• Scrollable ResultSet là ResultSet cuộn được.
duyệt các mẩu tin theo 2 chiều (từ trước
mẩu tin đầu tiên - BOF đến sau mẩu tin cuối cùng - EOF).
Trang 37Tạo ResultSet cuộn được
• Phương thức createStatement() của 1 đối tượng
public PreparedStatement prepareStatement(String sql,
int resultSetType, int resultSetConcurrency)
• Phương thức prepareCall() của 1 đối tượng
Connection.
public CallableStatement prepareCall(String sql,
int resultSetType, int resultSetConcurrency)
Trang 38ResultSet Type
TYPE_FORWARD_ONLY ResultSet chỉ có thể duyệt 1 chiều
từ BOF đến EOF
TYPE_SCROLL_INSENSITIVE ResultSet có thể được duyệt theo
2 chiều nhưng không thấy được sự
thay đổi số liệu trong CSDL
TYPE_SCROLL_SENSITIVE ResultSet có thể được duyệt theo
2 chiều và thấy được sự thay đổi
số liệu trong CSDL
Trang 39• Lưu ý: Để có thể tạo một ResultSet cập nhật
được, câu lệnh SQL phải chứa khóa chính và
chỉ chọn các cột trong cùng một bảng.
Trang 40Các phương thức để duyệt ResultSet
next() Di chuyển vị trí con trỏ sang mẩu tin kế tiếp
previous() Di chuyển vị trí con trỏ sang mẩu tin trước đó
first() Di chuyển vị trí con trỏ về mẩu tin đầu tiên
last() Di chuyển vị trí con trỏ về mẩu tin cuối cùng
beforeFirst() Di chuyển vị trí con trỏ về trước mẩu tin đầu tiên
afterLast() Di chuyển vị trí con trỏ về sau mẩu tin cuối cùng
Trang 41Các phương thức để duyệt ResultSet
absolute(lnumber) Di chuyển vị trí con trỏ mẩu tin hiện hành đến
mẩu tin có số thứ tự là lnumber Nếu lnumber>0, số thứ tự này được tính từ mẩu tin đầu tiên Nếu lnumber<0, số thứ tự này được tính từ mẩu tin cuối cùng.
relative(lnumber) Di chuyển sang mẩu tin có vị trí tương đối là
lnumber so với vị trí mẩu tin hiện hành Nếu lnumner>0, di chuyển về cuối ResultSet; nếu lnumber<0, di chuyển về đầu ResultSet
Trang 42rs.updateString(“TENNV”,”Nguyễn Văn A”);
– Hoàn tất việc cập nhật bằng cách gọi thực thi phương thức updateRow() Ngoài ra, ta có thể hủy bỏ việc cập nhật bằng cách gọi
phương thức cancelRowUpdates()
Trang 43ResultSet cập nhật
• Các bước để thêm 1 mẩu tin trong 1
Trang 44ResultSet cập nhật
• Các bước để xóa 1 mẩu tin:
– Di chuyển đến mẩu tin cần xóa
– Gọi thực thi phương thức deleteRow().
Trang 45ResultSet cập nhật
các thay đổi dữ liệu do người dùng khác thực hiện sẽ được nhận biết.
Trang 46Tóm tắt việc cập nhật CSDL
• Việc cập nhật CSDL có thể được thực
hiện nhờ:
– Thực thi các câu truy vấn dạng hành động
(Insert, Update, Delete) nhờ 1 đối tượng
CallableStatement