JDBC Rowset trong Java (Bài 6)

JDBC Rowset trong Java (Bài 6)

jdbc-rowset-trong-java-1
Lập trình cơ sở dữ liệu

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

jdbc rowset trong java 1

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

jdbc rowset trong java 2

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

jdbc rowset trong java 3

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

jdbc rowset trong java 4

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.

jdbc rowset trong java 5

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ó.

jdbc rowset trong java 6

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.

jdbc rowset trong java 7

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

jdbc rowset trong java 8

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 9

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 11

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

jdbc rowset trong java 12

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

jdbc rowset trong java 13

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

Alert: You are not allowed to copy content or view source !!