MapStruct হল একটি জনপ্রিয় annotation processor যা JavaBeans (POJOs) বা ডোমেইন অবজেক্টগুলির মধ্যে ডেটা ম্যাপিংকে সহজ এবং কার্যকরী করে তোলে। তবে কখনও কখনও আপনি এমন পরিস্থিতির মুখোমুখি হন যেখানে শুধু একটি অবজেক্টের কিছু ফিল্ড আপডেট করতে হবে, অথবা একাধিক ফিল্ডের মধ্যে কিছু পরিবর্তন করতে হবে, এই ক্ষেত্রে Update Method এবং Partial Mapping কার্যকরী হয়।
MapStruct আপনাকে update methods এবং partial mapping সমর্থন করে, যা কোনো অবজেক্টের অংশিক ডেটা ম্যাপিং বা আপডেট করার সময় কাজ করে। এর মাধ্যমে আপনি নির্দিষ্ট কিছু ফিল্ড ম্যাপ করতে পারেন, এবং একে অপরের উপর নির্ভরশীল পুরো অবজেক্টের পরিবর্তন করতে পারেন।
১. MapStruct Update Method এর ধারণা
Update Method এর মাধ্যমে আপনি একটি অবজেক্টকে আপডেট করতে পারেন, যেখানে আপনি শুধুমাত্র কিছু নির্দিষ্ট ফিল্ড ম্যাপ করবেন এবং অবজেক্টের বাকি অংশ অপরিবর্তিত থাকবে। এটি মূলত existing object কে নতুন ডেটা দিয়ে আপডেট করতে ব্যবহৃত হয়।
Update Method এর জন্য @MappingTarget অ্যানোটেশন ব্যবহার করা হয়, যা বর্তমান অবজেক্টটি নির্দিষ্ট করে।
উদাহরণ:
ধরা যাক, আমাদের দুটি ক্লাস Person এবং PersonDTO রয়েছে এবং আমরা Person অবজেক্টকে PersonDTO থেকে আপডেট করতে চাই।
Person.java (Domain Object)
public class Person {
private String name;
private int age;
private String address;
// Getters and Setters
}
PersonDTO.java (DTO)
public class PersonDTO {
private String name;
private String address;
// Getters and Setters
}
এখন, আমরা update মেথড তৈরি করব, যা Person অবজেক্টে PersonDTO এর ফিল্ডগুলি আপডেট করবে।
PersonMapper.java (Mapper Interface)
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;
@Mapper
public interface PersonMapper {
// Update Method: Partial Mapping of PersonDTO to Person
void updatePersonFromDTO(PersonDTO personDTO, @MappingTarget Person person);
}
এখানে, @MappingTarget ব্যবহৃত হয়েছে Person অবজেক্টের জন্য, যা নির্দেশ করে যে ফিল্ডগুলির মান PersonDTO থেকে Person অবজেক্টে আপডেট হবে।
Main.java (Usage Example)
public class Main {
public static void main(String[] args) {
Person person = new Person();
person.setName("John");
person.setAge(30);
person.setAddress("1234 Elm Street");
PersonDTO personDTO = new PersonDTO();
personDTO.setName("Alice");
personDTO.setAddress("5678 Oak Street");
// Update Person object from PersonDTO
PersonMapper.INSTANCE.updatePersonFromDTO(personDTO, person);
System.out.println(person.getName()); // Alice
System.out.println(person.getAddress()); // 5678 Oak Street
System.out.println(person.getAge()); // 30 (unchanged)
}
}
এখানে, Person অবজেক্টে PersonDTO থেকে name এবং address ফিল্ড আপডেট হয়েছে, কিন্তু age ফিল্ড অপরিবর্তিত আছে।
২. MapStruct Partial Mapping এর ধারণা
Partial Mapping এর মাধ্যমে আপনি শুধুমাত্র একটি অবজেক্টের কিছু নির্দিষ্ট ফিল্ড ম্যাপ করতে পারেন, যা update method এর মতোই কাজ করে। তবে partial mapping তখন ব্যবহৃত হয় যখন আপনাকে পুরো অবজেক্টের পরিবর্তে কিছু নির্দিষ্ট ডেটা ম্যাপিং করতে হয়।
Partial Mapping মূলত দুটি ক্ষেত্রে কাজ করে:
- Only specific fields are mapped: কিছু নির্দিষ্ট ফিল্ড ম্যাপ করতে পারবেন।
- Update of an existing object: একটি অবজেক্টের কিছু ফিল্ড আপডেট করার জন্য ব্যবহৃত হয়।
MapStruct এ partial mapping update method এর মাধ্যমে কাজ করে, যেখানে আমরা target object (existing object) এ ম্যাপিং কার্যকর করি।
৩. Partial Mapping Example
ধরা যাক, আমাদের একটি Student ডোমেইন অবজেক্ট রয়েছে, এবং আমরা StudentDTO থেকে কেবল কিছু নির্দিষ্ট ফিল্ড ম্যাপ করতে চাই।
Student.java (Domain Object)
public class Student {
private String name;
private int age;
private String course;
// Getters and Setters
}
StudentDTO.java (DTO)
public class StudentDTO {
private String name;
private String course;
// Getters and Setters
}
এখন, Partial Mapping এর জন্য Student অবজেক্টকে StudentDTO থেকে আপডেট করতে হবে, তবে age ফিল্ড পরিবর্তন করা হবে না।
StudentMapper.java (Mapper Interface)
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;
@Mapper
public interface StudentMapper {
// Partial Mapping
void updateStudentFromDTO(StudentDTO studentDTO, @MappingTarget Student student);
}
Main.java (Usage Example)
public class Main {
public static void main(String[] args) {
Student student = new Student();
student.setName("John");
student.setAge(25);
student.setCourse("Mathematics");
StudentDTO studentDTO = new StudentDTO();
studentDTO.setName("Alice");
studentDTO.setCourse("Physics");
// Partial Update: Update only name and course, not age
StudentMapper.INSTANCE.updateStudentFromDTO(studentDTO, student);
System.out.println(student.getName()); // Alice
System.out.println(student.getCourse()); // Physics
System.out.println(student.getAge()); // 25 (unchanged)
}
}
এখানে, name এবং course ফিল্ডগুলি StudentDTO থেকে Student অবজেক্টে আপডেট হয়েছে, কিন্তু age ফিল্ড অপরিবর্তিত রয়েছে।
৪. Update Method এবং Partial Mapping এর প্রয়োজনীয়তা
- Efficiency: Update Method এবং Partial Mapping সিস্টেমে যখন শুধু কিছু নির্দিষ্ট ফিল্ড পরিবর্তন বা আপডেট করতে হয়, তখন এটি কার্যকরী এবং দ্রুত।
- Selective Updates: কখনও কখনও আপনাকে শুধুমাত্র কিছু ফিল্ড আপডেট করার প্রয়োজন হতে পারে, এবং পুরো অবজেক্টে পরিবর্তন না করে, আপনি partial mapping ব্যবহার করে শুধু নির্দিষ্ট অংশ আপডেট করতে পারবেন।
- Performance: পুরো অবজেক্টের পরিবর্তে শুধুমাত্র নির্দিষ্ট ডেটার পরিবর্তন করতে পারলে এটি বিল্ডিং এবং রেন্ডারিং প্রক্রিয়ায় সময় বাঁচায় এবং পারফরম্যান্সে উন্নতি আনে।
- Maintainability: update method ব্যবহারের মাধ্যমে আপনি কোডের রক্ষণাবেক্ষণ এবং পরিচালনা সহজ করতে পারবেন, কারণ আপনি শুধুমাত্র প্রয়োজনীয় অংশেই পরিবর্তন করবেন।
সারাংশ
MapStruct এর Update Method এবং Partial Mapping হল এমন শক্তিশালী বৈশিষ্ট্য যা ডেভেলপারদের কিছু নির্দিষ্ট ফিল্ড আপডেট বা ম্যাপ করার সময় অত্যন্ত সহায়ক। এটি একটি বিদ্যমান অবজেক্টের কিছু অংশকে পরিবর্তন করতে সক্ষম এবং প্রক্রিয়াটিকে দ্রুত ও কার্যকরী করে তোলে। Partial Mapping ও Update Method MapStruct কে আরও ব্যবহারযোগ্য এবং কার্যকরী করে তোলে, বিশেষত যখন শুধুমাত্র কিছু নির্দিষ্ট ডেটার পরিবর্তন প্রয়োজন হয়।
MapStruct হল একটি Java-ভিত্তিক কোড জেনারেটর যা DTO (Data Transfer Object) এবং ডোমেইন অবজেক্টের মধ্যে ম্যাপিং বা ডেটা কনভার্শন সহজ করে তোলে। এটি compile-time কোড জেনারেট করে এবং no reflection ব্যবহার করে, যার ফলে পারফরম্যান্স দ্রুত থাকে। এর মধ্যে একটি গুরুত্বপূর্ণ ফিচার হল Update Method, যা একটি অবজেক্টের কিছু ফিল্ডকে আপডেট করতে ব্যবহৃত হয়, বিশেষত Partial Mapping বা Partial Update এর জন্য। এটি এমন পরিস্থিতিতে ব্যবহৃত হয় যেখানে আপনি পুরো অবজেক্টটি নতুনভাবে ম্যাপ না করে, শুধুমাত্র নির্দিষ্ট কিছু ফিল্ডকে আপডেট করতে চান।
এটি সাধারণত DTO এর মানগুলি Entity তে আপডেট করার জন্য ব্যবহৃত হয়, বিশেষত যখন Entity এর বেশ কিছু ফিল্ড অপরিবর্তিত থাকে।
১. Update Method এর ধারণা
Update Method হল একটি ম্যাপিং ফাংশন যা এক অবজেক্টের কিছু মান অন্য অবজেক্টের সাথে আপডেট করে। এটি সাধারণত DTO (Data Transfer Object) থেকে ডেটা গ্রহণ করে এবং সংশ্লিষ্ট Entity (বা ডোমেইন অবজেক্ট) আপডেট করতে ব্যবহৃত হয়।
ধরা যাক, আমাদের দুটি অবজেক্ট রয়েছে:
- PersonDTO: যার মধ্যে নতুন তথ্য আসবে।
- Person: যে অবজেক্টে আপডেট করতে হবে।
ম্যাপস্ট্রাক্ট আপনাকে এ দুটি অবজেক্টের মধ্যে কাস্টম update ফাংশন তৈরি করতে সহায়তা করে। এর মাধ্যমে আপনি কিছু নির্দিষ্ট ফিল্ড আপডেট করতে পারেন।
২. Update Method এর প্রয়োজনীয়তা
Update Method ব্যবহারের কিছু গুরুত্বপূর্ণ সুবিধা হল:
- Partial Mapping: কখনও কখনও আপনাকে পুরো অবজেক্ট ম্যাপিং না করে শুধুমাত্র কিছু নির্দিষ্ট ফিল্ড আপডেট করতে হতে পারে। এ ক্ষেত্রে Update Method খুবই সহায়ক।
- Performance Improvement: আপনি পুরো অবজেক্ট ম্যাপিং না করে শুধু দরকারি ফিল্ড আপডেট করলে পারফরম্যান্সে উন্নতি আসে, বিশেষ করে বড় ডেটাসেটে।
- Reduced Overhead: শুধু পরিবর্তিত ফিল্ডগুলো আপডেট করলে কোডের জটিলতা কমে এবং একাধিক ফিল্ডের আপডেটের প্রয়োজনীয়তা কমে।
৩. Update Method Example
Scenario:
ধরা যাক, আমাদের একটি PersonDTO এবং Person অবজেক্ট রয়েছে, এবং আমরা শুধুমাত্র PersonDTO থেকে Person অবজেক্টের কিছু ফিল্ড আপডেট করতে চাই, যেমন name এবং age।
PersonDTO.java (DTO)
public class PersonDTO {
private String name;
private int age;
// Getters and Setters
}
Person.java (Entity)
public class Person {
private String name;
private int age;
private String address;
// Getters and Setters
}
PersonMapper.java (Update Method)
import org.mapstruct.Mapper;
import org.mapstruct.MappingTarget;
@Mapper
public interface PersonMapper {
// Mapping from PersonDTO to Person and updating only specific fields
void updatePersonFromDTO(PersonDTO personDTO, @MappingTarget Person person);
}
এখানে, updatePersonFromDTO মেথডটি PersonDTO থেকে Person অবজেক্টে শুধু name এবং age ফিল্ডগুলো আপডেট করবে, এবং address ফিল্ডটি অপরিবর্তিত থাকবে।
Main.java (Usage Example)
public class Main {
public static void main(String[] args) {
// Original Person entity
Person person = new Person();
person.setName("John");
person.setAge(30);
person.setAddress("New York");
// New data from PersonDTO
PersonDTO personDTO = new PersonDTO();
personDTO.setName("Mike");
personDTO.setAge(35);
// Update Person entity using MapStruct
PersonMapper.INSTANCE.updatePersonFromDTO(personDTO, person);
// Printing updated person
System.out.println("Updated Name: " + person.getName());
System.out.println("Updated Age: " + person.getAge());
System.out.println("Unchanged Address: " + person.getAddress());
}
}
এখানে, updatePersonFromDTO মেথডের মাধ্যমে PersonDTO থেকে Person অবজেক্টের name এবং age ফিল্ডগুলো আপডেট হচ্ছে, কিন্তু address ফিল্ড অপরিবর্তিত থাকে।
Output:
Updated Name: Mike
Updated Age: 35
Unchanged Address: New York
৪. Update Method এর সাথে Custom Logic ব্যবহার
কখনও কখনও আপনি custom mapping logic প্রয়োগ করতে চাইবেন। MapStruct আপনাকে কাস্টম কনভার্সন লজিক ব্যবহারের সুযোগ দেয়।
Custom Mapping Example
ধরা যাক, age ফিল্ডে কিছু কাস্টম লজিক প্রয়োগ করতে হবে, যেমন যদি age এর মান 0 থাকে তবে সেটি null করা হবে।
import org.mapstruct.Mapper;
import org.mapstruct.MappingTarget;
import org.mapstruct.AfterMapping;
import org.mapstruct.Mapping;
@Mapper
public interface PersonMapper {
@Mapping(target = "age", source = "age")
void updatePersonFromDTO(PersonDTO personDTO, @MappingTarget Person person);
@AfterMapping
default void checkAge(PersonDTO personDTO, @MappingTarget Person person) {
if (personDTO.getAge() == 0) {
person.setAge(null); // Custom logic to set age as null if 0
}
}
}
এখানে, @AfterMapping অ্যানোটেশন ব্যবহার করে কাস্টম লজিক প্রয়োগ করা হয়েছে, যা age ফিল্ডে যদি 0 থাকে তবে সেটি null করে।
৫. Summary
MapStruct Update Method একটি শক্তিশালী ফিচার যা Partial Mapping বা Partial Update বাস্তবায়ন করতে সাহায্য করে। এটি আপনাকে শুধু প্রয়োজনীয় ডেটা ফিল্ডগুলো আপডেট করতে দেয়, যাতে পুরো অবজেক্টটি রিফ্রেশ না করতে হয়। MapStruct এর মাধ্যমে DTO থেকে Entity বা Entity থেকে DTO তে কেবল নির্দিষ্ট ফিল্ড আপডেট করা সম্ভব হয়, যা পারফরম্যান্স এবং কোড সিম্পলিফিকেশনে সহায়তা করে। কাস্টম লজিক প্রয়োগের মাধ্যমে আরও নির্দিষ্ট এবং জটিল ম্যাপিংও করা যেতে পারে।
MapStruct JavaBeans এবং DTO (Data Transfer Object) এর মধ্যে ম্যাপিং করার জন্য একটি জনপ্রিয় এবং দক্ষ ফ্রেমওয়ার্ক। Partial Mapping এমন একটি পরিস্থিতি যেখানে আপনি একটি অবজেক্টের অংশবিশেষ বা কিছু নির্দিষ্ট ফিল্ড অন্য একটি অবজেক্টে ম্যাপ করতে চান, কিন্তু পুরো অবজেক্টটি ম্যাপ করার প্রয়োজন নেই। এটি বিশেষত তখন ব্যবহৃত হয় যখন আপনি একটি অবজেক্টে কিছু তথ্য আপডেট বা পরিবর্তন করতে চান, তবে পুরো অবজেক্টটি পুনরায় ম্যাপ করার প্রয়োজন নেই।
১. Partial Mapping এর প্রয়োজনীয়তা
Partial Mapping প্রয়োজনীয় হতে পারে কয়েকটি কারণে:
- Performance Improvement: পুরো অবজেক্ট ম্যাপিংয়ের তুলনায় কিছু নির্দিষ্ট ফিল্ড ম্যাপিং করতে পারলে পারফরম্যান্স বৃদ্ধি পায়।
- Object Updates: যখন শুধুমাত্র একটি অবজেক্টের কিছু প্রপার্টি পরিবর্তন হয়, তখন পুরো অবজেক্ট ম্যাপ করার পরিবর্তে শুধুমাত্র সংশ্লিষ্ট প্রপার্টিগুলি আপডেট করা হয়।
- Memory Efficiency: বড় অবজেক্টের পরিবর্তে ছোট, প্রয়োজনীয় অংশগুলিকে ম্যাপ করে মেমরি ব্যবহারের দক্ষতা বৃদ্ধি করা যায়।
২. MapStruct এ Partial Mapping করার উদাহরণ
ধরা যাক আমাদের দুটি অবজেক্ট রয়েছে: Person এবং PersonDTO। PersonDTO এ কিছু নির্দিষ্ট প্রপার্টি শুধুমাত্র আপডেট করতে চাই, কিন্তু পুরো অবজেক্ট নয়। এখানে Partial Mapping করতে হবে।
Person.java (Source Object)
public class Person {
private String name;
private String address;
private int age;
// Getters and Setters
}
PersonDTO.java (Target Object)
public class PersonDTO {
private String name;
private int age;
// Getters and Setters
}
এখন, PersonDTO এর name এবং age ফিল্ডে Person এর মান ম্যাপ করতে চাই, কিন্তু পুরো Person অবজেক্টটি নয়। আমরা MapStruct ব্যবহার করে শুধুমাত্র প্রয়োজনীয় প্রপার্টিগুলি ম্যাপ করব।
৩. Partial Mapping for Existing Object
MapStruct এ existing object এ partial mapping করতে, আপনি @MappingTarget অ্যানোটেশন ব্যবহার করতে পারেন, যা ইঙ্গিত দেয় যে আপনি একটি ইতিমধ্যেই বিদ্যমান অবজেক্টে ম্যাপিং করছেন, নতুন অবজেক্ট তৈরির পরিবর্তে।
PersonMapper.java (Mapper Interface)
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;
@Mapper
public interface PersonMapper {
// Partial Mapping to update existing PersonDTO
@Mapping(target = "name", source = "name")
@Mapping(target = "age", source = "age")
void updatePersonDTOFromPerson(Person person, @MappingTarget PersonDTO personDTO);
}
এখানে, @MappingTarget অ্যানোটেশনটি ব্যবহার করা হয়েছে যা নির্দেশ করে যে personDTO একটি বিদ্যমান অবজেক্ট, এবং আমরা তা আপডেট করব। শুধুমাত্র name এবং age ফিল্ড ম্যাপ করা হবে, বাকি ফিল্ডগুলি অপরিবর্তিত থাকবে।
৪. PersonService.java (Service Layer)
এখন, আপনি PersonService এ PersonMapper ব্যবহার করে পারশিয়াল ম্যাপিং করতে পারেন:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class PersonService {
@Autowired
private PersonMapper personMapper;
public void updatePersonDTO(Person person, PersonDTO personDTO) {
personMapper.updatePersonDTOFromPerson(person, personDTO);
}
}
এখানে, updatePersonDTOFromPerson মেথডের মাধ্যমে শুধুমাত্র name এবং age ফিল্ড আপডেট করা হবে।
৫. Main.java (Main Application)
আপনার main অ্যাপ্লিকেশনে, আপনি Person এবং PersonDTO এর মধ্যে পারশিয়াল ম্যাপিং দেখতে পাবেন:
public class Main {
public static void main(String[] args) {
Person person = new Person();
person.setName("John Doe");
person.setAddress("123 Main St");
person.setAge(30);
PersonDTO personDTO = new PersonDTO();
personDTO.setName("Old Name");
personDTO.setAge(25);
// Partial Mapping
PersonService personService = new PersonService();
personService.updatePersonDTO(person, personDTO);
System.out.println("Updated Name: " + personDTO.getName()); // John Doe
System.out.println("Updated Age: " + personDTO.getAge()); // 30
}
}
এখানে, PersonDTO এর name এবং age আপডেট হবে, কিন্তু address প্রপার্টি অপরিবর্তিত থাকবে।
৬. Partial Mapping এর উপকারিতা
- Performance Improvement: যদি কোনো নির্দিষ্ট প্রপার্টি আপডেট করতে হয়, তবে পুরো অবজেক্ট ম্যাপ করার চেয়ে পারশিয়াল ম্যাপিং অনেক দ্রুত হয়।
- Memory Efficiency: পুরো অবজেক্টের পরিবর্তে কিছু নির্দিষ্ট প্রপার্টি ম্যাপ করার মাধ্যমে মেমরি ব্যবহারে দক্ষতা বৃদ্ধি করা যায়।
- Easy Updates: যখন কোনো ফিল্ডে পরিবর্তন হয়, তখন ঐ ফিল্ডটিই আপডেট করা হয়, যাতে আরও সঠিক এবং দ্রুত প্রক্রিয়া হয়।
- Code Maintainability: পরিবর্তন বা আপডেটের সময় আপনার কোড কমপ্লেক্স না হয়ে সোজা এবং পরিষ্কার থাকে।
সারাংশ
MapStruct দিয়ে partial mapping করা একটি কার্যকরী পদ্ধতি যেখানে আপনি বিদ্যমান অবজেক্টের কিছু প্রপার্টি আপডেট করতে পারেন, পুরো অবজেক্ট নয়। এটি সাধারণত @MappingTarget অ্যানোটেশন ব্যবহার করে সম্পন্ন হয়। পারফরম্যান্স এবং মেমরি দক্ষতার জন্য, partial mapping একটি উপকারী কৌশল, যা প্রজেক্টের কার্যকারিতা এবং কোড ক্লিনলিনেসে উন্নতি আনে।
MapStruct একটি Java annotation processor টুল যা ডোমেইন অবজেক্টের মধ্যে ডেটা ম্যাপিং সোজা এবং কার্যকরভাবে করতে সাহায্য করে। এটি compile-time এ কোড জেনারেট করে, যা পারফরম্যান্সে উন্নতি আনে এবং রানটাইমে অতিরিক্ত লোড কমায়। Update Method হল একটি বিশেষ ফিচার যা MapStruct এর মাধ্যমে আমরা ব্যবহার করতে পারি যখন আমাদের একটি অবজেক্টের কিছু নির্দিষ্ট ক্ষেত্র আপডেট করতে হয়, এবং পুরো অবজেক্টকে আবার নতুন করে ম্যাপ করতে না হয়।
এখানে, আমরা Update Method এর ব্যবহার দেখব, যা একটি ডোমেইন অবজেক্টের মধ্যে কিছু নির্দিষ্ট ফিল্ড আপডেট করতে ব্যবহৃত হয়, যেমন যখন একটি পার্সিস্টেড অবজেক্টের কিছু অংশ পরিবর্তন করতে চাই।
১. Update Method এর ধারণা
Update Method ব্যবহার করার মাধ্যমে আপনি একটি অবজেক্টের কিছু নির্দিষ্ট ফিল্ড আপডেট করতে পারেন, বাকি ফিল্ডগুলির মান অপরিবর্তিত থাকে। এটি তখন খুবই উপকারী যখন আপনার একটি অবজেক্টে কিছু নতুন ডেটা আপডেট করতে চান, তবে পূর্ণ ম্যাপিং করার দরকার নেই।
এটি মূলত @MappingTarget অ্যানোটেশন ব্যবহার করে করা হয়, যা জানিয়ে দেয় যে আমরা একটি অবজেক্টের অ্যাড্রেসে আপডেট করতে যাচ্ছি, এবং কোথায় নতুন মানটি ম্যাপ করতে হবে।
২. Update Method ব্যবহার করার জন্য MapStruct কনফিগারেশন
আপনি যখন @MappingTarget ব্যবহার করবেন, তখন আপনার ম্যাপিং ইন্টারফেসে দুটি ইনপুট হবে—একটি উত্স অবজেক্ট এবং একটি লক্ষ্য (target) অবজেক্ট। এর মাধ্যমে MapStruct সেই লক্ষ্য অবজেক্টকে আপডেট করবে, এবং উত্স অবজেক্টের মান অনুযায়ী শুধুমাত্র প্রয়োজনীয় ফিল্ডগুলি পরিবর্তন করবে।
উদাহরণ:
ধরা যাক, আমাদের একটি Employee ডোমেইন ক্লাস আছে, এবং আমরা একটি EmployeeDTO থেকে Employee অবজেক্ট আপডেট করতে চাই।
Employee.java:
public class Employee {
private String name;
private String department;
private int age;
// Getters and Setters
}
EmployeeDTO.java:
public class EmployeeDTO {
private String name;
private String department;
// Getters and Setters
}
এখন, আমাদের একটি EmployeeMapper ইন্টারফেস তৈরি করতে হবে, যা EmployeeDTO থেকে Employee অবজেক্ট আপডেট করবে।
EmployeeMapper.java:
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;
@Mapper
public interface EmployeeMapper {
@Mapping(source = "name", target = "name")
@Mapping(source = "department", target = "department")
void updateEmployeeFromDTO(EmployeeDTO dto, @MappingTarget Employee employee);
}
এখানে, updateEmployeeFromDTO মেথডটি EmployeeDTO থেকে Employee অবজেক্টের ফিল্ডগুলো আপডেট করবে। @MappingTarget ব্যবহার করা হয়েছে লক্ষ্য অবজেক্ট (Employee) আপডেট করার জন্য।
৩. Update Method উদাহরণ
ধরা যাক, আপনি একটি Employee অবজেক্টের কিছু ফিল্ড আপডেট করতে চান। এর জন্য আমরা updateEmployeeFromDTO মেথড ব্যবহার করতে পারি, যা ডেটা আপডেট করবে।
Main.java:
public class Main {
public static void main(String[] args) {
Employee employee = new Employee();
employee.setName("John");
employee.setDepartment("Engineering");
employee.setAge(30);
// EmployeeDTO containing the new data to update
EmployeeDTO employeeDTO = new EmployeeDTO();
employeeDTO.setName("David");
employeeDTO.setDepartment("HR");
// Using MapStruct to update the employee object
EmployeeMapper mapper = Mappers.getMapper(EmployeeMapper.class);
mapper.updateEmployeeFromDTO(employeeDTO, employee);
// Printing the updated Employee object
System.out.println("Updated Employee: ");
System.out.println("Name: " + employee.getName()); // Output: David
System.out.println("Department: " + employee.getDepartment()); // Output: HR
System.out.println("Age: " + employee.getAge()); // Output: 30 (unchanged)
}
}
এখানে, employeeDTO থেকে name এবং department ফিল্ড আপডেট হবে, কিন্তু age ফিল্ড অপরিবর্তিত থাকবে, কারণ এটি EmployeeDTO তে নেই এবং MapStruct কেবলমাত্র name এবং department ফিল্ডগুলি আপডেট করবে।
৪. MapStruct Update Method এর সুবিধা
- Partial Updates: এটি ব্যবহার করে আপনি এক বা একাধিক ফিল্ডের মান পরিবর্তন করতে পারেন, পুরো অবজেক্টের পরিবর্তন ছাড়াই।
- No Full Object Mapping: আপনার পুরো অবজেক্ট আবার ম্যাপ করতে হবে না, যা পারফরম্যান্সে উপকারি।
- Cleaner and More Efficient: এটি কোডকে বেশি কার্যকরী এবং পরিষ্কার করে তোলে, বিশেষত যখন আপনি একটি পার্সিস্টেড অবজেক্টে শুধু কিছু নির্দিষ্ট পরিবর্তন করতে চান।
৫. Update Method ব্যবহার করে কাস্টম লজিক প্রয়োগ
MapStruct এর Update Method এর মাধ্যমে আপনি কাস্টম লজিক প্রয়োগও করতে পারেন, যেমন কিছু নির্দিষ্ট শর্তের ভিত্তিতে আপডেট করা বা একটি ফিল্ডে কাস্টম কনভার্সন প্রয়োগ করা। এর জন্য আপনি @AfterMapping অ্যানোটেশন ব্যবহার করতে পারেন।
উদাহরণ: কাস্টম লজিক প্রয়োগ
import org.mapstruct.AfterMapping;
import org.mapstruct.Mapper;
import org.mapstruct.MappingTarget;
@Mapper
public interface EmployeeMapper {
@Mapping(source = "name", target = "name")
@Mapping(source = "department", target = "department")
void updateEmployeeFromDTO(EmployeeDTO dto, @MappingTarget Employee employee);
@AfterMapping
default void setEmployeeAge(@MappingTarget Employee employee) {
if (employee.getAge() == 0) {
employee.setAge(30); // Default age if not provided
}
}
}
এখানে, @AfterMapping ব্যবহার করে আমরা Employee অবজেক্টের age ফিল্ডে ডিফল্ট মান 30 সেট করেছি যদি সেটি 0 হয়।
সারাংশ
MapStruct এর Update Method হল একটি শক্তিশালী টুল যা ডোমেইন অবজেক্টে শুধুমাত্র কিছু নির্দিষ্ট ফিল্ড আপডেট করতে সহায়তা করে, পুরো অবজেক্ট ম্যাপ করার প্রয়োজন পড়বে না। এটি পারফরম্যান্সের উন্নতি সাধন করে এবং কোড লেখার জটিলতা কমায়। @MappingTarget অ্যানোটেশন ব্যবহার করে আপনি লক্ষ্য অবজেক্টে আপডেট করতে পারেন এবং @AfterMapping দিয়ে কাস্টম লজিক প্রয়োগ করতে পারেন।
Read more