Kiến trúc và các thành phần cốt lõi trong framework IBatis.Net

IBatis.Net là một framework ORM (Object-Relational Mapping) bán tự động, cho phép lập trình viên kiểm soát hoàn toàn các câu lệnh SQL trong khi vẫn tận dụng được sức mạnh của việc ánh xạ đối tượng trong môi trường .NET. Dưới đây là những thành phần cấu tạo và kỹ thuật thực thi quan trọng cần nắm vững khi làm việc với framework này.

1. Hệ thống cấu hình trọng yếu

Để vận hành IBatis.Net, hệ thống thường dựa trên 4 tệp cấu hình chính:

  • Providers.config: Chứa thông tin về các trình điều khiển (drivers) cơ sở dữ liệu, phổ biến nhất là SQL Server.
  • Mapper.xml: Nơi định nghĩa các câu lệnh SQL (Select, Insert, Update, Delete) và thiết lập mối quan hệ ánh xạ giữa cột trong DB với thuộc tính của đối tượng.
  • SqlMap.config: Tệp cấu hình trung tâm, quản lý các kết nối, các tệp Mapper và các thiết lập global cho framework.
  • Database.config: Tách biệt thông tin chi tiết về chuỗi kết nối (connection string) để dễ dàng quản lý theo môi trường triển khai.

2. Đặc điểm kỹ thuật nổi bật

  • Kiểm soát SQL: Khác với các ORM tự động hoàn toàn, IBatis cho phép viết SQL thuần, giúp tối ưu hóa hiệu năng cho các truy vấn phức tạp.
  • Cơ chế Proxy: Sử dụng thư viện Castle DynamicProxy để tạo các lớp đại diện cho Interface DAO, giúp kết nối trực tiếp phương thức code với SqlID trong XML.
  • Xử lý tham số: Phân biệt rõ giữa ký hiệu # (Parameter Binding - an toàn, chống SQL Injection) và $ (String Substitution - nối chuỗi trực tiếp, tiềm ẩn rủi ro).
  • Quan hệ phức tạp: Hỗ trợ mạnh mẽ việc ánh xạ kết quả từ các mối quan hệ 1-N hoặc N-N thông qua resultMap.
  • Caching & Transactions: Tích hợp sẵn cơ chế quản lý giao dịch và bộ nhớ đệm (Local/Global cache) để tăng tốc truy xuất dữ liệu.

3. Quy trình triển khai nghiệp vụ

  1. Phân tích yêu cầu và định nghĩa Interface cho lớp truy cập dữ liệu (DAO).
  2. Viết các tệp Mapper XML tương ứng để thực thi các phương thức đã khai báo.
  3. Đăng ký Mapper vào SqlMap.config và cấu hình DB kết nối.
  4. Sử dụng dịch vụ quản lý DAO để khởi tạo và gọi thực thi các tác vụ cơ sở dữ liệu.

4. Các mẫu thực thi SQL phổ biến

A. Chèn dữ liệu theo cấu trúc Cha-Con (Master-Detail)

Ví dụ thực hiện chèn một bản ghi chính và danh sách các bản ghi phụ liên quan trong cùng một block:

<insert id="CreateOrderAndItems" parameterClass="OrderHeader">
    BEGIN
        INSERT INTO Orders (OrderID, OrderDate, CustomerID, TotalAmount)
        VALUES (#Id#, #CreatedAt#, #CustId#, #Total#);

        <iterate property="Items" conjunction=" ">
            INSERT INTO OrderDetails (DetailID, OrderID, ProductID, Quantity, UnitPrice)
            VALUES (#Items[].DetailId#, #Id#, #Items[].ProdId#, #Items[].Qty#, #Items[].Price#);
        </iterate>
    END;
</insert>

B. Chèn danh sách đối tượng hàng loạt (Batch Insert)

<insert id="BatchInsertLogs" parameterClass="System.Collections.ArrayList">
    BEGIN
    <iterate conjunction=" ">
        INSERT INTO SystemLogs (LogID, LogLevel, Message, Timestamp)
        VALUES (#[].Id#, #[].Level#, #[].Msg#, #[].Time#);
    </iterate>
    END;
</insert>

C. Truy vấn ánh xạ quan hệ 1-N (ResultMap Complex)

Kỹ thuật sử dụng groupby để gộp dữ liệu từ phép JOIN nhiều bảng:

<resultMap id="CategoryResultMap" class="Category" groupby="CategoryId">
    <result property="CategoryId" column="CAT_ID" />
    <result property="CategoryName" column="CAT_NAME" />
    <result property="ProductList" resultMapping="ProductModule.ProductResult" />
</resultMap>

<resultMap id="ProductResult" class="Product">
    <result property="ProdId" column="P_ID" />
    <result property="ProdName" column="P_NAME" />
    <result property="Price" column="P_PRICE" />
</resultMap>

<select id="GetCategoryWithProducts" resultMap="CategoryResultMap" parameterClass="int">
    SELECT c.CAT_ID, c.CAT_NAME, p.P_ID, p.P_NAME, p.P_PRICE
    FROM Categories c
    LEFT JOIN Products p ON c.CAT_ID = p.CAT_ID
    WHERE c.CAT_ID = #id#
</select>

D. Xóa dữ liệu liên đới nhiều bảng

<delete id="CleanupUserSession" parameterClass="string">
    BEGIN
        DELETE FROM UserPermissions WHERE SessionKey = #key#;
        DELETE FROM ActiveSessions WHERE Key = #key#;
    END;
</delete>

E. Kiểm tra tồn tại dữ liệu

<select id="CheckEmailExists" resultClass="int" parameterClass="string">
    SELECT COUNT(1) FROM AccountUsers WHERE EmailAddress = #email#
</select>

Thẻ: IBatis.Net orm .NET Framework SQL Mapping Database Access

Đăng vào ngày 22 tháng 9 lúc 19:43