Hiểu Rõ Cách Ánh Xạ Kết Quả Phức Hợp trong MyBatis: Mối Quan Hệ Một-Nhiều

1. Ánh Xạ Mối Quan Hệ Một-Nhiều

1.1 Tạo hai bảng: product và category

1.2 Cấu hình XML với resultMap và select

<resultMap id="categoryWithProducts" type="com.example.entity.Category">
    <id column="catId" property="id"/>
    <result column="catName" property="name"/>
    <collection column="prodId" property="productList" ofType="com.example.entity.Product">
        <id column="prodId" property="id"/>
        <result column="prodName" property="name"/>
        <result column="prodDesc" property="description"/>
        <result column="catId" property="categoryId"/>
    </collection>
</resultMap>

<select id="selectCategoryWithProducts" resultMap="categoryWithProducts">
    SELECT c.id as catId, c.name as catName, p.id as prodId, p.name as prodName, p.description as prodDesc
    FROM category c
    LEFT JOIN product p ON c.id = p.category_id
</select>

Thẻ resultMap: Thuộc tính id dùng để định danh duy nhất cho resultMap này. Giá trị này phải khớp với thuộc tính resultMap trong thẻ select. Thuộc tính type chỉ định kiểu đối tượng Java mà resultMap này ánh xạ đến, trong ví dụ trên là ánh xạ đến instance của lớp Category.

Thẻ id: Dùng để ánh xạ trường khóa chính. Thuộc tính column chỉ định tên cột trong bảng cơ sở dữ liệu, trong khi thuộc tính property chỉ định tên thuộc tính trong đối tượng Java.

Thẻ result: Dùng để ánh xạ các trường không phải khóa chính.

Thẻ collection: Xử lý ánh xạ mối quan hệ một-nhiều hoặc nhiều-nhiều. Thuộc tính column chỉ định tên cột khóa ngoại, thuộc tính property chỉ định tên thuộc tính trong đối tượng Java dùng để lưu trữ tập hợp (trong ví dụ trên, bạn cần tạo thuộc tính productList trong lớp Category với kiểu trả về là List), thuộc tính ofType chỉ định kiểu của các phần tử trong tập hợp.

Các thẻ id và result lồng nhau: Cách sử dụng và chức năng tương tự như trên.

Thẻ select: Dùng để lưu trữ câu lệnh SQL, ở đây chúng ta sử dụng left join, sẽ được giải thích ở phần dưới.

1.3 Câu lệnh SQL kiểm thử trong cơ sở dữ liệu: Left Join

Left Join: Dùng để kết hợp hai hoặc nhiều bảng theo điều kiện kết nối đã chỉ định, trả về tất cả các bản ghi từ bảng bên trái (bảng được chỉ định trong mệnh đề FROM) và các bản ghi khớp từ bảng bên phải (bảng được chỉ định trong mệnh đề JOIN). Nếu bảng bên phải không có bản ghi khớp, kết quả sẽ trả về NULL.

Cú pháp cơ bản:

SELECT các trường bạn muốn chọn FROM tên_bảng_trái LEFT JOIN tên_bảng_phải ON left_table.column_name = right_table.column_name;

SELECT
    c.id AS catId,
    c.name AS catName,
    p.id AS prodId,
    p.name AS prodName,
    p.description AS prodDesc 
FROM
    category c
    LEFT JOIN product p ON c.id = p.category_id

Kết quả truy vấn:

Thẻ: mybatis ResultMap Collection left join one-to-many

Đăng vào ngày 27 tháng 6 lúc 17:51