Result Map এর মাধ্যমে Data Mapping

Parameter এবং Result Mapping - আইবাটিস (iBATIS) - Java Technologies

326

iBATIS (বর্তমানে MyBatis) একটি SQL Mapping Framework, যা SQL queries এবং Java objects এর মধ্যে সম্পর্ক স্থাপন করতে সহায়ক। Result Map iBATIS/MyBatis-এ একটি গুরুত্বপূর্ণ ফিচার, যা SQL query এর ফলাফলকে Java objects-এর সাথে map করার জন্য ব্যবহৃত হয়। Result Map ব্যবহার করে আপনি SQL query এর result set কে Java objects এর সাথে কাস্টমাইজড ভাবে ম্যাপ করতে পারেন, বিশেষত যখন column names এবং Java object field names মিলে না অথবা complex relationships থাকে।

1. Result Map এর ভূমিকা

ResultMap ব্যবহার করে আপনি SQL query result set-কে Java objects এর properties এর সাথে ম্যাপ করতে পারেন। এটি সাধারণত ব্যবহার করা হয়:

  • SQL column names এবং Java object field names যদি একে অপরের সাথে মেলে না।
  • Complex relationships (যেমন One-to-Many, Many-to-One) ম্যাপ করতে।
  • Nested result sets বা complex queries যেগুলির মধ্যে একাধিক টেবিলের তথ্য অন্তর্ভুক্ত থাকে।

2. ResultMap কীভাবে কাজ করে?

ResultMap কনফিগারেশনে আপনি:

  1. SQL query থেকে প্রত্যাশিত columns এবং তাদের Java fields এর মধ্যে সম্পর্ক তৈরি করতে পারবেন।
  2. ResultSet এর মধ্যে nested properties বা related entities এর জন্য nested result maps ব্যবহার করতে পারবেন।
  3. SQL column names এবং Java object field names এর মধ্যে কাস্টম ম্যাপিং করতে পারবেন।

3. Example of ResultMap in iBATIS/MyBatis

Scenario:

ধরা যাক, আমাদের Employee এবং Department দুটি টেবিল রয়েছে, যেখানে Employee টেবিলের মধ্যে department_id কলামটি Department টেবিলের id কলামের সাথে সম্পর্কিত।

Employee and Department Java Classes:
public class Employee {
    private int id;
    private String name;
    private int departmentId;
    private Department department;  // One-to-many or many-to-one relationship

    // Getters and Setters
}

public class Department {
    private int id;
    private String name;

    // Getters and Setters
}
SQL Query:

ধরা যাক, আমাদের SQL query হতে হবে এমন, যেখানে Employee এবং Department টেবিলের তথ্য যুক্ত থাকবে।

SELECT
    e.id AS employee_id,
    e.name AS employee_name,
    e.department_id AS employee_department_id,
    d.id AS department_id,
    d.name AS department_name
FROM employee e
JOIN department d ON e.department_id = d.id

4. ResultMap Configuration Example

ResultMap XML Configuration:

<resultMap id="employeeResultMap" type="Employee">
    <id property="id" column="employee_id"/>
    <result property="name" column="employee_name"/>
    <result property="departmentId" column="employee_department_id"/>
    <association property="department" javaType="Department">
        <id property="id" column="department_id"/>
        <result property="name" column="department_name"/>
    </association>
</resultMap>

<select id="getEmployeeWithDepartment" resultMap="employeeResultMap">
    SELECT
        e.id AS employee_id,
        e.name AS employee_name,
        e.department_id AS employee_department_id,
        d.id AS department_id,
        d.name AS department_name
    FROM employee e
    JOIN department d ON e.department_id = d.id
</select>

Explanation:

  • <resultMap>: এটি একটি result map যা Employee object এর মধ্যে SQL query এর ফলাফল ম্যাপ করবে।
  • <id>: এটি primary key বা unique identifier হিসেবে ব্যবহৃত হয়। এখানে employee_id কে Employee এর id এর সাথে ম্যাপ করা হয়েছে।
  • <result>: এটি column-to-property mapping তৈরি করে। যেমন, employee_name কলামটি Employee এর name field এর সাথে ম্যাপ করা হয়েছে।
  • <association>: এটি one-to-one বা many-to-one সম্পর্কের জন্য ব্যবহৃত হয়। এখানে Employee এর department কে Department object এর সাথে সম্পর্কিত করা হয়েছে।

5. Using the ResultMap in Java

