iBATIS (এখন MyBatis) হল একটি SQL Mapping Framework যা JDBC এবং Java objects এর মধ্যে সহজে ম্যাপিং করতে সহায়তা করে। Collection Mapping iBATIS/MyBatis এর একটি শক্তিশালী বৈশিষ্ট্য, যা একাধিক সম্পর্কিত অবজেক্ট বা ডেটার সঠিকভাবে ম্যাপিং করার সুযোগ দেয়। এটি one-to-many অথবা many-to-many সম্পর্কের ক্ষেত্রে ব্যবহার করা হয়, যেখানে একাধিক রেকর্ড বা অবজেক্ট একটি Java Collection (যেমন List বা Set) হিসেবে ম্যাপ করা হয়।
এখানে আমরা iBATIS/MyBatis-এ Collection Mapping এর কিছু উদাহরণ দেখব।
1. One-to-Many Collection Mapping (Employee - Projects Example)
ধরা যাক, আমাদের একটি Employee টেবিল এবং একটি Project টেবিল রয়েছে, যেখানে Employee এর একাধিক Project থাকতে পারে (এক কর্মচারী একাধিক প্রকল্পে কাজ করতে পারে)। এটি একটি one-to-many সম্পর্ক।
Step 1: SQL Mapping File (XML)
Employee এবং Project সম্পর্কিত one-to-many সম্পর্কের জন্য collection mapping ব্যবহার করা হবে। এখানে Employee এর জন্য একাধিক Project রেকর্ড ম্যাপ করা হবে।
<mapper namespace="com.example.mapper.EmployeeMapper">
<!-- ResultMap for Employee with Projects -->
<resultMap id="employeeWithProjectsResultMap" type="com.example.model.Employee">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<!-- Collection Mapping for Projects -->
<collection property="projects" ofType="com.example.model.Project">
<result property="id" column="project_id"/>
<result property="name" column="project_name"/>
</collection>
</resultMap>
<!-- Select Employee with Projects -->
<select id="getEmployeeWithProjects" resultMap="employeeWithProjectsResultMap">
SELECT e.id, e.name, e.age, p.id AS project_id, p.name AS project_name
FROM employee e
LEFT JOIN project p ON e.id = p.employee_id
WHERE e.id = #{id}
</select>
</mapper>
Explanation:
<collection>ট্যাগ ব্যবহার করা হয়েছে Employee অবজেক্টের projects প্রপার্টিকে একটি List হিসেবে ম্যাপ করার জন্য।- LEFT JOIN ব্যবহার করা হয়েছে যাতে Employee এর সাথে Project এর সম্পর্ক স্থাপন করা যায়।
Step 2: Java Code
import org.apache.ibatis.session.SqlSession;
public class EmployeeService {
private SqlSession session;
public EmployeeService(SqlSession session) {
this.session = session;
}
public Employee getEmployeeWithProjects(int id) {
return session.selectOne("com.example.mapper.EmployeeMapper.getEmployeeWithProjects", id);
}
}
এখানে:
getEmployeeWithProjectsমেথডটি Employee অবজেক্টের সাথে সম্পর্কিত Project অবজেক্টগুলির একটি List রিটার্ন করবে।
2. Many-to-Many Collection Mapping (Student - Course Example)
এখানে Student এবং Course টেবিলের মধ্যে একটি many-to-many সম্পর্ক রয়েছে। একটি Student একাধিক Course তে ভর্তি হতে পারে, এবং একটি Course এ একাধিক Student থাকতে পারে।
Step 1: SQL Mapping File (XML)
<mapper namespace="com.example.mapper.StudentMapper">
<!-- ResultMap for Student with Courses -->
<resultMap id="studentWithCoursesResultMap" type="com.example.model.Student">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<!-- Collection Mapping for Courses -->
<collection property="courses" ofType="com.example.model.Course">
<result property="id" column="course_id"/>
<result property="name" column="course_name"/>
</collection>
</resultMap>
<!-- Select Student with Courses -->
<select id="getStudentWithCourses" resultMap="studentWithCoursesResultMap">
SELECT s.id, s.name, s.age, c.id AS course_id, c.name AS course_name
FROM student s
JOIN student_course sc ON s.id = sc.student_id
JOIN course c ON sc.course_id = c.id
WHERE s.id = #{id}
</select>
</mapper>
Explanation:
<collection>ট্যাগ ব্যবহার করা হয়েছে Student অবজেক্টের courses প্রপার্টি একটি List হিসেবে ম্যাপ করার জন্য।- JOIN ব্যবহার করে Student এবং Course টেবিলের মধ্যে সম্পর্ক স্থাপন করা হয়েছে।
Step 2: Java Code
import org.apache.ibatis.session.SqlSession;
public class StudentService {
private SqlSession session;
public StudentService(SqlSession session) {
this.session = session;
}
public Student getStudentWithCourses(int id) {
return session.selectOne("com.example.mapper.StudentMapper.getStudentWithCourses", id);
}
}
এখানে:
getStudentWithCoursesমেথডটি Student অবজেক্টের সাথে সংশ্লিষ্ট Course অবজেক্টগুলির একটি List রিটার্ন করবে।
3. Best Practices for Collection Mapping in iBATIS/MyBatis:
- Use
resultMapfor Complex Relationships: resultMap ব্যবহার করা উচিত জটিল সম্পর্ক (যেমন one-to-many বা many-to-many) এর জন্য, কারণ এটি সহজে সম্পর্কিত অবজেক্টের ম্যাপিং করতে সহায়ক। - Avoid N+1 Query Problem: N+1 Query Problem এড়াতে JOIN FETCH বা LEFT JOIN ব্যবহার করুন, যাতে একাধিক সম্পর্কিত অবজেক্টের ডেটা একসাথে লোড হয় এবং অতিরিক্ত কোয়েরি না চলে।
- Cache Collection Data: যদি একাধিক রেকর্ড বার বার একই রকম ব্যবহার করা হয়, তবে second-level cache ব্যবহার করতে পারেন, যাতে পারফরম্যান্স উন্নত হয়।
- Use Lazy Loading and Eager Loading Appropriately: Lazy Loading এবং Eager Loading কৌশলগুলি সঠিকভাবে ব্যবহার করুন, যেখানে Lazy Loading ব্যবহার করা উচিত যখন সম্পর্কিত ডেটা কেবল তখনই প্রয়োজন হয়, আর Eager Loading তখন ব্যবহার করুন যখন সম্পর্কিত সব ডেটা একসাথে প্রয়োজন।
- Paginate Large Collections: বড় collections একসাথে লোড করার পরিবর্তে, আপনি pagination ব্যবহার করতে পারেন, যাতে ডেটা একসাথে বড় আকারে না আসে।
iBATIS/MyBatis-এ Collection Mapping একটি শক্তিশালী বৈশিষ্ট্য যা একাধিক সম্পর্কিত অবজেক্ট বা রেকর্ডকে একটি Java collection (যেমন List, Set) হিসেবে ম্যাপ করতে সহায়ক। resultMap এবং <collection> ট্যাগ ব্যবহার করে আপনি one-to-many বা many-to-many সম্পর্কের ডেটাকে খুব সহজেই Java objects এ ম্যাপ করতে পারেন। এটি ডেটাবেসের সাথে সম্পর্কিত ডেটা একসাথে পরিচালনা করার একটি সহজ, কার্যকর এবং উন্নত পদ্ধতি সরবরাহ করে।
Read more