Khái niệm◂JDBC hỗ trợ việc truy cập CSDL để thực hiện các tác vụ xử lý truy vấn, thêm, xóa, sửa, cập nhậto Tạo kết nối đến Databaseo Tạo câu lệnh truy vấn SQLo Thực thi các câu lệ
Trang 1LẬP TRÌNH JAVA
Giảng viên: Tạ Việt Phương
Ch 5 JDBC
Trang 2Nội dung
➢Giới thiệu JDBC
2
Trang 3Giới thiệu
◂JDBC: Java DataBase Connectivity
◂Là Java API (Application Programming Interface) chứa tập hợp các class và interface hỗ trợ xây dựng các ứng dụng Java truy cập đến các CSDL khác
nhau (Access, SQL Server, MySQL, Oracle, …)
Trang 4Khái niệm
◂JDBC hỗ trợ việc truy cập CSDL để thực hiện các tác vụ xử lý (truy vấn, thêm, xóa, sửa, cập nhật)
o Tạo kết nối đến Database
o Tạo câu lệnh truy vấn SQL
o Thực thi các câu lệnh SQL
o Truy vấn, hiển thị và xử lý dữ liệu trả về
◂Bao gồm 2 gói thư viện chính:
o java.sql.*: chứa các lớp và giao diện cơ sở
o javax.sql.*: chứa các lớp và giao diện mở rộng
Trang 5Kiến trúc JDBC
Trang 6Kiến trúc JDBC (tt)
➢JDBC API: Tập hợp các interface cung cấp trực tiếp cho ứng dụng để thao tác với JDBC
➢DriverManager: quản lý các trình điều khiển JDBC được coi là xương sống của JDBC Là một class
giúp kết nối giữa Java Application đến các JDBC Driver.
➢JDBC Driver: là thành phần chính giao tiếp trực tiếp với CSDL
Trang 7JDBC DRIVERS
◂Sun cung cấp đặc tả là các JDBC interface (Connection, PreparedStatement, Statement, ResultSet, …) Tập hợp các class hiện thực các JDBC interface đối với một database engine cụ thể được gọi là JDBC driver.
◂Do các hãng xây dựng DBMS hoặc một đơn vị thứ 3
Trang 8o Loại 2: Native API
o Loại 3: Network Protocol
o Loại 4: Native Protocol
➢Loại 1vàLoại 4được sử dụng phổbiến nhất
Trang 9Loại 1: JDBC ODBC
oCác trình điều khiển cầu nốiJDBC- ODBC.
oỦy nhiệm công việc truy xuất dữ liệu cho ODBC API
oSUN cung cấp một phần mềm trình điều khiển JDBC/ODBC.
Trang 10Loại 2: NATIVE API
o Chuyển lệnh gọi JDBC thành lệnh gọi API trên máy client của CSDL
o Java chuyển lệnh JDBC thànhlệnh chuẩn của DBMS
o Phụ thuộc nền tảng sử dụng
o Nâng cao hiệu quả thực hiện kết nối
o Ưu điểm: tốt hơn
o Hạn chế: Driver Type-2 và thư
viện Client-side của database cần cài đặt trên máy client
Trang 11Loại 3: NETWORK PROTOCOL
o Được viết thuần bằng Java và sử dụng giao thức Net độc lập nhà sản xuất để tru y cập đến trình theo dõi
o Hỗ trợ việc kết nối nhiều ứng dụng với nhiều CSDL khác nhau
o Ưu điểm: có thể kết nối đến nhiều hệ quản trị CSDL khác nhau mà
Trang 12Loại 4: NATIVE PROTOCOL
o Được viết thuần túy bằng Java, là loại hiệu quả nhất.
o Kết nối trực tiếp vào CSDL o Các drivers được hỗ trợ
bởi các provider DBMS o Ưu điểm:
• Nâng cao hiệu quả khi thực thi
• Độc lập platform
o Nhược điểm : đòi hỏi có driver cho từng loại CSDL
Trang 13JDBC DRIVERS
Trang 14JDBC Interface
➢ Class và Interface của JDBC API thuộc gói java.sql
➢ DriverManager: dùng để nạp các driver và tạo Connection đến cơ sở dữ liệu.
➢ Driver: Driver của cơ sở dữ liệu, mỗi JDBC Driver đều cài đặt lại Interface này.
➢ Connection : thiết lập một Connection đến cơ sở dữ liệu và cho phép tạo các Statement
➢ Statement: gắn kết với một connection đến cơ sở dữ liệu và cho phép thực thi các câu lệnh SQL.
➢ PreparedStatement: tương tự như Statement nhưng thực thi câu lệnh SQL được biên dịch trước (Precompiled SQL) và có truyền tham số
Trang 15JDBC Interface (tt)
➢ ResultSet: Cung cấp thông tin rút trích từ cơ sở dữ liệu, cho phép truy xuất các dòng dữ liệu.
➢ ResultSetMetaData: Cung cấp các thông tin như kiểu dữ liệu và các thuộc tính trong Resultset.
➢ DatabaseMetaData: Cung cấp các thông tin của cơ sở dữ liệu kết nối.
➢ SQLException: Cung cấp thông tin các ngoại lệ xảy ra khi tương tác với cơ sở dữ liệu.
Trang 16CÁC BƯỚC SỬ DỤNG JDBC
➢Đăng ký driver của JDBC (Load driver) ➢Xác định các thông số CSDL – DB kết nối ➢Tạo kết nối CSDL
➢Tạo lệnh SQL cần thực thi ➢Thực thi lệnh
➢Xử lý kết quả trả về➢Đóng Connection
Trang 17CÁC BƯỚC SỬ DỤNG JDBC
Trang 18Đăng ký driver (LOAD DRIVER)
➢ Driver là phần mềm hỗ trợ giao tiếp.
➢ JDBC driver là Java class thực hiện chuyển đổi các lệnh Java thành câu lệnh SQL tương ứng.
➢ Load driver là tạo các instance hỗ trợ liên kết và đăng ký
Trang 19Đăng ký driver (LOAD DRIVER)
➢VD khi dùng MySQL
Trang 20Đăng ký driver (LOAD DRIVER)
Trang 21Đăng ký driver (LOAD DRIVER)
◂Driver được cài đặt trong JAR file.
◂JAR phải được khai báo trong classpath:
◂1 Thêm jar file to vào IDE project
◂2 Thêm JAR file vào CLASSPATH
Trang 24Tạo kết nối đến CSDL
◂Phương thức getConnection() của lớp
DriverManager dung để thiết lập kết nối với database
Trang 25Ví dụ Load Driver và tạo kết nối
conn = DriverManager.getConnection(url);
System.out.println("Connected to the database"); return true;
Trang 26Tạo kết nối SQL Server
StringuserName = "hung";Stringpassword = "12345";
➢ Tạo kết nối trong SQL Server
Class.forName("com.microsoft.sqlserver.jdbc
Trang 27Tạo câu lệnh thực thi
o Statement statement = connection.createStatement() ;
o ResultSet executeQuery (String sql) o int executeUpdate (String sql)
o boolean execute (String sql)
Trang 28Tạo câu lệnh thực thi
String SQL = "SELECT * FROM hocsinh"; Statement stat = con.createStatement(); o Có 03 loại Statement
Trang 29Thực thi lệnh
o executeQuery() đối với câu lệnh truy vấn
String strSQL = “Select * From Registration”; ResultSet rs = stat.executeQuery(strSQL);
o executeUpdate():đối câu lệnh Insert, Update và Delete
String strSQL = “Insert into RegistrationValues(“Aptech”, “Aptech”);
int nRow = stat executeUpdate(strSQL);
o execute() dùng để tạo và xóa đối tượng như table
Trang 30Xử lý kết quả trả về và đóng kết nối
➢Xử lý kết quả
oSử dụng ResultSet nhận kết quả trả về
oSử dụng phương thức getXxx (số thứ tự/ hay tên field) của ResultSet để lấy giá trị của field
Số thứ tự bắt đầu từ 1
Xxx tương ứng với loại dữ liệu của field• 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.
o Sử dụng phương thức next() của ResultSet để duyệt lần
lượt các record
Trang 31o Resultset 2 chiều hỗ trợ các phương thức truy cập như:
first, isFirst, last,
Trang 32Xử lý kết quả trả về và đóng kết nối
◂Đóng đối tượng Connection, thì đối tượng Statement và
ResultSet sẽ tự động đóng
◂Nên đóng connection sau khi hoàn tấtConnection connection =
DriverManager.getConnection( );
/* use the database */
/* done using database */
public void close( ) {
if ( connection == null ) return; try { connection.close(); }
catch ( SQLException sqle ) { /* ignore it */ }finally { connection = null; }}
Trang 33Làm việc với ResultSet & Cursor
◂ResultSet chứa các "rows" thỏa hay trả về từ câu query.Là
đối tượng dạng bảng trong RAM, có gắn với Cursor.
◂Cursor được sinh ra khi một ResultSet được sinh ra.
◂Cursor cho phép chúng ta có thể xử lý một ResultSet từ
trên xuống dưới hoặc từ dưới lên (theo cả 2 hướng) hoặc đi đến 1 dòng chỉ định nào đó.
Trang 34Làm việc với ResultSet & Cursor
◂ResultSet hỗ trợ các phương thức để lấy dữ liệu từ cột:
◂"get" by column number starts at 1 (not 0)!
◂"get" by column name field names in table/query
String query = "SELECT * FROM Country WHERE ";ResultSet rs = statement.executeQuery( query );
// go to first row of results
Trang 35Làm việc với ResultSet & Cursor
◂ResultSet hỗ trợ các phương thức để lấy từng dòng và cột
getInt( name: String ) getInt( index: int )
go to next row of results "false" if no more go to previous row "false" if 1st result go to first row of results.
go to last row of results.go to k-th row of results.get int value of field "name"
get int value of k-th column in a record
Trang 36Làm việc với ResultSet & Cursor
◂Các phương thức get(…) trả về dữ liệu cột:
getLong(3): get by column index (most efficient)
getLong("population"): get by field name (safest)
getInt( ), getLong( ) - get Integer field valuegetFloat( ), getDouble() - get floating pt value
getString( ) getDate( ) - get Char or Varchar field value- get Date or Timestamp field value
getBoolean( ) - get a Bit field value getBytes( ) - get Binary data
getBigDecimal( ) - get Decimal field as BigDecimal
getBlob( ) getObject( ) - get Binary Large Object- get any field value
Trang 37Đối tuợng PreparedStatement
◂ PreparedStatement kế thừa từ Statement.
◂Thường được dùng với các câu lệnh SQL có tham số Thay vì thực thi đối tượng Statement nhiều lần, có thể
dung PreparedStatement.
◂Đối tượng PreparedStatement chứa 1 câu lệnh SQL đã
được biên dịch trước khi gởi đến DBMS, khác với
Trang 38Đối tuợng PreparedStatement
String sql = "INSERT INTO user_info (name, address) VALUES (?, ?);";
List<User> listUser = new ArrayList<User>();listUser.add(new User("Harry", "England"));listUser.add(new User("Batman", "USA"));
Trang 39String SQL = "SELECT * FROM hocsinh"; Statement stat = conn.createStatement(); ResultSet rs = stat.executeQuery(SQL);
Trang 40String SQL1="INSERT hocsinh VALUES(‘Nguyen Van A')";
Statement stat1 = conn.createStatement(); stat1.executeUpdate(SQL1);
Trang 41Delete một dòng
➢ Xóa một dòng thỏa mãn điều kiện trong bảng
Statement st = con.createStatement();
String sql = "DELETE FROM hocsinh WHERE ten =
Trang 42Delete tất cả các dòng
Statement st = con.createStatement(); String sql = "DELETE FROM hocsinh"; int delete = st.executeUpdate(sql); if(delete == 0){
System.out.println("All rows are completel ly deleted!");
}
Trang 43Delete một bảng
Statement st = con.createStatement(); st.execute("DROP TABLE Employee1");
System.out.println ("Table Deletion process iscompletly successfully!");
Trang 44Update
➢ Cập nhật dòng thỏa điều kiện dùng PrepareStatement
String sql = "UPDATE movies SET title = ? WHERE
Trang 45System.out.println("Enter table name:"); String table = bf.readLine();
ResultSet res = st.executeQuery("SELECT COUNT(*)FROM "+table);
int count=0;
while (res.next()){
Trang 46(Trong đó tương ứng với mỗi dấu ? là 1 tham số của store procedure
đã tạo trong Database )
oTạo 1 thể hiện của interface CallableStatement thông qua phương
thức prepareCall() dựa trên đối tượng Connection
o Gọi phương thức executeQuery() để trả về kết quả là 1 ResultSet.
String strCall = "{call
Trang 47String strCall = "{call deleteAccount(?)}";
CallableStatement caSt = con.prepareCall(strCall); caSt.setString(1, user);
Trang 48Sử dụng Transaction
Statement statement1= con.createStatement(); Statement statement2= con.createStatement();
Trang 49Statement statement1= con.createStatement();Statement statement2= con.createStatement();
Trang 50Q & A
Giảng viên: Tạ Việt PhươngE-mail: phuongtv@uit.edu.vn