MapStruct হল একটি শক্তিশালী কোড জেনারেশন টুল যা Java Beans এর মধ্যে ডেটা ম্যানুয়াল ট্রান্সফরমেশনকে কম্পাইল টাইমে বাস্তবায়ন করে। @Mapping অ্যানোটেশন MapStruct এর অন্যতম প্রধান অ্যানোটেশন, যা ডেটা ম্যাপিং প্রক্রিয়ায় কীভাবে এবং কোথায় ট্রান্সফরমেশন ঘটবে তা নির্দেশ করে। এটি MapStruct Mapper Interface বা Abtract Method-এর মধ্যে ব্যবহার করা হয় এবং উৎস এবং লক্ষ্য ফিল্ডগুলির মধ্যে ম্যাপিং নির্ধারণ করতে সাহায্য করে।
এই টিউটোরিয়ালে, আমরা @Mapping অ্যানোটেশন ব্যবহারের কিছু উদাহরণ এবং এর কনফিগারেশন দেখব।
১. @Mapping অ্যানোটেশন কী?
@Mapping অ্যানোটেশন MapStruct এ ব্যবহৃত হয় ডেটা ট্রান্সফরমেশনের জন্য। এটি নির্দেশ করে যে একটি ফিল্ডের মান একটি উৎস (source) ক্লাস থেকে একটি লক্ষ্য (target) ক্লাসে কিভাবে কপি হবে। এই অ্যানোটেশনটি ফিল্ড নাম, কাস্টম কনভার্টার, বা মিথড ব্যবহার করে ম্যাপিং কনফিগার করতে সক্ষম।
@Mapping অ্যানোটেশন ব্যবহার করে আপনি নিম্নলিখিত কাজগুলো করতে পারেন:
- Source এবং Target ফিল্ড নাম মেলানো: যদি সোর্স এবং টার্গেট ফিল্ডের নাম ভিন্ন হয় তবে @Mapping ব্যবহার করা হয়।
- Custom Value Mapping: কাস্টম কনভার্টার ব্যবহার করে ফিল্ড মান কাস্টমাইজ করা যায়।
- Ignore Certain Fields: কোনো নির্দিষ্ট ফিল্ড ম্যাপিং থেকে বাদ দেয়া।
২. @Mapping অ্যানোটেশন এর সিঙ্কট্যাক্স
@Mapping অ্যানোটেশনটি সাধারণত তিনটি প্রধান প্যারামিটার সহ ব্যবহার করা হয়:
- source: উৎস ফিল্ডের নাম।
- target: লক্ষ্য ফিল্ডের নাম।
- ignore: যদি আপনি কোনো ফিল্ড ম্যাপ করতে না চান, তবে
trueসেট করুন।
উদাহরণ:
@Mapping(source = "firstName", target = "name")
@Mapping(source = "age", target = "years")
@Mapping(target = "address", ignore = true)
এখানে:
- source এবং target কাস্টম ম্যাপিং নির্দেশ করে।
- ignore = true নির্দেশ করে যে
addressফিল্ডটি ম্যাপ করা হবে না।
৩. @Mapping অ্যানোটেশন এর ব্যবহার উদাহরণ
ধরা যাক আমাদের দুটি ক্লাস রয়েছে, Person এবং PersonDTO, এবং আমরা Person থেকে PersonDTO তে ডেটা ম্যাপ করতে চাই।
- Person.java ক্লাস:
public class Person {
private String firstName;
private String lastName;
private int age;
// getters and setters
}
- PersonDTO.java ক্লাস:
public class PersonDTO {
private String name;
private String surname;
private int years;
// getters and setters
}
এখানে, Person ক্লাসের firstName ফিল্ডকে name ফিল্ডে এবং age ফিল্ডকে years ফিল্ডে ম্যাপ করতে হবে। কিন্তু lastName এবং surname ফিল্ডগুলোর মধ্যে মেলানো হবে না।
Mapper Interface:
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
@Mapper
public interface PersonMapper {
@Mapping(source = "firstName", target = "name")
@Mapping(source = "lastName", target = "surname")
@Mapping(source = "age", target = "years")
PersonDTO personToPersonDTO(Person person);
}
এখানে:
@Mapping(source = "firstName", target = "name"):PersonএরfirstNameফিল্ডকেPersonDTOএরnameফিল্ডে ম্যাপ করছে।@Mapping(source = "age", target = "years"):ageফিল্ডটিyearsফিল্ডে ম্যাপ করছে।@Mapping(source = "lastName", target = "surname"):lastNameফিল্ডটিsurnameফিল্ডে ম্যাপ করছে।
এখন, MapStruct স্বয়ংক্রিয়ভাবে একটি PersonMapperImpl ক্লাস তৈরি করবে, যা Person থেকে PersonDTO তে ডেটা ম্যাপ করবে।
৪. @Mapping এর Advanced ব্যবহার
৪.১ Custom Value Mapping
কখনো কখনো আপনি ফিল্ডের মান কাস্টম ট্রান্সফরমেশন করতে চাইবেন। এর জন্য @Mapping এর মাধ্যমে কাস্টম কনভার্টার ব্যবহার করা যেতে পারে।
@Mapping(source = "birthDate", target = "age", qualifiedByName = "ageFromBirthDate")
PersonDTO personToPersonDTO(Person person);
@Named("ageFromBirthDate")
default int convertToAge(LocalDate birthDate) {
return Period.between(birthDate, LocalDate.now()).getYears();
}
এখানে, convertToAge মেথডে কাস্টম কনভার্টার ব্যবহার করা হয়েছে যা birthDate থেকে age নির্ধারণ করবে।
৪.২ Ignoring Fields
MapStruct এ আপনি যদি কোনো ফিল্ড ম্যাপ করতে না চান তবে আপনি @Mapping(ignore = true) ব্যবহার করতে পারেন। উদাহরণস্বরূপ:
@Mapping(source = "firstName", target = "name")
@Mapping(source = "age", target = "years")
@Mapping(target = "address", ignore = true)
PersonDTO personToPersonDTO(Person person);
এখানে, address ফিল্ডটি ম্যাপিং থেকে বাদ দেওয়া হয়েছে এবং MapStruct এই ফিল্ডটি ট্রান্সফার করবে না।
৫. Nested Mapping
MapStruct অনেক সময় nested objects (যেখানে এক ক্লাসের মধ্যে অন্য ক্লাস থাকে) এর মধ্যে ডেটা ম্যাপ করতে ব্যবহৃত হয়। আপনি যখন nested mappings করতে চান, তখন @Mapping অ্যানোটেশন দিয়ে অন্তর্নিহিত ক্লাসের মধ্যে ডেটা ট্রান্সফার করতে পারেন।
উদাহরণ:
public class Person {
private String firstName;
private Address address;
// getters and setters
}
public class PersonDTO {
private String name;
private AddressDTO address;
// getters and setters
}
public class Address {
private String city;
private String country;
// getters and setters
}
public class AddressDTO {
private String city;
private String country;
// getters and setters
}
@Mapper
public interface PersonMapper {
@Mapping(source = "firstName", target = "name")
@Mapping(source = "address", target = "address")
PersonDTO personToPersonDTO(Person person);
@Mapping(source = "city", target = "city")
@Mapping(source = "country", target = "country")
AddressDTO addressToAddressDTO(Address address);
}
এখানে, Address এবং AddressDTO এর মধ্যে nested mapping তৈরি করা হয়েছে। PersonMapper ক্লাসে একটি মেথড personToPersonDTO ব্যবহার করে, যেখানে Address অবজেক্টটি AddressDTO তে ট্রান্সফার করা হচ্ছে।
সারাংশ
@Mapping অ্যানোটেশন MapStruct এর মূল অংশ যা ডেটা ট্রান্সফরমেশনে ব্যবহৃত হয়। এটি source এবং target ফিল্ডগুলির মধ্যে ম্যানুয়াল ম্যাপিং কনফিগার করতে সহায়তা করে। আপনি @Mapping এর মাধ্যমে:
- Field Mapping নির্ধারণ করতে পারেন।
- Custom Value Mapping করতে পারেন।
- Nested Mapping পরিচালনা করতে পারেন।
- কোনো ফিল্ডকে Ignore করতে পারেন।
MapStruct অ্যানোটেশন ব্যবহার করে আপনি আপনার প্রোজেক্টের ডেটা মাপিং প্রক্রিয়াকে খুব সহজ, দ্রুত এবং সঠিকভাবে করতে পারেন। এটি টাইপ সেফটি নিশ্চিত করে এবং runtime পারফরম্যান্সে কোনো নেতিবাচক প্রভাব ফেলে না, কারণ এটি compile-time কোড জেনারেশন ব্যবহার করে।
Read more