SqlSession sqlSession = sqlSessionFactory.openSession();
try {
    Employee employee = sqlSession.selectOne("getEmployeeWithDepartment", 1);  // Fetch employee with department by id
    System.out.println("Employee Name: " + employee.getName());
    System.out.println("Department Name: " + employee.getDepartment().getName());
} finally {
    sqlSession.close();
}

Explanation:

  • selectOne(): এই মেথডটি SQL query-টি চালিয়ে একটি single record (এখানে Employee object) ফেরত আনে।
  • getDepartment(): এটি Employee object থেকে Department সম্পর্কিত ডেটা ফেরত এনে Department এর নাম প্রদর্শন করে।

6. Nested ResultMap Example

iBATIS/MyBatis-এ nested result maps ব্যবহার করা হয় যখন আপনার query তে complex relationships থাকে, যেমন One-to-Many বা Many-to-One সম্পর্ক।

One-to-Many Relationship Example:

ধরা যাক, একটি Department একাধিক Employee এর সাথে সম্পর্কিত।

Department and Employee Classes (Java Objects):
public class Department {
    private int id;
    private String name;
    private List<Employee> employees;  // One-to-many relationship

    // Getters and Setters
}

public class Employee {
    private int id;
    private String name;
    private int departmentId;

    // Getters and Setters
}
ResultMap XML Configuration for One-to-Many:
<resultMap id="departmentResultMap" type="Department">
    <id property="id" column="department_id"/>
    <result property="name" column="department_name"/>
    <collection property="employees" ofType="Employee">
        <id property="id" column="employee_id"/>
        <result property="name" column="employee_name"/>
    </collection>
</resultMap>

<select id="getDepartmentWithEmployees" resultMap="departmentResultMap">
    SELECT
        d.id AS department_id,
        d.name AS department_name,
        e.id AS employee_id,
        e.name AS employee_name
    FROM department d
    LEFT JOIN employee e ON d.id = e.department_id
    WHERE d.id = #{id}
</select>

Explanation:

  • <collection>: এখানে employees নামে একটি one-to-many সম্পর্ক ম্যাপ করা হয়েছে। ofType="Employee" নির্দেশ করে যে এটি Employee object গুলির একটি collection হবে।
  • LEFT JOIN: department টেবিলের সাথে employee টেবিলকে join করা হয়েছে এবং department_id এর মাধ্যমে সম্পর্ক স্থাপন করা হয়েছে।

Using the Query in Java:

SqlSession sqlSession = sqlSessionFactory.openSession();
try {
    Department department = sqlSession.selectOne("getDepartmentWithEmployees", 1);  // Fetch department with employees by id
    System.out.println("Department Name: " + department.getName());
    for (Employee employee : department.getEmployees()) {
        System.out.println("Employee Name: " + employee.getName());
    }
} finally {
    sqlSession.close();
}

Explanation:

  • selectOne(): এই মেথডটি একটি single record (এখানে Department object) ফেরত আনে, যার মধ্যে সংশ্লিষ্ট Employee গুলির একটি collection অন্তর্ভুক্ত থাকবে।
  • getEmployees(): এটি Department এর মধ্যে থাকা Employee গুলির তালিকা ফেরত আনে।

7. Benefits of Using ResultMap

  • Custom Mapping: আপনি SQL query থেকে columns এবং Java fields এর মধ্যে কাস্টম mapping তৈরি করতে পারেন।
  • Complex Relationships: One-to-Many, Many-to-One, এবং Nested Mapping সমর্থন করে, যা complex relationships হ্যান্ডল করতে সহায়ক।
  • Separation of SQL and Java: SQL এবং Java objects এর মধ্যে একটি পরিষ্কার আলাদা করতে সহায়ক, যা কোডের maintainability উন্নত করে।
  • Readability and Reusability: ResultMap এর মাধ্যমে SQL কোড এবং Java কোডের মধ্যে স্পষ্ট একটি স্তর বজায় থাকে, যা কোড পুনঃব্যবহারযোগ্য এবং আরও পরিষ্কার রাখে।

  • ResultMap iBATIS/MyBatis-এ SQL query results এবং Java objects এর মধ্যে সম্পর্ক স্থাপনের একটি শক্তিশালী টুল। এটি custom mapping, complex relationships (যেমন one-to-many, many-to-one) হ্যান্ডল করতে সাহায্য করে।
  • ResultMap ব্যবহার করে SQL columns এবং Java object fields এর মধ্যে সম্পর্ক তৈরি করতে পারেন, যা আপনাকে nested results এবং related entities এর সাথে কাজ করতে সহজ করে তোলে।
Content added By
Promotion

Are you sure to start over?

Loading...