Tạo class tương ứng với table trong database

Chào anh chị ! Theo em được biết thì mỗi hàng trong table của database là 1 đối tượng, mỗi cột trong Database là 1 thuộc tính của class.
VD : bảng BANG_MONHOC(maMH, tenMH, soTinChi) tương đương với class

class MonHoc {
      private int maMH;
      private string tenMH;
      private int soTinChi;
    constructor(){
        ///// stuff code
       }
}

Còn trường hợp nhiều bảng kết hợp lại thành 1 đối tượng thì code sao ạ ?
VD bảng VD : bảng
BANG_MONHOC(maMH, tenMH, soTinChi, maNganh, maKhoa)
BANG_NGANH(maNganh, tenNganh)
BANG_KHOA(maKhoa, tenKhoa)

muốn lấy thông tin đầy đủ của 1 môn thì phải kết hợp các cột của 3 bảng lại :

vậy em phải tạo đối tượng nhứ nào mới phù hợp ạ ?

class MonHoc {
   private int maMH;
   private string tenMH;
   private int soTinChi;
   private string TenLop;
   private string TenKhoa;
     constructor(){
    ///// stuff code
  }
}

Mong mọi người giải thích giúp em

1 Like

Relationship cũng sẽ được thể hiện thông qua thuộc tính:
Ví dụ môn học MH thuộc ngành N và khoa K

class MH {
//
private N nganh;
private K khoa;
//
}
4 Likes

Em tìm hiểu theo những cách sau nhé:

  • Cách 1: Dùng Hibernate, tạo các table và các khóa chính khóa phụ, keywork: relationship, foreign keys, lúc này sẽ dùng các anotation: @OneToMany, @OneToOne… để map và lấy dữ liệu.
  • Cách 2: Tạo các table riêng lẻ không cần tạo khóa phụ, dùng JOIN trong câu query để lấy thông tin trong các bảng cần thiết. Lệnh JOIN như thế nào thì e tự tìm hiểu nhé.
5 Likes

cách 1 của @hoaphongba có vẻ ngắn nhưng mấy cái nhắc tới trong đó rất là kì diệu đó :crazy_face: :crazy_face: :crazy_face: nhưng chúc mừng vì bạn sẽ không bao giờ thoát khỏi đâu

4 Likes

những cái kỳ diệu thì luôn làm cho con người ta thích thú =))

tìm hiểu về JPA Hibernate nhé e. Nó sẽ mapping entity vs table trong db -> mình sẽ làm việc vs entity thay vì làm việc trực tiếp trong DB
https://o7planning.org/vi/11665/huong-dan-spring-boot-hibernate-va-spring-transaction
với cả, a nghĩ e nên học cách đặt tên biến hay class bằng tiếng Anh.

2 Likes

Trước tiên bạn cần hiểu hai khái niệm Entity và Model:

  • Entity là object dùng để mapping vào DB (ví dụ mỗi dòng trong bảng User sẽ là một entity riêng)
  • Model dựa trên entity, có thêm hoặc bỏ bớt một số thông tin, để response về.

Với entity thì bạn viết nó giống cấu trúc table trong DB, cả những relationship liên quan như khóa ngoại này nọ. Còn model thì đây là cái return về cho người dùng, nên dữ liệu cần thay đổi xíu để cho phù hợp:

  • Bỏ bớt thông tin, vd như entity có password field nhưng khi return về model thì không nên return cả password.
  • Tổng hợp dữ liệu, nhiều entity join lại với nhau và return về một model tổng hợp

Để chuyển đổi entity thành model thì tương ứng có 2 cách:

  • Lấy ra entity trong DB, load dữ liệu lên model, có thể thêm 1 số thông tin khác hoặc skip load một số field.
  • Thực hiện join các bảng và return model tổng hợp (mình làm bên mongodb thì khi aggregate bằng mongotemplate sẽ có chỉ định thêm model.class để đưa kết quả ra).
User user = userRepository.findUserById();  // Tìm user entity
UserModel userModel = new UserModel(user);  // Load trong constructor của model
userModel.setLastViewed(new Date());  // Thêm field
return userModel;

Khi load model thì bỏ password đi.

class UserModel {
    ...
    public UserModel(User user) {
        name = user.name;
        ...
        // ? = user.password
    }
}

Tổng hợp dữ liệu (mình dùng mongodb nên không rõ bên SQL làm như thế nào)

mongoTemplate.aggregate(aggregation, "users", UserModel.class);
    // Chỉ định model class để làm output sau khi tổng hợp

Như vậy, bạn chỉ cần tạo thêm class Model là dữ liệu tổng hợp thôi, thay vì entity lấy trong DB ra thì model được custom từ entity hoặc là kết quả join là được.

4 Likes

@tonghoangvu @TyE @hoaphongba @thanghanu98
Cảm ơn mọi người đã giải đáp
Vậy là như này đúng không ạ :

  • thêm dữ liệu vào database sẽ đi theo con đường : dữ liệu từ giao diện( lấy user,password từ form) ==> new đối tượng model mới : new User(user,passwork) ==> tạo entity, các câu lênh SQL sẽ code tại đậy INSERT INTO USER VALUES(user,password đã hash).
  • load dữ liệu lên : entity chạy câu lệnh SQL SELECT USERNAME, PASSWORD FROM USER ====> tạo đối tượng user mới trên model new User(username, password) ===> load username lên giao diện !

bác Tống Hoàng Vũ cũng đã đề cập rồi đó e, cứ follow đó là đc. còn làm việc với Repository e có thể xem JPARepository hoặc CRUDRepository e nhé.

hi ! vậy nếu dùng cách tạo một đối tượng mới rồi add các thuộc tính của đối tượng này vào mỗi cột của table trong database (GUI => object => insert table) còn khi muốn lấy dữ liệu ra thì load mỗi dòng trong table ra tạo thành một đối tượng rồi load các thuộc tính này ( query Database => object => GUI) Cho mình hỏi cách này có hợp lý k0 hay có thuộc mô hình nào không ?

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?