JDBC Rowset trong Java (Bài 6)
Jdbc rowset trong java. Lập trình cơ sở dữ liệu là việc thực thi các câu lệnh như Insert, Update, Delete, Select, … trong ứng dụng.
Nếu như việc thực thi các câu lệnh Insert, Update, Delete sẽ trả về một số nguyên cho biết số dòng bị ảnh hưởng thì việc thực thi câu lệnh Select sẽ trả về tập kết quả là số dòng dữ liệu truy vấn được và đối tượng RowSet giữ tập kết quả này.
Jdbc rowset trong java bao gồm CachedRowSet, JdbcRowSet, WebRowSet, JoinRowSet, FilteredRowSet. Sử dụng RowSet sẽ giúp các lập trình viên thực hiện các thao tác thêm, xoá và cập nhật một cách tiện lợi mà không cần phải viết các câu lệnh sql.
Jdbc rowset trong java – CachedRowSet
CachedRowSet không yêu cầu phải duy trì một kết nối với cơ sở dữ liệu. Nó chỉ thực hiện kết nối khi có submit và điều này sẽ làm tăng hiệu suất cho cơ sở dữ liệu. CachedRowSetcó thể thực hiện các hoạt động sau đây trên cơ sở dữ liệu
Insert: Để thực hiện thêm một dòng dữ liệu vào bảng, chúng ta sử dụng phương thức moveToInsertRow()
Update: Phương thức updateRow() được sử dụng để cập nhật một dòng dữ liệu của bảng
Delete: Sử dụng phương thức deleteRow() để xoá một dòng dữ liệu của bảng.
Select: Một đối tượng CachedRowSet là có thể cuộn (scrollable) và điều này cho phép chúng ta duyệt bản ghi theo nhiều cách. Một khi con trỏ nằm tại dòng mong muốn, các phương thức getter có thể được gọi để lấy các giá trị của các cột.
CachedRowSet – Thêm dữ liệu
crs.moveToInsertRow(); // Chỉ định cột và dữ liệu được thêm mới crs.updateDatatype(int columnIndex, Datatype x); //... crs.insertRow(); crs.moveToCurrentRow(); crs.acceptChanges(); //submit
Trong đó crs là đối tượng CachedRowSet, columnIndex bắt đầu từ 1, Datatype là kiểu dữ liệu
CachedRowSet – Cập nhật dữ liệu
// Chỉ định cột và dữ liệu được cập nhật crs.updateDatatype(int columnIndex, Datatype x); //... crs.updateRow(); crs.acceptChanges(); //submit
CachedRowSet – Xoá dữ liệu
//Xoá dữ liệu của dòng hiện tại crs.deleteRow(); crs.acceptChanges();
CachedRowSet – Xem dữ liệu
CachedRowSet cho phép chúng ta duyệt dữ liệu với các thao tác First (bản ghi đầu tiên), Next (bản ghi kế tiếp), Previous (bản ghi trước) và Last (bản ghi cuối cùng). Bên dưới là các phương thức tương ứng.
Hiển thị bản ghi đầu tiên
crs.beforeFirst(); if(crs.next()) { crs.getDatatype(String columnLabel); }
Hiển thị bản ghi kế tiếp (Sử dụng phương thức crs.isLast() để kiểm tra xem đang là bản ghi cuối cùng chưa. Nếu trả về true thì đang ở bản ghi cuối cùng)
if(crs.next()) { crs.getDatatype(String columnLabel); }
Hiển thị bản ghi trước (Sử dụng phương thức crs.isFirst() để kiểm tra xem đang là bản ghi đầu tiên chưa. Nếu trả về true thì đang ở đầu bản ghi đầu tiên)
if(crs.previous()) { crs.getDatatype(String columnLabel); }
Hiển thị bản ghi cuối cùng
crs.afterLast(); if(crs.previous()) { crs.getDatatype(String columnLabel); }
Jdbc rowset trong java – Bài thực hành số 1
Cho câu lệnh tạo cơ sở dữ liệu và tạo bảng
CREATE DATABASE [StudentDB] go use StudentDB go CREATE TABLE [dbo].[Class]( [Class_ID] [varchar](20) PRIMARY KEY, [Class_Name] [nvarchar](50) NULL, ) go CREATE TABLE [dbo].[Student]( [Student_ID] [varchar](20) PRIMARY KEY, [Student_Name] [nvarchar](100) NULL, [Sex] [nvarchar](10) NULL, [Class_ID] [varchar](20) NULL, )
Câu 1: Chương trình quản lý thông tin lớp học
Thiết kế giao diện
Viết xử lý
Trường hợp đang focus tại “Class Name”, người dùng có thể nhấn phím Enter để thực hiện chức năng “Display”
Khi người dùng chọn nút lệnh “Delete”, chương trình sẽ hiển thị thông báo xác nhận xóa
Trường hợp chọn “Yes”, chương trình sẽ kiểm tra xem lớp này đã có sinh viên chưa. Nếu lớp đã có sinh viên đăng ký học thì chương trình sẽ hiển thị thông báo
Khi chọn một dòng trong JTable, chương trình sẽ hiển thị sỉ số sinh viên của lớp đó tại “Number of students”
Yêu cầu tạo 2 procedure
Một procedure kiểm tra xem lớp đã có sinh viên đăng ký học chưa và một procedure hiển thị sỉ số sinh viên của lớp.
Câu 2: Chương trình xem, thêm, xoá và cập nhật sinh viên
Viết xử lý
Lần hiển thị đầu tiên: các đối tượng ID, Name, Sex và Class là không thể thao tác.
Khi người dùng chọn nút lệnh “First”: hiển thị thông tin đầu tiên, các nút lệnh “Update”, “Delete”, “Next” và “Last” ở trạng thái enable. Nút lệnh “First” ở trạng thái Disable. Hiển thị số record hiện hành và tổng số record hiện có.
Khi người dùng chọn nút lệnh “Next”: hiển thị thông tin kế tiếp, các nút lệnh “First”, “Previous” ở trạng thái enable. Đồng thời kiểm tra nếu đang ở record cuối cùng thì thiết lập trang thái cho các nút lệnh “Next” và Last” là disable.
Khi người dùng chọn nút lệnh “Previous”: hiển thị thông tin trước đó, đồng thời kiểm tra nếu đang ở record đầu tiên thì thiết lập trạng thái cho các nút lệnh “First” và “Previous” là disable
Khi người dùng chọn nút lệnh “Last”: hiển thị thông tin cuối cùng, các nút lệnh “First”, “Previous” ở trạng thái Enable, nút lệnh “Last” ở trạng thái disable.
Khi người dùng chọn nút lệnh “Update”, cho phép nhập thông tin ID, Name và chọn thông tin về Sex, Class và khi người dùng chọn nút lệnh “Save”, chương trình tiến hành cập nhật thông tin
Khi người dùng chọn nút lệnh “Insert”, cho phép người dùng nhập thông tin và thêm vào cơ sở dữ liệu khi người dùng chọn nút “Save”
Jdbc rowset trong java – JoinRowSet
JoinRowSet được sử dụng để kết nối nhiều RowSet trong database. Sử dụng JoinRowSet tương tự như việc kết nối giữa 2 bảng trong database phải thông qua điều kiện kết với mục đích truy vấn dữ liệu từ nhiều bảng.
Ví dụ chúng ta có 2 bảng Class và Students. Hai bảng này liên kết với nhau thông qua khoá ngoại là ClassID. Trong trường hợp này chúng ta sẽ có 2 RowSet, một cho bảng Class và một cho bảng Students. Bây giờ chúng ta sẽ thực hiện kết nối 2 RowSet này sử dụng JoinRowSet để có được thông tin của lớp và sinh viên.
Tạo JoinRowSet
JoinRowSet jrs = new JoinRowSetImpl();
Sử dụng phương thức addRowSet(Rowset, “Column name in database”) để kết nối 2 RowSet dựa vào khoá ngoại (column)
Jdbc rowset trong java – FilteredRowSet
FilteredRowSet được sử dụng để lấy về tập giá trị từ RowSet dựa vào điều kiện lọc tương tự như mệnh đề where trong câu lệnh Select.
FilteredRowSet frs = new FilteredRowSetImpl();
Jdbc rowset trong java – Ví dụ JoinRowSet
package swing_pkg.sql.jdbcrowset; import com.sun.rowset.CachedRowSetImpl; import com.sun.rowset.JoinRowSetImpl; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Vector; import javax.sql.rowset.CachedRowSet; import javax.sql.rowset.JoinRowSet; import javax.swing.DefaultListModel; /** * * @author giasutinhoc.vn */ public class JoinRowSetConsoleExample { private CachedRowSet crClass, crStudent; private PreparedStatement ps; private Connection c; //Column name in database private static final String CLASS_ID = "class_id"; public JoinRowSetConsoleExample() { getClassInfo(); getStudentInfo(); } private String getStringUrl() { return "jdbc:sqlserver://localhost;databasename=StudentDB"; } private void getClassInfo() { try { String sql = "Select * from class"; crClass = new CachedRowSetImpl(); crClass.setUrl(getStringUrl()); crClass.setUsername("sa"); crClass.setPassword("sa"); crClass.setCommand(sql); crClass.execute(); } catch (Exception e) { e.printStackTrace(); } } private void getStudentInfo() { try { String sql = "Select * from student"; crStudent = new CachedRowSetImpl(); crStudent.setUrl(getStringUrl()); crStudent.setUsername("sa"); crStudent.setPassword("sa"); crStudent.setCommand(sql); crStudent.execute(); } catch (Exception e) { e.printStackTrace(); } } private void getStudentBaseClassId() { try { JoinRowSet jrs = new JoinRowSetImpl(); jrs.addRowSet(crClass, CLASS_ID); jrs.addRowSet(crStudent, CLASS_ID); while(jrs.next()) { System.out.print("ID: "+ jrs.getString("student_id")); System.out.print(", Name: " + jrs.getString("student_name")); System.out.print(", Sex:" + jrs.getString("sex")); System.out.println(", Class: " + jrs.getString("class_name")); } } catch (Exception ex) { ex.printStackTrace(); } } public static void main(String args[]) { JoinRowSetConsoleExample jrsce = new JoinRowSetConsoleExample(); jrsce.getStudentBaseClassId(); } }
Kết quả hiển thị
Jdbc rowset trong java – Sử dụng FilteredRowSet
Các bước thực hiện
Bước 1: Tạo class cài đặt giao diện Predicate
package swing_pkg.sql.jdbcrowset; import java.sql.SQLException; import javax.sql.RowSet; import javax.sql.rowset.Predicate; /** * * @author giasutinhoc.vn */ public class ClassName implements Predicate { //Danh sách tham số dùng để filter private Datatype paramName; public ClassName(Danh sách tham số) { //Gán giá trị cho các tham số } @Override public boolean evaluate(RowSet rs) { try { if(input your condition) return true; } catch (SQLException ex) { ex.printStackTrace(); } return false; } @Override public boolean evaluate(Object value, int column) throws SQLException { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } @Override public boolean evaluate(Object value, String columnName) throws SQLException { throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. } }
Bước 2: Tạo đối tượng FilteredRowSet, thiết lập filter và duyệt
// Tạo đối tượng FilteredRowSet frs = new FilteredRowSetImpl(); // Thiết lập fiter frs.populate(jrs); ClassName cr = new ClassName(argument list for condition); frs.setFilter(cr); //Duyệt while (frs.next()) { // Lấy giá trị frs.getDatatype("columnName"); }
Ví dụ sử dụng FilteredRowSet
JoinRowSet jrs = new JoinRowSetImpl(); jrs.addRowSet(crClass, "class_id"); jrs.addRowSet(crStudent, "class_id"); //Lọc dữ liệu******************* FilteredRowSet frs = new FilteredRowSetImpl(); frs.populate(jrs); ClassPredicateImpl cr = new ClassPredicateImpl(classId); frs.setFilter(cr); //Duyệt while (frs.next()) { System.out.println(frs.getString("student_id")); //... }
Jdbc rowset trong java – Bài thực hành số 2
Câu 1: Cho giao diện chương trình như hình bên dưới
Viết xử lý
Class info: hiển thị tất cả thông tin của bảng Class; Student info: hiển thị tất cả thông tin của bảng Student; Display a list of students by class: hiển thị thông tin của bảng Student và bảng Class.
Gợi ý: Sử dụng CachedRowSet và JoinRowSet
Câu 2: Cho giao diện chương trình như hình bên dưới
Viết xử lý: Hiển thị thông tin sinh viên dựa vào mã lớp (class_id) được chọn tại list
Gợi ý: Sử dụng FilteredRowSet