Custom Type Handlers তৈরি করা

iBATIS এর Advanced Features এবং Customization - আইবাটিস (iBATIS) - Java Technologies

342

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 ইন্টারফেস ইমপ্লেমেন্ট করতে হবে। এই ইন্টারফেসে ৪টি মেথড থাকে যা আপনি ইমপ্লিমেন্ট করবেন:

  1. setParameter: Java অবজেক্ট থেকে SQL প্যারামিটার সেট করতে ব্যবহৃত হয়।
  2. getResult: SQL থেকে Java অবজেক্টে ডেটা ম্যাপ করতে ব্যবহৃত হয়।
  3. getResult (আবারও): অন্য কোন ResultSet পদ্ধতিতে ডেটা রিটার্ন করতে ব্যবহৃত হয়।
  4. 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 রিটার্ন হবে এবং Java Boolean হিসেবে ম্যাপ হবে।

Custom Type Handlers ব্যবহার করে আপনি iBATIS (MyBatis)-এ ডেটাবেসে সংরক্ষিত ডেটা এবং Java অবজেক্টের মধ্যে কাস্টম টাইপ ম্যাপিং করতে পারেন। এই প্রক্রিয়ায়:

  • BaseTypeHandler ইন্টারফেস ইমপ্লিমেন্ট করে কাস্টম টাইপ হ্যান্ডলার তৈরি করা হয়।
  • setParameter() এবং getResult() মেথডগুলি ডেটা ট্রান্সফর্ম করতে ব্যবহৃত হয়।
  • mybatis-config.xml ফাইলে টাইপ হ্যান্ডলার রেজিস্টার করা হয়।

এই পদ্ধতি আপনার অ্যাপ্লিকেশনে কাস্টম ডেটা ট্রান্সফর্মেশন, যেমন BOOLEAN কে String বা Integer বা অন্য কোন কাস্টম টাইপে ম্যাপ করার ক্ষেত্রে খুবই কার্যকর।

Content added By
Promotion

Are you sure to start over?

Loading...