Skill

iBATIS এর সাথে Stored Procedures

আইবাটিস (iBATIS) - Java Technologies

457

iBATIS (MyBatis) একটি শক্তিশালী ফ্রেমওয়ার্ক যা SQL কুয়েরি এবং Java objects এর মধ্যে সম্পর্ক স্থাপন করতে সহায়ক। একদিকে iBATIS আপনার SQL কুয়েরি কাস্টমাইজড এবং JavaBeans-এর সাথে ডেটাবেসের মধ্যে ম্যাপিং করতে দেয়, অন্যদিকে আপনি stored procedures-কে iBATIS-এর মাধ্যমে সহজেই কল করতে পারেন।

Stored Procedures হল ডেটাবেসের মধ্যে সংরক্ষিত SQL কুয়েরি ব্লক যা পুনরায় ব্যবহারযোগ্য, এবং এতে ডেটাবেস অপারেশন (যেমন: ইনসার্ট, আপডেট, ডিলিট, সিলেক্ট) করা যায়। iBATIS (MyBatis) স্টোরড প্রোসিজার কলের মাধ্যমে আপনি সেই কুয়েরিগুলিকে Java application থেকে কার্যকর করতে পারেন।


iBATIS এর সাথে Stored Procedures ব্যবহার করার পদ্ধতি

iBATIS-এর মাধ্যমে স্টোরড প্রোসিজার কল করার জন্য আপনাকে Mapper XML ফাইলের মধ্যে স্টোরড প্রোসিজারের SQL স্টেটমেন্ট এবং প্যারামিটারগুলি ডিফাইন করতে হবে। iBATIS স্টোরড প্রোসিজারগুলির সাথে যোগাযোগ করতে <select>, <insert>, <update>, এবং <delete> ট্যাগের মাধ্যমে কাজ করতে দেয়।


Step 1: Stored Procedure in the Database

প্রথমে আপনাকে ডেটাবেসে একটি Stored Procedure তৈরি করতে হবে। উদাহরণস্বরূপ, একটি স্টোরড প্রোসিজার তৈরি করি যা employee টেবিল থেকে কর্মচারী তথ্য সিলেক্ট করবে।

Example: Stored Procedure in MySQL

DELIMITER CREATEPROCEDUREGetEmployeeById(INempidINT)BEGINSELECTid,name,salaryFROMemployeesWHEREid=empid;END

CREATE PROCEDURE GetEmployeeById(IN emp_id INT)
BEGIN
    SELECT id, name, salary
    FROM employees
    WHERE id = emp_id;
END 

DELIMITER ;

এখানে, GetEmployeeById স্টোরড প্রোসিজারটি emp_id ইনপুট প্যারামিটার নেয় এবং employees টেবিল থেকে সেই আইডি সহ কর্মচারীর তথ্য রিটার্ন করে।


Step 2: iBATIS Mapper XML Configuration

এখন EmployeeMapper.xml ফাইলে এই স্টোরড প্রোসিজারটি কল করতে হবে।

