Lập trình java nâng cao - Chương 06: Truy cập cơ sở dữ liệu với jdbc

Tài liệu Lập trình java nâng cao - Chương 06: Truy cập cơ sở dữ liệu với jdbc: LẬP TRÌNH JAVA NCChương 06: Truy cập cơ sở dữ liệu với JDBC Lê TânBộ môn: Lập trình máy tínhNội dung của chương 06Khái niệm JDBCCác bước truy cập cơ sở dữ liệu với JDBCNạp database driversTạo kết nối sử dụng đối tượng ConnectionTạo đối tượng Statement để thực thi các lệnh sql.Lớp DriverManager và ConnectionLớp Statement và PreparedStatementLớp ResultSet và ResultSetMetaDataTransactionCập nhật ResultSetTổng quanJDBC cung cấp tập các lớp và interface cho phép chương trình Java có thể “nói chuyện” được với hệ CSDLTập các lớp của JDBC có thể làm việc được với mọi hệ csdl. Kết nối CSDLCó 3 bước chính để kết nối CSDL.Nạp database driversTạo kết nối sử dụng đối tượng ConnectionTạo đối tượng Statement để thực thi các lệnh sql. Ví dụChuẩn bị CSDL: Cài đặt một hệ quản trị CSDL có trình điều khiển ODBC cài đặt sẵn như ORACLE, SQL Server, MS Access . . . Thiết kế cơ sở dữ liệu: Tạo CSDL, tạo bảng, tạo chỉ mục . . . cho ứng dụng trên nền hệ quản trị CSDL chuẩn trên (ví dụ: MS Access)Tạo đối tượng...

