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 কনফিগারেশনে আপনি:
- SQL query থেকে প্রত্যাশিত columns এবং তাদের Java fields এর মধ্যে সম্পর্ক তৈরি করতে পারবেন।
- ResultSet এর মধ্যে nested properties বা related entities এর জন্য nested result maps ব্যবহার করতে পারবেন।
- 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 যাEmployeeobject এর মধ্যে SQL query এর ফলাফল ম্যাপ করবে।<id>: এটি primary key বা unique identifier হিসেবে ব্যবহৃত হয়। এখানে employee_id কেEmployeeএরidএর সাথে ম্যাপ করা হয়েছে।<result>: এটি column-to-property mapping তৈরি করে। যেমন, employee_name কলামটিEmployeeএরnamefield এর সাথে ম্যাপ করা হয়েছে।<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 (এখানেEmployeeobject) ফেরত আনে।getDepartment(): এটিEmployeeobject থেকে 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 (এখানেDepartmentobject) ফেরত আনে, যার মধ্যে সংশ্লিষ্ট 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 এর সাথে কাজ করতে সহজ করে তোলে।
Read more