Example: Mapper XML with Stored Procedure

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="com.example.mapper.EmployeeMapper">

    <!-- SQL Mapping for Stored Procedure -->
    <select id="getEmployeeById" statementType="CALLABLE" resultClass="com.example.model.Employee">
        {CALL GetEmployeeById(#{empId, mode=IN, jdbcType=INTEGER})}
    </select>

</sqlMap>

Explanation:

  • statementType="CALLABLE": এখানে statementType="CALLABLE" ব্যবহার করা হয়েছে যা স্টোরড প্রোসিজারের জন্য সঠিক JDBC কুয়েরি টাইপ নির্ধারণ করে।
  • {CALL GetEmployeeById(#{empId})}: স্টোরড প্রোসিজার GetEmployeeById কে কল করা হচ্ছে এবং empId প্যারামিটারটি স্টোরড প্রোসিজারের ইনপুট হিসেবে পাস করা হচ্ছে।
  • mode=IN: এটি ইনপুট প্যারামিটার হিসেবে empId নির্দেশ করে।

Step 3: Java Model Class (Employee.java)

iBATIS-এ স্টোরড প্রোসিজার থেকে ডেটা মডেল করার জন্য JavaBean ক্লাস তৈরি করতে হবে।

Example: Employee.java

package com.example.model;

public class Employee {
    private int id;
    private String name;
    private double salary;

    // Getters and Setters
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
}

Explanation:

  • Employee ক্লাসটি JavaBean হিসেবে কাজ করছে, যেখানে ডেটাবেস টেবিলের id, name, এবং salary প্রপার্টি সংরক্ষিত রয়েছে।

Step 4: Using iBATIS to Call the Stored Procedure

এখন, SqlSession ব্যবহার করে স্টোরড প্রোসিজার কল করতে হবে।

Example: Calling Stored Procedure in Java

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;

public class Application {

    public static void main(String[] args) throws Exception {
        // Load MyBatis configuration
        String resource = "sql-map-config.xml";
        InputStream inputStream = Application.class.getClassLoader().getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        // Open a session
        try (SqlSession session = sqlSessionFactory.openSession()) {
            // Call the stored procedure to get employee by ID
            Employee employee = session.selectOne("com.example.mapper.EmployeeMapper.getEmployeeById", 1);
            System.out.println("Employee Name: " + employee.getName());
        }
    }
}

Explanation:

  • session.selectOne(): এখানে selectOne মেথডটি ব্যবহার করা হয়েছে যা getEmployeeById স্টোরড প্রোসিজারের মাধ্যমে একক কর্মচারী তথ্য রিটার্ন করে।
  • "com.example.mapper.EmployeeMapper.getEmployeeById": এটি Mapper XML ফাইলের মধ্যে getEmployeeById নামক স্টোরড প্রোসিজার কল করে।

Step 5: Handling Output Parameters in Stored Procedures

iBATIS ব্যবহার করে আপনি output parameters ও হ্যান্ডল করতে পারেন। যেমন, যদি আপনার স্টোরড প্রোসিজার আউটপুট প্যারামিটার ফিরিয়ে দেয়, তবে আপনি সেগুলি #{} সিনট্যাক্সের মাধ্যমে ম্যানিপুলেট করতে পারবেন।

Example: Stored Procedure with Output Parameters in MySQL

DELIMITER CREATEPROCEDUREGetEmployeeSalary(INempidINT,OUTempsalaryDOUBLE)BEGINSELECTsalaryINTOempsalaryFROMemployeesWHEREid=empid;END

CREATE PROCEDURE GetEmployeeSalary(IN emp_id INT, OUT emp_salary DOUBLE)
BEGIN
    SELECT salary INTO emp_salary FROM employees WHERE id = emp_id;
END 

DELIMITER ;

এখানে, emp_salary একটি আউটপুট প্যারামিটার যা কর্মচারীর salary রিটার্ন করবে।

iBATIS Mapper for Output Parameters

<select id="getEmployeeSalary" statementType="CALLABLE" resultClass="java.lang.Double">
    {CALL GetEmployeeSalary(#{empId, mode=IN, jdbcType=INTEGER}, #{empSalary, mode=OUT, jdbcType=DOUBLE})}
</select>

Explanation:

  • #{empSalary, mode=OUT, jdbcType=DOUBLE}: আউটপুট প্যারামিটার empSalary কে OUT হিসেবে নির্ধারণ করা হয়েছে।
  • resultClass="java.lang.Double": আউটপুট প্যারামিটার হিসেবে Double টাইপ ব্যবহার করা হয়েছে, কারণ এটি salary রিটার্ন করবে।

iBATIS (MyBatis) স্টোরড প্রোসিজার ব্যবহারের মাধ্যমে SQL কুয়েরি এবং Java objects এর মধ্যে সম্পর্ক আরও শক্তিশালী এবং নমনীয় হয়ে ওঠে। iBATIS এর dynamic SQL ফিচারের সাথে স্টোরড প্রোসিজার কল করার ক্ষমতা আপনাকে ডেটাবেস অপারেশনগুলিকে আরও কাস্টমাইজড এবং দক্ষ করতে সাহায্য করে।

স্টোরড প্রোসিজারগুলি ব্যবহার করে আপনি বড় এবং জটিল ডেটাবেস অপারেশনগুলি সহজভাবে এবং পুনঃব্যবহারযোগ্যভাবে পরিচালনা করতে পারবেন। iBATIS এর মাধ্যমে আপনি input, output parameters, এবং result mapping এর মাধ্যমে স্টোরড প্রোসিজার কুয়েরি করতে পারেন এবং ডেটাবেস ইন্টারঅ্যাকশনকে আরও কার্যকরী ও নিরাপদ করতে পারবেন।

Content added By

iBATIS (বর্তমানে MyBatis নামে পরিচিত) একটি SQL Mapping Framework যা ডেটাবেসের সাথে Java objects এর সম্পর্ক তৈরি করে এবং SQL স্টেটমেন্টগুলির মাধ্যমে ডেটাবেস অপারেশন পরিচালনা করে। Stored Procedure হল একটি প্রি-কম্পাইলড SQL কোডের ব্লক যা ডেটাবেসের মধ্যে সংরক্ষিত থাকে এবং বিভিন্ন ডেটাবেস অপারেশন সম্পাদন করার জন্য ব্যবহার করা হয়। Stored Procedure সাধারণত INSERT, UPDATE, DELETE, SELECT ইত্যাদি SQL অপারেশন করতে পারে এবং এটি ডেটাবেসে প্রসেসিং করতে ব্যবহার হয়।

MyBatis (iBATIS) তে, আপনি Stored Procedures ব্যবহার করতে পারেন এবং SQL Mapping এর মাধ্যমে Java কোডের সাথে তাদের একত্রিত করতে পারেন। এখানে আলোচনা করা হবে Stored Procedure কী এবং MyBatis-এ এটি কিভাবে কাজ করে।


Stored Procedure: Definition

Stored Procedure হল একটি SQL কোডের গ্রুপ যা ডেটাবেসে সংরক্ষিত থাকে এবং ডেটাবেস অ্যাপ্লিকেশন থেকে বার বার ব্যবহার করা যায়। এটি একটি প্রি-কংফিগারড SQL অপারেশন যা ডেটাবেস সার্ভারে রান করা হয়, ফলে সার্ভারের মাধ্যমে reusable, performant, এবং modular SQL কোড তৈরি করা যায়।

Stored Procedure এর মূল সুবিধা:

  1. Code Reusability: একবার কোড লিখে সেটি বার বার ব্যবহার করা যায়।
  2. Performance: Precompiled SQL কোড ডেটাবেসে রান হয়, যা অনেক দ্রুত হতে পারে।
  3. Security: SQL কোড ডেটাবেস সার্ভারে থাকে, ফলে ক্লায়েন্ট অ্যাপ্লিকেশনটি ডেটাবেস কোডের সাথে সরাসরি ইন্টারঅ্যাক্ট করে না, যা সিকিউরিটি বাড়ায়।

Stored Procedure কিভাবে কাজ করে MyBatis (iBATIS) এ

MyBatis-এ Stored Procedures ব্যবহার করতে হলে, আপনাকে XML Mapper ফাইল এবং Mapper Interface তৈরি করতে হবে, যেখানে আপনি Stored Procedure এর জন্য SQL কোড এবং প্যারামিটার পাস করতে পারবেন। MyBatis SQL Mapping এর মাধ্যমে আপনি stored procedures চালাতে পারেন এবং সেই অনুযায়ী রেজাল্ট ম্যাপ করতে পারেন।


Step 1: Stored Procedure in MySQL Example

ধরা যাক, আমাদের একটি Employee টেবিল আছে এবং একটি stored procedure রয়েছে যেটি একটি কর্মচারীর তথ্য আপডেট করতে ব্যবহৃত হবে।

Stored Procedure Definition (MySQL):

DELIMITER CREATEPROCEDUREupdateemployeesalary(INempidINT,INnewsalaryDECIMAL(10,2))BEGINUPDATEEmployeeSETsalary=newsalaryWHEREid=empid;END

CREATE PROCEDURE update_employee_salary(
    IN emp_id INT,
    IN new_salary DECIMAL(10,2)
)
BEGIN
    UPDATE Employee
    SET salary = new_salary
    WHERE id = emp_id;
END

DELIMITER ;

এই stored procedure টি emp_id এবং new_salary ইনপুট প্যারামিটার হিসাবে গ্রহণ করে এবং উল্লিখিত কর্মচারীর salary আপডেট করে।


Step 2: MyBatis Configuration for Stored Procedure

mybatis-config.xml Example:

MyBatis কনফিগারেশন ফাইলের মধ্যে ডেটাবেস সংযোগ এবং mapper ফাইলের অবস্থান নির্ধারণ করা হয়।

<?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>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <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>
        </environment>
    </environments>

    <mappers>
        <mapper resource="com/example/mapper/EmployeeMapper.xml"/>
    </mappers>

</configuration>

Explanation:

  • environments: ডেটাবেস সংযোগ কনফিগারেশন এবং transactionManager কনফিগার করা হয়েছে।
  • mappers: এখানে EmployeeMapper.xml ফাইলের অবস্থান নির্ধারণ করা হয়েছে, যেখানে SQL স্টেটমেন্ট এবং stored procedure কনফিগারেশন করা হবে।

Step 3: Mapper XML for Stored Procedure

MyBatis XML Mapper ফাইলে আপনি Stored Procedure কল এবং প্যারামিটার পাস করতে পারেন।

EmployeeMapper.xml Example:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.EmployeeMapper">

    <!-- Stored Procedure to Update Employee Salary -->
    <update id="updateEmployeeSalary">
        { CALL update_employee_salary(#{emp_id, mode=IN}, #{new_salary, mode=IN}) }
    </update>

</mapper>

Explanation:

  • : id="updateEmployeeSalary" স্টোরড প্রোসিডিউর কল করার জন্য ব্যবহার করা হয়েছে। এটি CALL SQL স্টেটমেন্ট ব্যবহার করে, যা MySQL তে স্টোরড প্রোসিডিউর চালানোর জন্য ব্যবহৃত হয়।
  • #{emp_id, mode=IN}: emp_id এবং new_salary ইনপুট প্যারামিটার হিসেবে স্টোরড প্রোসিডিউরে পাস করা হয়। mode=IN মানে, এটি একটি ইনপুট প্যারামিটার।

Step 4: Mapper Interface

MyBatis এ Mapper Interface ব্যবহার করে আপনি স্টোরড প্রোসিডিউর চালাতে পারেন এবং SQL ফলাফল অর্জন করতে পারেন।

EmployeeMapper Interface:

package com.example.mapper;

import org.apache.ibatis.annotations.Param;

public interface EmployeeMapper {
    // Call Stored Procedure to Update Employee Salary
    void updateEmployeeSalary(@Param("emp_id") int empId, @Param("new_salary") double newSalary);
}

Explanation:

  • @Param Annotation: @Param("emp_id") এবং @Param("new_salary") এর মাধ্যমে প্যারামিটার নাম নির্ধারণ করা হয়। এই অ্যানোটেশন ব্যবহার করা হয় যাতে XML Mapper ফাইলে প্যারামিটার মান পাস করা যায়।

Step 5: Main Code to Call Stored Procedure

এখন, আপনি Stored Procedure কল করতে এবং EmployeeMapper ইন্টারফেস ব্যবহার করতে পারবেন।

Main.java:

package com.example;

import com.example.mapper.EmployeeMapper;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;

public class Main {
    public static void main(String[] args) {
        // MyBatis configuration and session factory setup
        String resource = "mybatis-config.xml";
        InputStream inputStream = Main.class.getClassLoader().getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        // Open session
        try (SqlSession session = sqlSessionFactory.openSession()) {
            EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);
            
            // Call the stored procedure to update employee salary
            employeeMapper.updateEmployeeSalary(1, 75000.0);  // Example: Update salary of employee with ID = 1

            session.commit();  // Commit the transaction
        }
    }
}

Explanation:

  • updateEmployeeSalary method: এটি EmployeeMapper ইন্টারফেসের মাধ্যমে স্টোরড প্রোসিডিউর কল করে, এবং কর্মচারীর salary আপডেট করে।
  • session.commit(): SQL অপারেশন সম্পন্ন হওয়ার পর ট্রানজেকশন কমিট করা হয়।

Stored Procedure in MyBatis: Best Practices

  1. Exception Handling:
    • স্টোরড প্রোসিডিউর কল করার সময় যে কোনো ত্রুটি ঘটলে তা হ্যান্ডেল করতে হবে। MyBatis তে try-catch ব্লক ব্যবহার করে exception হ্যান্ডলিং করা উচিত।
  2. Proper Transaction Management:
    • স্টোরড প্রোসিডিউর সাধারণত একাধিক ডেটাবেস অপারেশন সম্পন্ন করে, তাই transaction management খুবই গুরুত্বপূর্ণ। MyBatis-এ ট্রানজেকশন ম্যানেজমেন্ট কনফিগারেশন এবং commit/rollback ব্যবহারে মনোযোগ দিন।
  3. Optimize Stored Procedures:
    • স্টোরড প্রোসিডিউরগুলি ডেটাবেস সার্ভারে একাধিক অপারেশন একসাথে সম্পাদন করার জন্য ব্যবহার করা হয়। সুতরাং, স্টোরড প্রোসিডিউরগুলি সঠিকভাবে অপটিমাইজ করা উচিত যাতে পারফরম্যান্স ইস্যু না হয়।
  4. Use of Parameterized Queries:
    • স্টোরড প্রোসিডিউরগুলিতে ইনপুট প্যারামিটারগুলি সঠিকভাবে ব্যবহৃত হলে SQL ইনজেকশন থেকে রক্ষা পাওয়া যায়। MyBatis এ parameterized queries ব্যবহার করলে এটি সুরক্ষিত থাকে।

MyBatis (iBATIS) তে Stored Procedures ব্যবহার একটি শক্তিশালী পদ্ধতি যা ডেটাবেস অপারেশনগুলিকে দ্রুত এবং কার্যকরীভাবে সম্পন্ন করতে সাহায্য করে। MyBatis এর মাধ্যমে, আপনি SQL স্টেটমেন্টগুলি তৈরি করতে পারেন এবং XML Mapper এবং Mapper Interface ব্যবহার করে stored procedure কল করতে পারেন। এর মাধ্যমে আপনি modular, performant, এবং secure ডেটাবেস অপারেশন সম্পাদন করতে পারেন।

Content added By

iBATIS (বর্তমানে MyBatis) একটি ORM ফ্রেমওয়ার্ক যা ডেটাবেসের সাথে SQL কুয়েরি এবং স্টোরড প্রোসিজারগুলি চালানোর জন্য ব্যবহৃত হয়। স্টোরড প্রোসিজার (Stored Procedure) হল ডেটাবেসে সংরক্ষিত SQL কোডের একটি সেট যা নির্দিষ্ট কাজ সম্পন্ন করতে ব্যবহৃত হয়। iBATIS বা MyBatis এর মাধ্যমে স্টোরড প্রোসিজার কল করার পদ্ধতি সহজ এবং কার্যকর।

MyBatis-এ স্টোরড প্রোসিজার কল করতে, আপনাকে SQL মেপিং ফাইলে call স্টেটমেন্ট ব্যবহার করতে হবে এবং SqlSession বা SqlMapper এর মাধ্যমে জাভা কোড থেকে ওই প্রোসিজার কল করতে হবে।


Step 1: Stored Procedure তৈরি করা

প্রথমে, একটি সাধারণ স্টোরড প্রোসিজার তৈরি করা যাক। ধরুন আমাদের একটি Employee টেবিল আছে, এবং আমরা একটি স্টোরড প্রোসিজার তৈরি করব যা একটি কর্মচারীকে ইনসার্ট করবে এবং ইনসার্ট হওয়া কর্মচারীর আইডি রিটার্ন করবে।

Example Stored Procedure in MySQL:

DELIMITER CREATEPROCEDUREinsertEmployee(INemployeeNameVARCHAR(100),INemployeeDeptVARCHAR(50),OUTemployeeIdINT)BEGININSERTINTOemployee(name,department)VALUES(employeeName,employeeDept);SETemployeeId=LASTINSERTID();--GetthelastinsertedIDEND

CREATE PROCEDURE insertEmployee(
    IN employeeName VARCHAR(100),
    IN employeeDept VARCHAR(50),
    OUT employeeId INT
)
BEGIN
    INSERT INTO employee (name, department)
    VALUES (employeeName, employeeDept);
    
    SET employeeId = LAST_INSERT_ID();  -- Get the last inserted ID
END 

DELIMITER ;

এটি একটি স্টোরড প্রোসিজার যা কর্মচারী নাম এবং বিভাগ ইনপুট হিসেবে নেয় এবং নতুন কর্মচারী তৈরি করে এবং তার ID আউটপুট হিসেবে রিটার্ন করে।


Step 2: MyBatis Configuration (sql-map-config.xml)

আমাদের sql-map-config.xml কনফিগারেশন ফাইল সেটআপ করতে হবে, যাতে ডেটাবেস সংযোগ এবং স্টোরড প্রোসিজার ব্যবহার করা যায়।

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS//DTD SQL Map Config 3.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-3.dtd">
<sqlMapConfig>
    <!-- DataSource Configuration -->
    <dataSource type="POOLED">
        <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/>
        <property name="username" value="root"/>
        <property name="password" value="password"/>
    </dataSource>

    <!-- Transaction Manager Configuration -->
    <transactionManager type="JDBC"/>

    <!-- Mapper Files -->
    <sqlMap resource="com/example/mapper/EmployeeMapper.xml"/>
</sqlMapConfig>

এখানে:

  • dataSource: MySQL ডেটাবেসের জন্য ড্রাইভার, URL, ইউজারনেম এবং পাসওয়ার্ড কনফিগার করা হয়েছে।
  • transactionManager: JDBC ভিত্তিক ট্রানজেকশন ম্যানেজার ব্যবহার করা হয়েছে।

Step 3: MyBatis Mapper XML (EmployeeMapper.xml)

এখন, আমাদের EmployeeMapper.xml ফাইলে স্টোরড প্রোসিজার কল করার কুয়েরি সংজ্ঞায়িত করতে হবে।

EmployeeMapper.xml Example (for Stored Procedure Call):

<?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">

    <!-- Call the Stored Procedure to insert an employee -->
    <select id="insertEmployee" statementType="CALLABLE" parameterClass="map" resultClass="int">
        {CALL insertEmployee(
            #{employeeName, mode=IN, jdbcType=VARCHAR},
            #{employeeDept, mode=IN, jdbcType=VARCHAR},
            #{employeeId, mode=OUT, jdbcType=INTEGER}
        )}
    </select>

</mapper>

Explanation:

  • statementType="CALLABLE": এটি MyBatis কে জানায় যে এই কুয়েরি একটি স্টোরড প্রোসিজার কল করছে।
  • parameterClass="map": Map প্যারামিটার হিসেবে পাঠানো হবে যাতে স্টোরড প্রোসিজার ইনপুট প্যারামিটার এবং আউটপুট প্যারামিটার মান পাঠানো যায়।
  • #{parameterName, mode=IN/OUT, jdbcType=XXX}: এখানে IN, OUT, এবং jdbcType ব্যবহার করে MyBatis কে স্টোরড প্রোসিজারের প্যারামিটার সম্পর্কে নির্দেশ দেওয়া হয়।

Step 4: Java Code to Call Stored Procedure

এখন, আমরা Java কোডে MyBatis ব্যবহার করে স্টোরড প্রোসিজার কল করব।

EmployeeApp.java Example (Calling the Stored Procedure):

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.util.HashMap;
import java.util.Map;

public class EmployeeApp {

    public static void main(String[] args) {
        // Step 1: Build SqlSessionFactory from the configuration file
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder()
                .build(EmployeeApp.class.getResourceAsStream("/sql-map-config.xml"));

        // Step 2: Open SqlSession
        try (SqlSession session = sessionFactory.openSession()) {

            // Step 3: Prepare parameters for the stored procedure
            Map<String, Object> parameters = new HashMap<>();
            parameters.put("employeeName", "John Doe");
            parameters.put("employeeDept", "IT");

            // Step 4: Execute the stored procedure to insert employee and get employeeId
            session.selectOne("com.example.mapper.EmployeeMapper.insertEmployee", parameters);

            // Step 5: Retrieve the employeeId from the parameters map
            Integer employeeId = (Integer) parameters.get("employeeId");
            System.out.println("Inserted Employee ID: " + employeeId);

            // Commit transaction
            session.commit();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Explanation:

  • parameters.put("employeeName", "John Doe"): প্যারামিটার হিসেবে কর্মচারীর নাম এবং বিভাগ সেট করা হচ্ছে।
  • session.selectOne("com.example.mapper.EmployeeMapper.insertEmployee", parameters): এখানে insertEmployee মেথড কল করা হচ্ছে যা স্টোরড প্রোসিজার কল করবে। প্যারামিটার হিসেবে parameters ম্যাপ ব্যবহার করা হচ্ছে।
  • parameters.get("employeeId"): স্টোরড প্রোসিজার থেকে রিটার্ন হওয়া employeeId আউটপুট প্যারামিটার থেকে নেওয়া হচ্ছে।

Step 5: Gradle বা Maven দিয়ে প্রোজেক্ট বিল্ড এবং রান করা

প্রোজেক্টটি বিল্ড এবং রান করার জন্য, আপনি Gradle বা Maven ব্যবহার করতে পারেন।

For Gradle:

# Build the project
gradle build

# Run the project
gradle run

For Maven:

# Build the project
mvn clean install

# Run the project
mvn exec:java

iBATIS (MyBatis) এর মাধ্যমে Stored Procedures কল করা একটি সহজ প্রক্রিয়া যা ডেটাবেস অপারেশনকে আরও কার্যকরী এবং দক্ষ করে তোলে। আপনি CALLABLE স্টেটমেন্ট ব্যবহার করে SQL কুয়েরি এবং স্টোরড প্রোসিজার প্যারামিটার ম্যানেজ করতে পারেন। এখানে কিছু গুরুত্বপূর্ণ পদ্ধতি:

  1. statementType="CALLABLE": MyBatis-কে জানায় যে এটি একটি স্টোরড প্রোসিজার কল হচ্ছে।
  2. Map প্যারামিটার: ইনপুট এবং আউটপুট প্যারামিটারগুলিকে একটি Map এ পাঠানো হয়।

এটি আপনাকে iBATIS বা MyBatis ব্যবহার করে স্টোরড প্রোসিজার কল করার জন্য একটি শক্তিশালী এবং নমনীয় পদ্ধতি প্রদান করে।

Content added By

iBATIS (বর্তমানে MyBatis) একটি powerful framework যা SQL ভিত্তিক কাস্টম ডেটাবেস অপারেশন সম্পাদন করতে সাহায্য করে। Stored Procedures (এসকিউএল সার্ভারের মধ্যে সঞ্চিত প্রোগ্রাম বা ফাংশন) এর ব্যবস্থাপনা MyBatis এর মাধ্যমে খুব সহজ এবং কার্যকরীভাবে করা যায়। MyBatis-এ input parameters এবং output parameters এর সাথে কাজ করার জন্য , , , ট্যাগ ব্যবহার করা হয়।

এখানে Stored Procedure এর জন্য ইনপুট (input) এবং আউটপুট (output) প্যারামিটার ব্যবস্থাপনা করার একটি বিশদ উদাহরণ দেওয়া হল।


1. Stored Procedure Configuration in iBATIS (MyBatis)

MyBatis-এ স্টোরড প্রোসিডিউর ব্যবহারের জন্য আমরা CallableStatement ব্যবহার করতে পারি। এটা স্টোরড প্রোসিডিউরের সাথে সম্পর্কিত কাস্টম SQL কুয়েরি চালাতে সহায়তা করে এবং ইনপুট ও আউটপুট প্যারামিটারগুলোর জন্য ম্যানেজমেন্ট সহজ করে।

Step 1: Create Stored Procedure in Database

প্রথমে, একটি স্টোরড প্রোসিডিউর তৈরি করতে হবে যা ইনপুট এবং আউটপুট প্যারামিটার গ্রহণ করবে। নিচে একটি উদাহরণ দেওয়া হল:

DELIMITER CREATEPROCEDUREGetEmployeeInfo(INempidINT,OUTempnameVARCHAR(255),OUTempemailVARCHAR(255))BEGINSELECTname,emailINTOempname,empemailFROMemployeesWHEREid=empid;END

CREATE PROCEDURE GetEmployeeInfo(
    IN emp_id INT, 
    OUT emp_name VARCHAR(255), 
    OUT emp_email VARCHAR(255)
)
BEGIN
    SELECT name, email 
    INTO emp_name, emp_email 
    FROM employees 
    WHERE id = emp_id;
END

DELIMITER ;

Explanation:

  • IN emp_id: এটি ইনপুট প্যারামিটার যা employee id প্রদান করে।
  • OUT emp_name, emp_email: এটি আউটপুট প্যারামিটার যা name এবং email আউটপুট করে।

2. MyBatis Configuration

MyBatis-এ Stored Procedure-এ ইনপুট এবং আউটপুট প্যারামিটার ব্যবহার করার জন্য Mapper XML এবং Mapper Interface তৈরি করতে হবে।

Step 2: Configure MyBatis Mapper XML for Stored Procedure

<mapper namespace="com.yourpackage.mapper.EmployeeMapper">

    <!-- Call stored procedure with input and output parameters -->
    <select id="getEmployeeInfo" statementType="CALLABLE" resultMap="employeeResultMap">
        {CALL GetEmployeeInfo(
            #{empId, mode=IN, jdbcType=INTEGER},
            #{empName, mode=OUT, jdbcType=VARCHAR},
            #{empEmail, mode=OUT, jdbcType=VARCHAR}
        )}
    </select>

</mapper>

Explanation:

  • statementType="CALLABLE": এটি নির্দেশ করে যে কুয়েরি একটি স্টোরড প্রোসিডিউর কল করবে।
  • #{empId, mode=IN, jdbcType=INTEGER}: এখানে empId ইনপুট প্যারামিটার হিসেবে ব্যবহার করা হচ্ছে।
  • #{empName, mode=OUT, jdbcType=VARCHAR}: empName আউটপুট প্যারামিটার হিসেবে ব্যবহার করা হচ্ছে।
  • #{empEmail, mode=OUT, jdbcType=VARCHAR}: empEmail আউটপুট প্যারামিটার হিসেবে ব্যবহৃত হবে।

Step 3: Create Mapper Interface

এখন, একটি Mapper Interface তৈরি করতে হবে যেখানে স্টোরড প্রোসিডিউরের জন্য মেথড থাকবে।

public interface EmployeeMapper {

    void getEmployeeInfo(@Param("empId") int empId, 
                         @Param("empName") String empName, 
                         @Param("empEmail") String empEmail);
}

Explanation:

  • @Param: @Param অ্যানোটেশনটি MyBatis-কে জানায় যে কোন প্যারামিটারটি ইনপুট এবং আউটপুট হিসেবে পাঠানো হচ্ছে।

3. Using the Stored Procedure in Java

Java কোডে SqlSession ব্যবহার করে আপনি getEmployeeInfo মেথডটি কল করতে পারেন।

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.exceptions.PersistenceException;

import java.io.Reader;

public class EmployeeApp {

    public static void main(String[] args) {
        SqlSessionFactory sqlSessionFactory = null;
        SqlSession session = null;

        try {
            // Step 1: Initialize SqlSessionFactory
            Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

            // Step 2: Open a new session
            session = sqlSessionFactory.openSession();

            // Step 3: Get Mapper
            EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);

            // Step 4: Prepare input and output variables
            int empId = 1;
            String empName = null;
            String empEmail = null;

            // Step 5: Call stored procedure
            employeeMapper.getEmployeeInfo(empId, empName, empEmail);

            // Step 6: Output result
            System.out.println("Employee Name: " + empName);
            System.out.println("Employee Email: " + empEmail);

            // Step 7: Commit and close session
            session.commit();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (session != null) {
                session.close();
            }
        }
    }
}

Explanation:

  • session.getMapper(EmployeeMapper.class): এটি MyBatis Mapper ইন্টারফেস ব্যবহার করে স্টোরড প্রোসিডিউর মেথড কল করে।
  • employeeMapper.getEmployeeInfo(empId, empName, empEmail): এখানে স্টোরড প্রোসিডিউরটি কল করা হচ্ছে এবং প্যারামিটারগুলি ইনপুট ও আউটপুট হিসাবে সেট করা হচ্ছে।
  • empName এবং empEmail: এই আউটপুট প্যারামিটারগুলি স্টোরড প্রোসিডিউর থেকে রিটার্ন হবে।

4. Handling Output Parameters

MyBatis-এ আউটপুট প্যারামিটারগুলিকে সঠিকভাবে হ্যান্ডেল করার জন্য @Param অ্যানোটেশন এবং resultMap ব্যবহার করা হয়।

Example: Handling Output Parameters Using ResultMap

<resultMap id="employeeResultMap" type="Employee">
    <result property="name" column="emp_name" />
    <result property="email" column="emp_email" />
</resultMap>
  • <resultMap>: এই মাপিংটি আউটপুট প্যারামিটারগুলির মানকে Employee অবজেক্টের প্রপার্টির সাথে ম্যাপ করে।

iBATIS (MyBatis) এ স্টোরড প্রোসিডিউরের input এবং output প্যারামিটার ব্যবস্থাপনা খুবই শক্তিশালী এবং নমনীয়। SqlSession এর মাধ্যমে CallableStatement ব্যবহার করে MyBatis-এ স্টোরড প্রোসিডিউর কল করা যায় এবং IN, OUT প্যারামিটারগুলি সহজেই হ্যান্ডল করা যায়।

  • Input Parameters: স্টোরড প্রোসিডিউরের ইনপুট প্যারামিটার গুলি #{paramName, mode=IN} এভাবে ব্যবহার করা হয়।
  • Output Parameters: আউটপুট প্যারামিটারগুলি #{paramName, mode=OUT} আকারে ব্যবহার করা হয়।
  • Mapper XML and Java: Mapper XML ফাইল এবং Mapper Interface এর মাধ্যমে আপনি SQL কুয়েরি এবং প্রোসিডিউর ম্যানেজ করতে পারবেন।
Content added By

iBATIS (MyBatis) হল একটি SQL ম্যাপিং ফ্রেমওয়ার্ক যা Java objects এবং SQL কুয়েরির মধ্যে সম্পর্ক স্থাপন করে। iBATIS একটি ডেটাবেসে সংরক্ষিত Stored Procedures পরিচালনা করতে সহায়ক, এবং এটি Java কোড থেকে SQL Stored Procedures কুয়েরি করতে এবং তাদের আউটপুটে ম্যাপ করতে ব্যবহৃত হতে পারে।

এখানে iBATIS (MyBatis)-এ Complex Stored Procedures হ্যান্ডল করার পদ্ধতি এবং কৌশল আলোচনা করা হবে।


1. Stored Procedures Overview

Stored Procedures হল ডেটাবেসে সংরক্ষিত SQL কোডের সেট যা নির্দিষ্ট কাজ সম্পাদন করতে ব্যবহৃত হয়। এগুলো প্রথামানিত SQL কুয়েরি ও অপারেশনগুলির জন্য আরও দক্ষ এবং পুনঃব্যবহারযোগ্য সমাধান প্রদান করে। MyBatis (iBATIS)-এ, আপনি Stored Procedures কে ডেটাবেসের মধ্যে কার্যকরভাবে কল করতে পারেন এবং তাদের আউটপুট Java objects-এ ম্যাপ করতে পারেন।


2. Calling Stored Procedures from iBATIS (MyBatis)

iBATIS (MyBatis)-এ Stored Procedures কল করার জন্য SQL ম্যাপিং ফাইলে <select>, <insert>, <update>, বা <delete> ট্যাগ ব্যবহার করা যেতে পারে, যা স্টোরড প্রোসিডিউরকে কল করার জন্য #{} প্যারামিটারগুলি ব্যবহার করে।

a) Stored Procedure Calling Using <select> Tag

ধরা যাক, আপনার ডেটাবেসে একটি স্টোরড প্রোসিডিউর রয়েছে যা কিছু students এর তথ্য প্রদান করে। আপনি iBATIS-এ এই প্রোসিডিউরটি কল করতে পারেন।

Example: Stored Procedure Call Using <select> in MyBatis
<select id="getStudentByCourse" statementType="CALLABLE" resultType="com.example.Student">
    {CALL GetStudentByCourse(#{course, mode=IN, jdbcType=VARCHAR})}
</select>

Explanation:

  • statementType="CALLABLE": এটি MyBatis-এ স্টোরড প্রোসিডিউর কল করার জন্য ব্যবহৃত হয়।
  • #{course, mode=IN, jdbcType=VARCHAR}: এটি স্টোরড প্রোসিডিউরের প্যারামিটার। IN মোডটি ইঙ্গিত দেয় যে এটি ইনপুট প্যারামিটার হিসেবে ব্যবহৃত হবে এবং jdbcType=VARCHAR ইঙ্গিত দেয় যে প্যারামিটারটি একটি VARCHAR টাইপ।
  • resultType="com.example.Student": এটি স্টোরড প্রোসিডিউরের আউটপুট Java object-এ ম্যাপ করতে ব্যবহৃত হয়।

3. Handling Output Parameters in Stored Procedures

Stored Procedures সাধারণত আউটপুট প্যারামিটার ফিরিয়ে দেয়, যা INOUT প্যারামিটার হতে পারে। iBATIS (MyBatis)-এ আউটপুট প্যারামিটার হ্যান্ডল করার জন্য, আপনি #{} সিনট্যাক্স ব্যবহার করতে পারেন, এবং আউটপুট প্যারামিটারটি যথাযথভাবে ম্যাপ করতে পারেন।

Example: Stored Procedure with Output Parameter

<select id="getStudentCountByCourse" statementType="CALLABLE" resultType="int">
    {CALL GetStudentCountByCourse(#{course, mode=IN, jdbcType=VARCHAR}, #{studentCount, mode=OUT, jdbcType=INTEGER})}
</select>

Explanation:

  • #{studentCount, mode=OUT, jdbcType=INTEGER}: এটি একটি OUT প্যারামিটার যা স্টোরড প্রোসিডিউর থেকে রিটার্ন হয় এবং jdbcType=INTEGER ব্যবহার করা হয় কারণ আউটপুটটি একটি সংখ্যা।

4. Calling Stored Procedures with Multiple Result Sets

บางครั้ง একটি স্টোরড প্রোসিডিউর একাধিক ফলাফল প্রদান করতে পারে। iBATIS (MyBatis)-এ একাধিক ফলাফল সেটের জন্য, আপনি <resultMap> ব্যবহার করতে পারেন, যা একাধিক রেজাল্ট সেট ম্যাপিং করে।

Example: Stored Procedure with Multiple Result Sets

<select id="getStudentAndCourseDetails" statementType="CALLABLE" resultMap="studentCourseMap">
    {CALL GetStudentAndCourseDetails(#{course, mode=IN, jdbcType=VARCHAR})}
</select>

<resultMap id="studentCourseMap" type="com.example.Student">
    <id property="id" column="student_id"/>
    <result property="name" column="student_name"/>
    <result property="course" column="course_name"/>
</resultMap>

Explanation:

  • <resultMap>: এটি একাধিক কলামের মানকে Java objects এর প্রপার্টিতে ম্যাপ করতে ব্যবহৃত হয়।
  • statementType="CALLABLE": এটি ইঙ্গিত দেয় যে SQL কুয়েরি একটি স্টোরড প্রোসিডিউর।

5. Handling Complex Stored Procedures with Multiple Parameters

যখন স্টোরড প্রোসিডিউরে একাধিক ইনপুট প্যারামিটার এবং আউটপুট প্যারামিটার থাকে, তখন আপনি <select>, <insert>, <update>, বা <delete> ট্যাগের মাধ্যমে এই প্যারামিটারগুলি পাস করতে পারেন।

Example: Stored Procedure with Multiple Parameters

<select id="getStudentByNameAndCourse" statementType="CALLABLE" resultType="com.example.Student">
    {CALL GetStudentByNameAndCourse(#{name, mode=IN, jdbcType=VARCHAR}, #{course, mode=IN, jdbcType=VARCHAR})}
</select>

Explanation:

  • Multiple Parameters: এখানে name এবং course দুটি ইনপুট প্যারামিটার হিসেবে ব্যবহৃত হচ্ছে, যা স্টোরড প্রোসিডিউরকে পাস করা হবে।

6. Using MyBatis with Stored Procedure in Java Code

এখন, আপনি MyBatis থেকে স্টোরড প্রোসিডিউর কল করার জন্য Java কোড ব্যবহার করতে পারেন। MyBatis-এ SQL ম্যাপিং ফাইলের মাধ্যমে আপনি স্টোরড প্রোসিডিউর কল করবেন, কিন্তু আপনি SqlSession এবং Mapper Interface ব্যবহার করে স্টোরড প্রোসিডিউরটি কল করবেন।

Example: Calling Stored Procedure from Java Code

import org.apache.ibatis.session.SqlSession;

public class StudentDAO {

    public int getStudentCountByCourse(String course) {
        try (SqlSession session = MyBatisUtil.getSession()) {
            // Get the Mapper interface
            StudentMapper mapper = session.getMapper(StudentMapper.class);
            // Call the stored procedure
            return mapper.getStudentCountByCourse(course);
        }
    }
}

Explanation:

  • session.getMapper(StudentMapper.class): এটি StudentMapper ইন্টারফেসের ইনস্ট্যান্স রিটার্ন করে।
  • mapper.getStudentCountByCourse(course): এটি স্টোরড প্রোসিডিউরকে কল করে এবং আউটপুট প্যারামিটার (যেমন studentCount) ফিরিয়ে আনে।

7. Handling Transaction with Stored Procedures

MyBatis-এ স্টোরড প্রোসিডিউরের সাথে transaction management হ্যান্ডল করার জন্য, আপনি SqlSession এবং Spring's @Transactional ব্যবহার করতে পারেন। ট্রানজেকশন ম্যানেজমেন্টের মাধ্যমে আপনি নিশ্চিত করতে পারেন যে, একাধিক SQL অপারেশন একত্রে সফলভাবে কমিট বা রোলব্যাক হবে।

Example: Using @Transactional with Stored Procedures

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class StudentService {

    @Autowired
    private StudentMapper studentMapper;

    @Transactional
    public void processStudentData(String course) {
        studentMapper.insertStudent(new Student("John", course));
        studentMapper.getStudentCountByCourse(course);
    }
}

Explanation:

  • @Transactional: এটি Spring ব্যবহারে ট্রানজেকশন ম্যানেজমেন্টের জন্য ব্যবহৃত হয়। এটি নিশ্চিত করে যে সবকিছু atomicভাবে একসাথে কমিট বা রোলব্যাক হবে।

iBATIS (MyBatis)-এ Complex Stored Procedures হ্যান্ডল করার জন্য আপনি XML-based mapping files, SQL tags (যেমন <select>, <insert>, <update>, <delete>), এবং annotations ব্যবহার করে স্টোরড প্রোসিডিউর কল করতে পারেন। MyBatis ট্রানজেকশন ম্যানেজমেন্ট, আউটপুট প্যারামিটার হ্যান্ডলিং, এবং একাধিক প্যারামিটার সহ dynamic SQL পরিচালনা করতে সাহায্য করে। আপনার Java কোডে SqlSession এবং Mapper Interface ব্যবহার করে স্টোরড প্রোসিডিউরগুলি কল এবং তাদের ফলাফল পরিচালনা করা যেতে পারে।

Content added By
Promotion

Are you sure to start over?

Loading...