Lập trình Java cơ bản - Chương 7: Truy cập cơ sở dữ liệu với JDBC
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
ung 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
File đính kèm:
- Lập trình Java cơ bản - Chương 7_Truy cập cơ sở dữ liệu với JDBC.pdf