iBATIS (MyBatis) একটি শক্তিশালী ORM (Object-Relational Mapping) ফ্রেমওয়ার্ক, যা ডেটাবেসের ডেটা এবং Java অবজেক্টের মধ্যে ম্যাপিং করার জন্য Type Handlers ব্যবহার করে। কখনও কখনও ডেটাবেসে যে ধরনের ডেটা আছে তা Java এ নির্দিষ্টভাবে ম্যাপ করা সম্ভব না হতে পারে, যেমন ডেটাবেসে VARCHAR ফিল্ড যা Java Date অবজেক্টে ম্যাপ করা, বা Boolean ফিল্ড যা Integer হিসেবে চলে আসে। এই ধরনের কাস্টম ট্রান্সফরমেশন পরিচালনা করতে Custom Type Handlers ব্যবহৃত হয়।
এখানে আমরা MyBatis তে কাস্টম টাইপ হ্যান্ডলার তৈরি করার পুরো প্রক্রিয়া দেখাবো।
1. Type Handlers কী?
Type Handlers হল এমন কম্পোনেন্ট যা MyBatis-কে ডেটাবেসের ডেটা এবং Java অবজেক্টের মধ্যে ম্যাপিং করতে সহায়তা করে। সাধারণত, MyBatis অনেক ধরনের ডেটা টাইপ হ্যান্ডল করার জন্য বিল্ট-ইন টাইপ হ্যান্ডলার সরবরাহ করে (যেমন String, Integer, Date, ইত্যাদি), কিন্তু কখনও কখনও আপনাকে কাস্টম ডেটা টাইপের জন্য টাইপ হ্যান্ডলার তৈরি করতে হতে পারে।
2. Custom Type Handler তৈরি করার ধাপসমূহ
Step 1: Type Handler Interface ইমপ্লিমেন্ট করা
MyBatis-এ কাস্টম টাইপ হ্যান্ডলার তৈরি করতে আপনাকে org.apache.ibatis.type.TypeHandler ইন্টারফেস ইমপ্লেমেন্ট করতে হবে। এই ইন্টারফেসে ৪টি মেথড থাকে যা আপনি ইমপ্লিমেন্ট করবেন:
setParameter: Java অবজেক্ট থেকে SQL প্যারামিটার সেট করতে ব্যবহৃত হয়।getResult: SQL থেকে Java অবজেক্টে ডেটা ম্যাপ করতে ব্যবহৃত হয়।getResult(আবারও): অন্য কোনResultSetপদ্ধতিতে ডেটা রিটার্ন করতে ব্যবহৃত হয়।getResult(আবারও):CallableStatementথেকে ডেটা রিটার্ন করার জন্য ব্যবহৃত হয়।
Step 2: Custom Type Handler Example
ধরা যাক, আপনার ডেটাবেসে একটি BOOLEAN ফিল্ড রয়েছে, কিন্তু আপনি এটি Java-এ String হিসেবে পরিচালনা করতে চান (যেমন 'Y' অথবা 'N')। এই ধরনের কাস্টম টাইপ হ্যান্ডলার তৈরি করার জন্য নিম্নলিখিত কোডটি ব্যবহার করা যেতে পারে।
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.*;
public class BooleanToStringTypeHandler extends BaseTypeHandler<String> {
@Override
public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
if (parameter == null) {
ps.setNull(i, Types.VARCHAR);
} else {
// Convert Boolean to 'Y' or 'N'
ps.setString(i, parameter.equals("true") ? "Y" : "N");
}
}
@Override
public String getResult(ResultSet rs, String columnName) throws SQLException {
String value = rs.getString(columnName);
return "Y".equals(value) ? "true" : "false";
}
@Override
public String getResult(ResultSet rs, int columnIndex) throws SQLException {
String value = rs.getString(columnIndex);
return "Y".equals(value) ? "true" : "false";
}
@Override
public String getResult(CallableStatement cs, int columnIndex) throws SQLException {
String value = cs.getString(columnIndex);
return "Y".equals(value) ? "true" : "false";
}
}
Explanation:
setParameter: এটিPreparedStatementএ ডেটা সেট করে, যেখানেparameterপ্যারামিটারটিYঅথবাNহিসেবে সেট করা হবে।getResult(ResultSet): এটিResultSetথেকে ডেটা নিয়ে আসবে এবং যদি ডেটাYহয়, তাহলে এটিtrueরিটার্ন করবে, অন্যথায়false।getResult(CallableStatement): এটিCallableStatementথেকে একই কাজ করবে, অর্থাৎ ডেটাYবাNচেক করবে এবং তারপরেtrueঅথবাfalseরিটার্ন করবে।
Step 3: MyBatis Configuration
MyBatis-এ কাস্টম টাইপ হ্যান্ডলার ব্যবহার করার জন্য, আপনাকে mybatis-config.xml ফাইলে TypeHandler কনফিগার করতে হবে।
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- Register Custom Type Handler -->
<typeHandlers>
<typeHandler handler="com.example.typehandler.BooleanToStringTypeHandler"/>
</typeHandlers>
<!-- DataSource Configuration -->
<dataSource type="POOLED">
<property name="driver" value="org.h2.Driver"/>
<property name="url" value="jdbc:h2:mem:test;DB_CLOSE_DELAY=-1"/>
<property name="username" value="sa"/>
<property name="password" value=""/>
</dataSource>
<!-- Transaction Manager -->
<transactionManager type="JDBC"/>
<!-- Mapper Files -->
<sqlMap resource="com/example/mapper/EmployeeMapper.xml"/>
</configuration>
এখানে:
<typeHandlers>: আপনিBooleanToStringTypeHandlerকাস্টম টাইপ হ্যান্ডলারটি এখানে রেজিস্টার করছেন।- এই কনফিগারেশন দ্বারা MyBatis কাস্টম টাইপ হ্যান্ডলার ব্যবহার করবে।
Step 4: Mapper XML Configuration
এখন, EmployeeMapper.xml ফাইলে আপনি BooleanToStringTypeHandler টাইপ হ্যান্ডলার ব্যবহার করতে পারেন। ধরুন, আপনার Employee ক্লাসে isActive নামে একটি Boolean ফিল্ড রয়েছে, যেটি Y অথবা N হিসেবে স্টোর হবে।
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//iBATIS//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/sql-map-3.dtd">
<mapper namespace="com.example.mapper.EmployeeMapper">
<resultMap id="EmployeeResultMap" type="com.example.model.Employee">
<result property="isActive" column="is_active" typeHandler="com.example.typehandler.BooleanToStringTypeHandler"/>
</resultMap>
<select id="getEmployeeById" resultMap="EmployeeResultMap">
SELECT id, name, is_active FROM employee WHERE id = #{id}
</select>
</mapper>
Explanation:
<result>: এখানেisActiveপ্রপার্টির জন্য কাস্টম টাইপ হ্যান্ডলারBooleanToStringTypeHandlerব্যবহার করা হয়েছে।typeHandler: এটি MyBatis কে জানায় যেis_activeকলামের মান Y অথবা N হিসেবে হবে এবং আপনি সেটিBooleanপ্রপার্টিতে ম্যাপ করবেন।
Step 5: Testing the Custom Type Handler
এখন, আপনি JUnit বা Basic Java কোড দিয়ে কাস্টম টাইপ হ্যান্ডলার টেস্ট করতে পারেন।
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class TestApp {
public static void main(String[] args) {
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder()
.build(TestApp.class.getResourceAsStream("/sql-map-config.xml"));
try (SqlSession session = sessionFactory.openSession()) {
// Test retrieving employee with active status
Employee employee = session.selectOne("com.example.mapper.EmployeeMapper.getEmployeeById", 1);
System.out.println("Employee Name: " + employee.getName());
System.out.println("Employee Active Status: " + employee.getIsActive());
}
}
}
Explanation:
employee.getIsActive(): এটিBooleanToStringTypeHandlerব্যবহার করেYবাNরিটার্ন হবে এবং JavaBooleanহিসেবে ম্যাপ হবে।
Custom Type Handlers ব্যবহার করে আপনি iBATIS (MyBatis)-এ ডেটাবেসে সংরক্ষিত ডেটা এবং Java অবজেক্টের মধ্যে কাস্টম টাইপ ম্যাপিং করতে পারেন। এই প্রক্রিয়ায়:
BaseTypeHandlerইন্টারফেস ইমপ্লিমেন্ট করে কাস্টম টাইপ হ্যান্ডলার তৈরি করা হয়।setParameter()এবংgetResult()মেথডগুলি ডেটা ট্রান্সফর্ম করতে ব্যবহৃত হয়।mybatis-config.xmlফাইলে টাইপ হ্যান্ডলার রেজিস্টার করা হয়।
এই পদ্ধতি আপনার অ্যাপ্লিকেশনে কাস্টম ডেটা ট্রান্সফর্মেশন, যেমন BOOLEAN কে String বা Integer বা অন্য কোন কাস্টম টাইপে ম্যাপ করার ক্ষেত্রে খুবই কার্যকর।
Read more