ppt34 trang | Chia sẻ: Khủng Long | Lượt xem: 1239 | Lượt tải: 2download
Bạn đang xem trước 20 trang mẫu tài liệu Lập trình java nâng cao - Chương 06: Truy cập cơ sở dữ liệu với jdbc, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
LẬP TRÌNH JAVA NCChương 06: Truy cập cơ sở dữ liệu với JDBC Lê TânBộ môn: Lập trình máy tínhNội dung của chương 06Khái niệm JDBCCác bước truy cập cơ sở dữ liệu với JDBCNạp database driversTạo kết nối sử dụng đối tượng ConnectionTạo đối tượng Statement để thực thi các lệnh sql.Lớp DriverManager và ConnectionLớp Statement và PreparedStatementLớp ResultSet và ResultSetMetaDataTransactionCập nhật ResultSetTổng quanJDBC cung cấp tập các lớp và interface cho phép chương trình Java có thể “nói chuyện” được với hệ CSDLTập các lớp của JDBC có thể làm việc được với mọi hệ csdl. Kết nối CSDLCó 3 bước chính để kết nối CSDL.Nạp database driversTạo kết nối sử dụng đối tượng ConnectionTạo đối tượng Statement để thực thi các lệnh sql. Ví dụChuẩn bị CSDL: Cài đặt một hệ quản trị CSDL có trình điều khiển ODBC cài đặt sẵn như ORACLE, SQL Server, MS Access . . . Thiết kế cơ sở dữ liệu: Tạo CSDL, tạo bảng, tạo chỉ mục . . . cho ứng dụng trên nền hệ quản trị CSDL chuẩn trên (ví dụ: MS Access)Tạo đối tượng ODBCTạo đối tượng ODBCKhởi động trình ứng dụng Control Panel Khởi động Administrative ToolsChọn Data Source (ODBC)Chọn System DSN, AddChọn Driver của hệ quản trị cơ sở dữ liệu tương ứng (ví dụ: MS Access)Tạo đối tượng ODBC (tt)Trong khung Data Source Name: gõ tên đối tượng ODBC của CSDL (ví dụ: ATM) Chọn Select... rồi chọn CSDL đã tạoNạp trình điều khiển và tạo kết nốitry{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String url = "jdbc:odbc:ATM"; Connection con=DriverManager.getConnection(url); Statement stmt = con.createStatement(); : :}catch(Exception e){...}Với Oracle, thay vì sử dụng Class.forName(), ta sử dụng: DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());Database URLDatabase URL là một chuỗi được dùng để kết nối csdl.cú pháp : jdbc:subprotocol name:other_stuffThe subprotocol name được dùng tuỳ vào loại driver sử dụng để kết nối csdl. ví dụ : subprotocol name là odbc nếu driver là cầu nối jdbcodbcOther_stuff cũng phụ thuộc vào loại driver nào được sử dụng. ví dụ nếu driver là cầu nối jdbcodbc thì thành phần này là tên của đối tượng ODBCCó thể có tên truy cập và mật khẩuVới Oracle, url = “jdbc:oracle:oci8:@MyDB”Database DriverBảo đảm ứng dụng java tương tác với mọi csdl dưới một cách thức chuẩn và duy nhất.Bảo đảm những yêu cầu từ chương trình sẽ được biểu diễn trong csdl dưới một ngôn ngữ mà csdl hiểu được Nhận các yêu cầu từ client, chuyển nó nó vào định dạng mà csdl có thể hiểu được và thể hiện trong csdl. Nhận các phản hồi, chuyển nó ngược lại định dạng dữ liệu java và thể hiện trong ứng dụng. Nạp DriverLớp DriverManager chịu trách nhiệm nạp driver và tạo kết nối đến csdl.DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver()); hoặcClass.forName(String);This returns the object associated with the class with the given string name.Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”); Equivalent to: new sun.jdbc.odbc.JdbcOdbcDriver(); If you have a driver from another vendor, then find out the class name of that driver and load it instead.JDBC DriverCó 4 loại JDBC Driver Loại 1: JDBC/ODBCLoại 2: Native-APILoại 3: Open Protocol-NetLoại 4: Proprietary-Protocol-NetLoại 2,3,4 nói chung được viết bởi nhà cung cấp csdl, hiệu quả hơn loại 1 nhưng thực hiện phức tạp hơn. Loại 1: JDBC/ODBCjdk hỗ trợ cầu nối jdbc-odbc (jdbc-odbc bridge).Mềm dẻo nhưng không hiệu quả. DatabaseNetwork InterfaceServerAplicationJDBC DriverODBC DriverNetwork InterfaceDiskClientLoại 2: Native-API Tốt hơn loại 1, loại này cho phép JDBC giao tiếp trực tiếp với các driver hay các hàm API của CSDL. DatabaseNetwork InterfaceServerAplicationJDBC DriverNative Database LibraryNetwork InterfaceDiskClientLoại 3: Open Protocol-Net DriversCó thể chuyển các yêu cầu đến các csdl nằm ở xa.Có thể giao tiếp với nhiều loại CSDL.Không phải của nhà cung cấp csdlTất cả bằng mã javaDatabaseNetwork InterfaceServerAplicationJDBC Driver ClientNetwork InterfaceDiskClientJDBC Driver ServerNative Database LibraryLoại 4: Proprietary-Protocol Net 100% javaCó khả năng giao tiếp trực tiếp với hệ CSDL không cần chuyển đổiDatabaseNetwork InterfaceServerAplicationJDBC Driver Network InterfaceDiskClientGói Java.sqlCung cấp tập hợp các lớp và interface dùng để trao đổi với CSDL.Các lớp DriverManager Date, Time Timestamp Types Các InterfacesDriverConnection DatabaseMetaData StatementPreparedStatement CallableStatementResultSet ResultSetMetaData Đối tượng StatementĐối tượng Connection chứa liên kết trực tiếp đến csdl.Sử dụng đối tượng Connection để tạo đối tượng Statement.Statement s = con.createStatement();Đối tượng này có nhiệm vụ gửi các câu lệnh sql đến csdl.Thực hiện câu lệnh sql: s.executeQuery(String sql) or s.executeUpdate(String sql) methodCùng một đối tượng Statement có thể sử dụng cho nhiều câu lệnh sql khác nhau.Các phương thức thực thiCó 3 phương thức thực thiexecuteQuery()executeUpdate()execute()The executeQuery() Nhận câu lệnh SQL (select) làm đối số, trả lại đối tượng ResultSet Ví dụ: ResultSet rs = s.executeQuery(“SELECT * FROM Books”);Phương thức executeUpdate()Nhận các câu lệnh sql dạng cập nhậtTrả lại số nguyên biểu thị số hàng được cập nhật.UPDATE, INSERT, or DELETE. Phương thức execute()Được áp dụng cho trường hợp không rõ loại sql nào được thực hiện, trả về kiểu boolean, true nếu đó là executeQuery() -> getResultSet() để lấy kết quả . Được áp dụng cho trường hợp câu lệnh sql tạo ra tự động bởi chương trình.Các phương thức thực thi (tt)ResultSetChứa một hoặc nhiều hàng dữ liệu từ việc thực hiện câu lệnh truy vấn.Có thể lấy dữ liệu từng hàng dữ liệu một trong ResultSet. Sử dụng phương thức next() để di chuyển đến hàng dữ liệu tiếp theo trong ResultSet. Hàm next() trả lại true chỉ rằng hàng chứa dữ liệu, trả lại false hàng cuối không chứa dữ liệu. Thực hiện while (rs.next()){ // examine a row from the results }Sử dụng ResultSetĐể lấy dữ liệu ở các cột trên mỗi hàng của ResultSet, ta dùng các phương thức.getXXX(int | String) //XXX là kiểu của dữ liệu cần lấyĐối số là chỉ số cột tính từ 1.Áp dụng cho các cột có kiểu dữ liệu là int, float, Date..... Ví dụ :String isbn = rs.getString(1); // Column thứ 1float price = rs.getDouble(“Price”); // Column có tên “Price”Các phương thức getXXX()x: phương thức getXXX có thể dùng được để nhận kiểu giá trị nàyX: nên dùng phương thức getXXX cho kiểu giá trị nàyResultSet MetadataĐối tượng này cho biết thông tin về ResultSetResultSet rs = stmt.executeQuery(SQLString); ResultSetMetaData rsmd = rs.getMetaData();Để lấy số cột của kết quả: int numOfCols = rsmd.getColumnCount();Để lấy tên các cột của kết quả: String str = rsmd.getColumnName(int column);Đối tượng PreparedStatementĐược sử dụng thay cho Statement để thực hiện một câu lệnh SQL trên CSDL nhiều lần.Câu lệnh SQL sẽ được biên dịch trước → rút ngắn thời gian.Ví dụ: PreparedStatement ps = con.prepareStatement(“update bangdiem set toan = ? where sbd = ?”);Gán giá trị cho tham số: setXXX(stt_thamso, giatri), ví dụ: ps.setDouble(1, 8.5); ps.setString(2, “005”);Thực hiện câu lệnh sql: ps.executeQuery(), hoặc ps.executeUpdate() methodTransactionTransaction: là một khối các thao tác cần được thực hiện tương ứng với nhau. Transaction chỉ hoàn thành thực sự khi tất cả các thao tác được thực hiện hoàn chỉnh.Một transaction sẽ được bắt đầu khi chấm dứt trạng thái auto-commit và kết thúc khi đối tượng kết nối thực hiện phương thức commit() → transaction mới.Thực hiện transaction:Bắt đầu transaction: conn.setAutoCommit(false);Các lệnh execute SQL;Xác nhận transaction: conn.commit(); // → transaction mớiPhương thức rollbackPhương thức rollback của đối tượng kết nối được sử dụng để loại bỏ mọi tác dụng của một transaction chưa thực hiện commit.Cần thực hiện rollback ngay khi nhận được ngoại lệ SQLException để bỏ qua mọi tác dụng của transaction.Thực hiện rollback: conn.rollback();ResultSet cuộn đượcResultSet là tập các records nhận được từ việc thực hiện một lệnh SQL trên một CSDL.ResultSet cuộn được là một ResultSet cho phép người dùng duyệt các records theo 2 chiều, từ BOF đến EOF hay ngược lại.Tạo một ResultSet cuộn được (và cập nhật được): Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSet rs = stmt.executeQuery(“select * from SV”);Định vị trong ResultSetvoid beforeFirst() throws SQLException: di chuyển đến vị trí đầu của tập ResultSet rs, không chứa record (boolean isBeforeFirst() throws SQLException).void afterLast() throws SQLException: di chuyển đến vị trí cuối của tập ResultSet rs, không chứa record (boolean isAfterLast() throws SQLException).boolean first() throws SQLException: di chuyển đến vị trí record đầu tiên của tập ResultSet rs, false nếu rs là rỗng (boolean isFirst() throws SQLException).boolean last() throws SQLException: di chuyển đến vị trí record cuối của tập ResultSet rs, false nếu rs là rỗng (boolean isLast() throws SQLException).Định vị trong ResultSet (tt)boolean next() throws SQLException: di chuyển đến vị trí record tiếp theo của tập ResultSet rs, false nếu rs.last() là true.boolean previous() throws SQLException: di chuyển đến record kế trước của tập ResultSet rs, false nếu rs.first() là true.boolean absolute(int rows) throws SQLException: di chuyển đến record thứ rows của tập ResultSet rs, nếu rows dương thì tính từ vị trí first, nếu rows âm thì tính từ vị trí last (int getRow() throws SQLException).boolean relative(int rows) throws SQLException : di chuyển đến record có vị trí tương đối là rows so với vị trí hiện hành của tập ResultSet rs, nếu rows dương thì chuyển về hướng cuối tập rs, và ngược lại.Cập nhật CSDL sử dụng ResultSetThay đổi giá trị một ô: rs.absolute(3); //Nhảy đến hàng thứ 3 kể từ đầu rs rs.updateFloat(“Toan”,10.5); //Đổi cột Toan thành 10.5 rs.cancelRowUpdates(); //Bỏ qua các lệnh thay đổi trên rs.updateFloat(“Toan”,8.5); //Đổi cột Toan thành 8.5 rs.updateRow(); //Xác nhận sự thay đổiThêm một record: rs.moveToInsertRow(); //Chuyển đến vị trí chèn dành riêng rs.updateFloat(“Toan”,9.5); //Điền các giá trị vào các ô rs.insertRow(); //Chèn record này vào rsXóa một record: rs.absolute(3); //Nhảy đến record cần xóa (chỉ dùng absolute) rs.deleteRow(); //Xác nhận xóa recordChương trình mẫuimport java.sql.*;class JDBCDemo1 { public static void main(String[ ] args) { try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con=DriverManager.getConnection("jdbc:odbc:Accserver"); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(args[0]); ResultSetMetaData rsmd = rs.getMetaData(); int numberOfColumns = rsmd.getColumnCount(); for(int j=1; j<=numberOfColumns;j++) { System.out.println(rsmd.getColumnLabel(j)); } while(rs.next()) { for(int i=1; i<=numberOfColumns;i++){ System.out.println(rs.getObject(i)); }} rs.close(); stmt.close(); } catch(Exception e){ System.out.println("Error " + e); }}}Chương trình mẫu 2import java.sql.*;public class CreateTable { public static void main(String[] args) { String url = "jdbc:odbc:vd1";Connection conn;Statement stmt; try { Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver"); } catch (java.lang.ClassNotFoundException e) {} try { conn = DriverManager.getConnection(url); stmt = conn.createStatement(); stmt.executeUpdate("INSERT INTO COFFEES VALUES ('ABC','101',6.99,0,0)"); stmt.close(); conn.close(); } catch (java.sql.SQLException e) { System.err.print(“SQLException:"); System.err.println(e.getMessage()); }}} Ví dụ: Chương trình cập nhật dữ liệu Tạo một bảng dữ liệu bằng MS. Access, chứa mã sinh viên, họ tên, điểm thi các môn Toán, Lý, Hoá. Sau đó viết chương trình thêm, xoá bản ghi, sửa số liệu, tìm kiếm bản ghi theo mã sinh viên.

Các file đính kèm theo tài liệu này:

  • ppttailieu.ppt
Tài liệu liên quan