Dynamic SQL ব্যবহার (IF, WHERE, CHOOSE, FOREACH)

SQL Statements এবং XML Mapping - আইবাটিস (iBATIS) - Java Technologies

319

iBATIS (বর্তমানে MyBatis নামে পরিচিত) হল একটি powerful persistence framework যা SQL-এ dynamic queries তৈরির জন্য অনেক সুবিধা প্রদান করে। MyBatis-এ dynamic SQL তৈরি করার জন্য , , , এবং ট্যাগ ব্যবহার করা হয়। এগুলোর মাধ্যমে SQL কুয়েরি কোডকে আরও ফ্লেক্সিবল এবং ডাইনামিক করা যায়, যাতে কন্ডিশনাল কোয়েরি তৈরির কাজ সহজ হয়।

এখানে MyBatis তে dynamic SQL ব্যবহারের জন্য কিছু গুরুত্বপূর্ণ ট্যাগ এবং তাদের ব্যবহার দেখানো হবে, যেমন IF, WHERE, CHOOSE, এবং FOREACH


1. IF Tag

<if> ট্যাগটি একটি কন্ডিশনাল স্টেটমেন্ট হিসেবে কাজ করে। এটি যদি কোনো প্যারামিটার সেট করা থাকে, তখন শুধুমাত্র সেই অংশের SQL কোড কার্যকর হবে।

Example: Using <if> for Conditional SQL

<select id="getEmployeeByConditions" resultType="Employee">
    SELECT * FROM employees
    <where>
        <if test="name != null">
            AND name = #{name}
        </if>
        <if test="email != null">
            AND email = #{email}
        </if>
    </where>
</select>

Explanation:

  • <if test="name != null">: যদি name প্যারামিটারটি null না হয়, তবে name = #{name} শর্তটি SQL কুয়েরিতে যুক্ত হবে।
  • <where>: where ব্লকটি এমনভাবে কাজ করে যে এটি শুধুমাত্র প্রয়োজনীয় শর্তগুলির জন্য AND যোগ করে, যাতে ভুল AND কন্ডিশন না আসে।

Usage:

Map<String, Object> params = new HashMap<>();
params.put("name", "John");
params.put("email", "john.doe@example.com");

List<Employee> employees = sqlSession.selectList("getEmployeeByConditions", params);

2. WHERE Tag

<where> ট্যাগটি SQL কুয়েরির WHERE ক্লজে শর্ত যোগ করতে ব্যবহৃত হয়। এটি স্বয়ংক্রিয়ভাবে AND বা OR যুক্ত করে, যাতে কন্ডিশনাল SQL কোড আরও সঠিকভাবে লেখা যায়।

Example: Using <where> for SQL Conditions

<select id="getEmployeeByWhere" resultType="Employee">
    SELECT * FROM employees
    <where>
        <if test="id != null">AND id = #{id}</if>
        <if test="name != null">AND name = #{name}</if>
    </where>
</select>

Explanation:

  • <where>: এটি SQL কুয়েরির শুরুতে যোগ হয় এবং ভিতরের শর্তগুলিকে AND দিয়ে যোগ করা হয়। যদি কোন শর্ত না থাকে, তবে WHERE ক্লজটি ব্যতিক্রমীভাবে যুক্ত হবে না।

Usage:

Map<String, Object> params = new HashMap<>();
params.put("id", 1);
params.put("name", "John");

List<Employee> employees = sqlSession.selectList("getEmployeeByWhere", params);

3. CHOOSE Tag

<choose> ট্যাগটি একটি if-else কন্ডিশনের মতো কাজ করে। এটি একাধিক শর্তগুলোর মধ্যে প্রথম সত্য শর্তটি নির্বাচিত করে।

Example: Using <choose> for Conditional SQL

<select id="getEmployeeByType" resultType="Employee">
    SELECT * FROM employees
    <where>
        <choose>
            <when test="type == 'full-time'">
                AND type = 'full-time'
            </when>
            <when test="type == 'part-time'">
                AND type = 'part-time'
            </when>
            <otherwise>
                AND type IS NULL
            </otherwise>
        </choose>
    </where>
</select>

Explanation:

  • <choose>: এটি একাধিক শর্তের মধ্যে প্রথম সত্য শর্তটি নির্বাচন করবে। প্রথম <when> শর্তটি যদি true হয়, তাহলে পরবর্তী শর্তগুলি পরীক্ষা করা হবে না।
  • <otherwise>: এটি একটি ডিফল্ট শর্ত, যা সব শর্ত ফেইল হলে কার্যকর হবে।

