iBATIS (MyBatis) একটি SQL mapping framework যা SQL queries এবং Java objects এর মধ্যে সম্পর্ক স্থাপন করতে সাহায্য করে। যখন complex objects (যেমন one-to-many, many-to-one, many-to-many relationships) এর মধ্যে সম্পর্ক থাকে, তখন Nested Result Maps ব্যবহার করা হয়। Nested Result Maps আপনাকে SQL result sets-কে nested Java objects এর সাথে ম্যাপ করতে সক্ষম করে, যা ডেটাবেসের related data-কে Java objects-এ কাঠামোবদ্ধ করে রাখে।
এই গাইডে আমরা Nested Result Maps এর মাধ্যমে complex object mapping কিভাবে করা যায়, তা শিখব।
1. What is Nested Result Map?
Nested Result Map হল একটি বিশেষ ধরনের Result Map যা complex relationships বা nested objects কে ম্যাপ করার জন্য ব্যবহৃত হয়। সাধারণত one-to-many বা many-to-one সম্পর্কের জন্য এটি ব্যবহৃত হয়, যেখানে এক টেবিলের একটি রেকর্ড অন্য টেবিলের একাধিক রেকর্ডের সাথে সম্পর্কিত থাকে।
Nested Result Maps ব্যবহার করে, আপনি একাধিক result maps কে একে অপরের মধ্যে যুক্ত করতে পারেন, যাতে SQL query result গুলি একাধিক Java objects-এ সঠিকভাবে ম্যাপ হতে পারে।
2. Example: One-to-Many Relationship with Nested Result Map
ধরা যাক, আমাদের একটি Department এবং Employee টেবিল আছে। এক Department একাধিক Employee এর সাথে সম্পর্কিত। আমরা Department এর তথ্য এবং সম্পর্কিত Employee গুলির তথ্য একই query তে নিয়ে আসতে চাই।
Department and Employee Java Classes:
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
}
SQL Query (for One-to-Many Relationship):
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 = #{departmentId}
Explanation:
LEFT JOIN:DepartmentএবংEmployeeটেবিলকেdepartment_idদ্বারা join করা হয়েছে।WHERE:departmentIdব্যবহার করে নির্দিষ্ট department এর employees খোঁজা হচ্ছে।
3. Nested Result Map Configuration in iBATIS
ResultMap XML Configuration:
<resultMap id="employeeResultMap" type="Employee">
<id property="id" column="employee_id"/>
<result property="name" column="employee_name"/>
<result property="departmentId" column="department_id"/>
</resultMap>
<resultMap id="departmentResultMap" type="Department">
<id property="id" column="department_id"/>
<result property="name" column="department_name"/>
<collection property="employees" ofType="Employee" resultMap="employeeResultMap"/>
</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 = #{departmentId}
</select>
Explanation:
<resultMap>: প্রথমটিemployeeResultMapএবং দ্বিতীয়টিdepartmentResultMapহিসাবে দুটি result map তৈরি করা হয়েছে।employeeResultMapব্যবহার করেEmployeeobject-এ employee_id, employee_name, এবং department_id ম্যানুয়ালি ম্যাপ করা হয়েছে।departmentResultMap-এDepartmentobject এর employees collection কে Employee গুলির list হিসাবে ম্যাপ করা হয়েছে।
<collection>: এটি one-to-many সম্পর্ক ম্যাপ করার জন্য ব্যবহার করা হয়েছে, যেখানেDepartmentobject-এ employees নামে একটি list তৈরি করা হয়েছে, যা Employee objects ধারণ করে।ofType="Employee": এটি Employee ক্লাসের object হিসেবে collection কে মানচিত্রিত করে।resultMap="employeeResultMap": এখানে Employee-এর জন্য employeeResultMap ব্যবহার করা হয়েছে।
4. Using Nested Result Map in Java
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
Department department = sqlSession.selectOne("getDepartmentWithEmployees", 1); // Fetch department 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 (এখানেDepartmentobject) ফিরিয়ে আনবে, যার মধ্যে employees গুলির একটি list থাকবে।getEmployees(): এটি Department object থেকে Employee objects-এর একটি collection ফেরত আনে, যা আমরা পরে employee এর নাম প্রদর্শন করতে ব্যবহার করি।
5. Many-to-One Relationship with Nested Result Map
এখন, আমরা Many-to-One সম্পর্কের জন্য একটি nested result map কনফিগার করব। Many employees একটি single department এর সাথে সম্পর্কিত।
Department and Employee Classes (Updated):
public class Employee {
private int id;
private String name;
private Department department; // Many-to-One relationship
// Getters and Setters
}
public class Department {
private int id;
private String name;
// Getters and Setters
}
Many-to-One Nested ResultMap Example:
<resultMap id="departmentResultMap" type="Department">
<id property="id" column="department_id"/>
<result property="name" column="department_name"/>
</resultMap>
<resultMap id="employeeResultMap" type="Employee">
<id property="id" column="employee_id"/>
<result property="name" column="employee_name"/>
<association property="department" javaType="Department" resultMap="departmentResultMap"/>
</resultMap>
<select id="getEmployeeWithDepartment" resultMap="employeeResultMap">
SELECT e.id AS employee_id, e.name AS employee_name,
d.id AS department_id, d.name AS department_name
FROM employee e
LEFT JOIN department d ON e.department_id = d.id
WHERE e.id = #{id}
</select>
Explanation:
<association>: এখানে Employee object এর মধ্যে Department কে many-to-one সম্পর্ক হিসেবে ম্যাপ করা হয়েছে। এটিEmployeeobject এরdepartmentproperty তে Department object মানচিত্রিত করবে।resultMap="departmentResultMap":Departmentobject-এর জন্য departmentResultMap ব্যবহার করা হয়েছে।
6. Using the Many-to-One Relationship in Java
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
Employee employee = sqlSession.selectOne("getEmployeeWithDepartment", 1); // Fetch employee by ID
System.out.println("Employee Name: " + employee.getName());
System.out.println("Department Name: " + employee.getDepartment().getName());
} finally {
sqlSession.close();
}
Explanation:
selectOne(): এই মেথডটি Employee object ফিরিয়ে আনবে, যার মধ্যে Department object অন্তর্ভুক্ত থাকবে।getDepartment(): এটিEmployeeobject এর মধ্যে সম্পর্কিত Department object ফেরত আনে, যার মাধ্যমে Department এর নাম প্রদর্শন করা হয়।
- Nested Result Maps iBATIS/MyBatis-এ complex relationships বা nested data structures ম্যাপ করতে ব্যবহৃত হয়। One-to-many এবং many-to-one সম্পর্কগুলিতে এই ধরনের mapping অত্যন্ত কার্যকরী।
- ResultMap এবং Nested ResultMap ব্যবহারের মাধ্যমে SQL query এর result sets-কে Java objects-এ কাস্টমাইজড ভাবে ম্যাপ করা যায়, যাতে complex object structures সহজেই তৈরি করা যায়।
- iBATIS/MyBatis-এ complex data mapping হ্যান্ডল করার জন্য ResultMap একটি শক্তিশালী টুল, যা relationships এবং nested objects এর মধ্যে ম্যাপিং সঠিকভাবে করতে সাহায্য করে।
Read more