Viết tắt của Java Database Connectivity
Là Java API chuẩn cho việc kết nối Java
application đến Database
Các chức năng
• Thiết lập kết nối đến Database
• Tạo các câu lệnh truy vấn SQL
• Thực thi các câu lệnh truy vấn
• Xem và sửa đổi các kết quả truy vấn
33 trang |
Chia sẻ: lylyngoc | Lượt xem: 1730 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Chương 7 Truy cập cơ sở dữ liệu với JDBC, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
LẬP TRÌNH JAVA
Chương 7
TRUY CẬP CƠ SỞ
DỮ LIỆU VỚI JDBC
GV: Võ Hoàng Phương Dung
Giới thiệu về JDBC
Cấu trúc JDBC
Các bước sử dụng JDBC
2/25
Nội dung
Viết tắt của Java Database Connectivity
Là Java API chuẩn cho việc kết nối Java
application đến Database
Các chức năng
• Thiết lập kết nối đến Database
• Tạo các câu lệnh truy vấn SQL
• Thực thi các câu lệnh truy vấn
• Xem và sửa đổi các kết quả truy vấn
3/25
Giới thiệu về JDBC
JDBC hỗ trợ 2 loại truy cập dữ liệu
4/25
Cấu trúc của JDBC
2-tier 3-tier
Cấu trúc JDBC gồm 2 phần
• JDBC API
• JDBC Driver
5/25
Cấu trúc của JDBC
JDBC API
• Phần lớn các API nằm trong 2 gói
java.sql
javax.sql
• Được chứa trong Java SE và Java EE platform
6/25
Cấu trúc của JDBC
JDBC API cung cấp các interface và class để
thao tác dữ liệu
• DriverManager: quản lý các database driver
• Driver: xử lý giao tiếp với database server
• Connection: kết nối database
• Statement: tạo và thực thi các câu lệnh SQL
• ResultSet: lưu trữ và thao tác trên kết quả trả về
• SQLException: xử lý các ngoại lệ trong quá trình
thao tác với database
7/25
Cấu trúc của JDBC
JDBC Driver
• Tất cả các Database server đều có JDBC driver
tương ứng
• Có 4 loại JDBC Driver
Loại 1: JDBC/ODBC
Loại 2: Native-API
Loại 3: Open Protocol-Net
Loại 4: Proprietary-Protocol-Net
8/25
Cấu trúc của JDBC
JDBC driver loại 1: JDBC-ODBC
9/25
Cấu trúc của JDBC
JDBC driver loại 2: Native API
10/25
Cấu trúc của JDBC
JDBC driver loại 3: Net pure Java
11/25
Cấu trúc của JDBC
JDBC driver loại 4: 100% pure Java
12/25
Cấu trúc của JDBC
Bước 1: Thiết lập kết nối Database
Bước 2: Tạo câu lệnh truy vấn
Bước 3: Thực thi câu truy vấn
Bước 4: Xử lý kết quả trả về
Bước 5: Đóng kết nối
13/25
Các bước sử dụng JDBC
Nạp các java package: sử dụng câu lệnh import
import java.sql.* ;
Đăng ký JDBC Driver: có 2 cách
•Sử dụng method: Class.forName()
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
}catch(ClassNotFoundException ex) {
System.out.println("Error");
}
14/25
Bước 1: Thiết lập kết nối Database
• Sử dụng DriverManager.registerDriver()
try {
Driver myDriver = new
oracle.jdbc.driver.OracleDriver();
DriverManager.registerDriver( myDriver );
}catch(ClassNotFoundException ex) {
System.out.println("Error");
}
15/25
Bước 1: Thiết lập kết nối Database
Xác định Database URL
• Được sử dụng để tạo kết nối đến Database
• Có thể chứa server, port, protocol…
16/25
Bước 1: Thiết lập kết nối Database
RDBMS JDBC driver name URL format
MySQL com.mysql.jdbc.Driver jdbc:mysql://hostname/ databaseName
ORACLE oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:@hostname:port
Number:databaseName
DB2 COM.ibm.db2.jdbc.net.DB2Driver jdbc:db2:hostname:portNumber/database
Name
Sybase com.sybase.jdbc.SybDriver jdbc:sybase:Tds:hostname:
portNumber/databaseName
SQLSER
VER
com.microsoft.sqlserver.jdbc.SQL
ServerDriver
jdbc:sqlserver://
hostname:portNumber;databaseName
Ví dụ
• SQL SERVER:
“jdbc:sqlserver://myserver:1433;databasename=Lib
rary”;
• Oracle thin driver
“jdbc:oracle:thin:@machinename:1521:dbname”
17/25
Bước 1: Thiết lập kết nối Database
Tạo đối tượng kết nối Connection: sử dụng 1
trong 3 cách
• DriverManager.getConnection(String url)
• DriverManager.getConnection(String url, String
user, String password)
• DriverManager.getConnection(String url,
Properties info)
• Chú ý: ném ra ngoại lệ SQLException
18/25
Bước 1: Thiết lập kết nối Database
• Ví dụ 1
Connection conn =DriverManager.getConnection(url);
• Ví dụ 2
Connection conn
=DriverManager.getConnection(url,"sa","123456");
• Ví dụ 3
Properties info = new Properties( );
info.put( "user", “sa" );
info.put( "password", “123456" );
Connection conn = DriverManager.getConnection(URL, info);
19/25
Bước 1: Thiết lập kết nối Database
Sử dụng 1 trong 3 đối tượng
• Statement: thực thi câu sql không chứa biến
Statement stmt = conn.createStatement( );
• PreparedStatement: thực thi câu sql chứa biến
Các biến được chỉ định bởi dấu ?
Truyền biến vào câu lệnh bằng phương thức
setXXX(index,value) với XXX là kiểu dữ liệu của biến
Ví dụ:
String SQL = "Update Employees SET age = ? WHERE id = ?";
PreparedStatement pstmt=conn.prepareStatement(SQL);
pstmt.setInt(1,4);
Pstmt.setInt(2,5);
20/25
Bước 2: Tạo câu lệnh truy vấn
• CallableStatement: để thực thi các stored-procedure
Sử dụng pt Connection.prepareCall() để khởi tạo
Có 3 loại biến
Biến IN: truyền giá trị bằng pt setXXX(index, value)
Biến OUT: lấy giá trị bằng pt getXXX(index)
Biến INOUT: truyền giá trị bằng setXXX(index, value), lấy giá trị
bằng getXXX(index)
Ví dụ
CallableStatement cstmt = null;
try {
String SQL = "{call getEmpName (?, ?)}";
cstmt = conn.prepareCall(SQL);
} catch (SQLException e) {}
21/25
Bước 2: Tạo câu lệnh truy vấn
Sử dụng 1 trong 3 phương thức
• boolean execute(String SQL): trả lại true nếu kết
quả trả về của câu lệnh truy vấn là ResultSet
• int executeUpdate(String SQL): trả lại số row bị
ảnh hưởng, sử dụng cho Insert, Update, Delete
• ResultSet executeQuery(String SQL): trả lại 1 đối
tượng ResultSet, sử dụng cho Select
Ví dụ
ResultSet rs = statement.executeQuery(“select * from
tblEmployer”);
int n=statement.executeUpdate(“update tblEmployer set
age=’40’ where id=‘1’ ”); 22/25
Bước 3: Thực thi câu truy vấn
ResultSet cung cấp các phương thức để xử lý
các kết quả trả về từ câu lệnh SQL
ResultSet chứa dữ liệu theo dạng Table
Truy cập các hàng dữ liệu bằng cách di chuyển
con trỏ của ResultSet
Ban đầu, con trỏ chỉ hàng đầu tiên
23/25
Bước 4: Xử lý kết quả trả về
Các loại ResultSet (ResultSet Types): xét về
loại con trỏ và sự phản ánh thay đổi dữ liệu
• ResultSet.TYPE_FORWARD_ONLY (mặc định):
con trỏ chỉ dịch chuyển tiến đến trong ResultSet
• ResultSet.TYPE_SCROLL_INSENSITIVE: con
trỏ có thể dịch chuyển đến và lùi, ResultSet không
cập nhật các thay đổi trong Database sau khi đã
được tạo
• ResultSet.TYPE_SCROLL_SENSITIVE: con trỏ
có thể dịch chuyển đến và lùi, ResultSet cập nhật
các thay đổi trong Database sau khi đã được tạo
24/25
Bước 4: Xử lý kết quả trả về
Các loại ResultSet (ResultSet Concurrency):
xét về chức năng thay đổi dữ liệu
• ResultSet.CONCUR_READ_ONLY (mặc định):
ResultSet chỉ đọc
• ResultSet.CONCUR_UPDATABLE: ResultSet có
thể thay đổi được dữ liệu
25/25
Bước 4: Xử lý kết quả trả về
Loại ResultSet được xác định đồng thời tại lúc
tạo đối tượng statement
• createStatement(int RSType, int RSConcurrency);
• prepareStatement(String SQL, int RSType, int
RSConcurrency);
• prepareCall(String SQL, int RSType, int
RSConcurrency);
RSType: chỉ định ResultSet Types
RSConcurrency: chỉ định ResultSet Concurrency
26/25
Bước 4: Xử lý kết quả trả về
Ví dụ
Statement stmt = conn.createStatement(
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY);
Các loại phương thức của ResultSet
• Các phương thức di chuyển con trỏ
• Các phương thức lấy dữ liệu trong ResultSet
• Các phương thức cập nhật dữ liệu
27/25
Bước 4: Xử lý kết quả trả về
Các phương thức di chuyển con trỏ
28/25
Bước 4: Xử lý kết quả trả về
public void beforeFirst() throws SQLException di chuyển đến vị trí bắt đầu của
ResultSet
public void afterLast() throws SQLException di chuyển đến vị trí cuối cùng của
ResultSet
public boolean first() throws SQLException di chuyển đến hàng đầu tiên
public void last() throws SQLException di chuyển đến hàng cuối cùng
public boolean absolute(int row) throws
SQLException
di chuyển đến 1 hàng chỉ định
public boolean relative(int row) throws
SQLException
di chuyển đến hàng cách row hàng từ vị
trí hiện tại, nếu row dương thì di chuyển
về cuối ResultSet và ngược lại
public boolean previous() throws
SQLException
di chuyển đến hàng đứng phía trước
public boolean next() throws SQLException di chuyển đến hàng tiếp theo
public int getRow() throws SQLException trả lại vị trí hàng mà con trỏ đang chỉ đến
public void moveToInsertRow() throws
SQLException
di chyển đến 1 hàng mới để chèn dữ liệu.
Vị trí hiện tại sẽ được lưu lại
public void moveToCurrentRow() throws
SQLException
di chuyển về lại vị trí cũ nếu con trỏ
đang chỉ đến vị trí hàng vừa được chen
Các phương thức lấy dữ liệu trong ResultSet
• getXXX(String columnName) throws
SQLException
• getXXX(int columnIndex) throws SQLException
XXX: là kiểu tương ứng của dữ liệu
columnName: tên của cột trong ResultSet
columnIndex: chỉ số của cột trong ResultSet, bắt đầu
từ 1
29/25
Bước 4: Xử lý kết quả trả về
Các phương thức cập nhật dữ liệu
• Cập nhật dữ liệu trong ResultSet
public void updateXXX(int columnIndex, XXX s) throws
SQLException
public void updateXXX(String columnName, XXX s)
throws SQLException
• Cập nhật dữ liệu từ ResultSet đến Database
30/25
Bước 4: Xử lý kết quả trả về
public void updateRow() Cập nhật các thay đổi của hàng hiện tại trong
ResultSet đến Database
public void deleteRow() Xóa hàng hiện tại trong Database
public void refreshRow() Lấy dữ liệu trong Database vào ResultSet
public void cancelRowUpdates() Hủy bỏ các thay đổi dữ liệu vừa được thực hiện
public void insertRow() Chèn dữ liệu trong hàng hiện tại của ResultSet vào
Database
Sử dụng phương thức close()
Ví dụ
rs.close();
stmt.close();
conn.close();
31/25
Bước 5: Đóng kết nối
Transaction: là một khối các thao tác cần được
thực hiện tương ứng với nhau.
Kết nối JDBC mặc định ở chế độ auto-commit:
mỗi câu lệnh SQL được hoàn thành riêng lẻ
Một transaction sẽ được bắt đầu khi chấm dứt
chế độ auto-commit và kết thúc khi đối tượng
kết nối thực hiện phương thức commit()
32/25
Transaction
Các phương thức
• conn.setAutoCommit(false): tắt chế độ auto-
commit
• conn.commit(): xác nhận các thay đổi đến
Database và kết thúc transaction
• conn.rollback(): hủy bỏ tất cả các thay đổi trong
Database từ vị trí bắt đầu transaction
33/25
Transaction