Usage:

Map<String, String> params = new HashMap<>();
params.put("type", "full-time");

List<Employee> employees = sqlSession.selectList("getEmployeeByType", params);

4. FOREACH Tag

<foreach> ট্যাগটি একটি লিস্ট বা অ্যারে থেকে ডেটা নিয়ে SQL কুয়েরিতে ডাইনামিক ভাবে ইনপুট হিসেবে ব্যবহৃত হয়, যেমন IN কন্ডিশন।

Example: Using <foreach> for Dynamic SQL in IN Clause

<select id="getEmployeesByIds" resultType="Employee">
    SELECT * FROM employees
    WHERE id IN
    <foreach item="id" collection="ids" open="(" close=")" separator=",">
        #{id}
    </foreach>
</select>

Explanation:

  • <foreach>: এটি একটি লুপের মত কাজ করে এবং ids লিস্টের প্রতিটি উপাদানকে IN কন্ডিশনে যোগ করে।
  • open="(" এবং close=")": এটি SQL কুয়েরির IN ক্লজে () যোগ করে।
  • separator=",": এটি লিস্টের মধ্যে কমা যোগ করে।

Usage:

List<Integer> ids = Arrays.asList(1, 2, 3, 4);

Map<String, Object> params = new HashMap<>();
params.put("ids", ids);

List<Employee> employees = sqlSession.selectList("getEmployeesByIds", params);

5. Combining All Dynamic SQL Tags

আপনি বিভিন্ন ডাইনামিক SQL ট্যাগ যেমন <if>, <choose>, <where>, এবং <foreach> একসাথে ব্যবহার করতে পারেন, যাতে আরও জটিল কুয়েরি তৈরি করা যায়।

Example: Combining All Dynamic SQL Tags

<select id="getEmployeesByConditions" resultType="Employee">
    SELECT * FROM employees
    <where>
        <if test="name != null">AND name = #{name}</if>
        <if test="age != null">AND age = #{age}</if>
        <choose>
            <when test="status == 'active'">
                AND status = 'active'
            </when>
            <when test="status == 'inactive'">
                AND status = 'inactive'
            </when>
            <otherwise>
                AND status IS NULL
            </otherwise>
        </choose>
        <if test="ids != null and ids.size() > 0">
            AND id IN
            <foreach item="id" collection="ids" open="(" close=")" separator=",">
                #{id}
            </foreach>
        </if>
    </where>
</select>

Explanation:

  • <where>: এই অংশটি সমস্ত শর্তের জন্য একটি WHERE ক্লজ তৈরি করে এবং অপ্রয়োজনীয় AND গুলো বাদ দেয়।
  • <if>: নির্দিষ্ট কন্ডিশনের উপর ভিত্তি করে শর্ত যোগ করা হয়।
  • <choose>: status এর জন্য শর্ত নির্বাচন করা হয়।
  • <foreach>: একটি লিস্ট বা অ্যারের আইডি দিয়ে IN কন্ডিশন তৈরি করা হয়।

MyBatis (আগে iBATIS) ডাইনামিক SQL তৈরি করার জন্য অনেক শক্তিশালী ট্যাগ প্রদান করে। এগুলি:

  1. <if>: SQL কুয়েরি শর্ত যোগ করতে ব্যবহার করা হয়।
  2. <where>: স্বয়ংক্রিয়ভাবে WHERE ক্লজ যোগ করা হয় এবং অপ্রয়োজনীয় AND বা OR বাদ দেওয়া হয়।
  3. <choose>: একাধিক কন্ডিশনের মধ্যে একটি সিলেক্ট করতে ব্যবহার করা হয় (যেমন if-else কাজ করে)।
  4. <foreach>: লিস্ট বা অ্যারে থেকে ডেটা নিয়ে IN কন্ডিশনে যুক্ত করা হয়।

এই ডাইনামিক SQL ট্যাগগুলি ব্যবহার করে আপনি খুব সহজে কাস্টম SQL কুয়েরি তৈরি করতে পারবেন যা ডেটাবেস অপারেশনের জন্য আরও বেশি ফ্লেক্সিবল এবং পারফরম্যান্সে কার্যকরী।

Content added By
Promotion

Are you sure to start over?

Loading...