динамический SQL mybatis с массовой вставкой

задняя часть
динамический SQL mybatis с массовой вставкой

Введение

Для изучения этой статьи требуется определенная вводная база mybatis; если вы новичок, перейдите по следующей ссылке для систематического обучения.

учебник по мибатису

Конечно, если вы старший читатель и не изучали систематически, вы можете напрямую войти в эту статью и показать вам, как использовать динамические теги;

Динамический SQL может выполнять разные операторы SQL, задавая разные условия.Способ достижения динамического SQL заключается в его настройке с помощью синтаксиса тегов, предоставляемого mybatis;

Два динамических тега SQL

2.1 если тег

  1. если тег указывает условное суждение
  2. Если имя_клиента не пусто, будет выполнено содержимое текущего тега if; оператор sql в это время выбирает * изcustomer where and customer_name = #{customer_name}
  3. Если поле не пусто, будет выполнен оператор if; в это время выполняется оператор sql select * fromcustomer where 1 = 1 and gender = #{gender}
  4. Когда метки имя_клиента и пол не пусты, оператор sql, выполняемый в это время, выбирает * изcustomer where and customer_name = #{customer_name} and gender = #{gender}
    <select id="getCustomer" resultType="com.zszxz.dynamic.entity.Customer" >
        select
            *
        from `customer`
        where 1=1 
            <if test="customer_name!=null and customer_name!='' ">
                and `customer_name` = #{customer_name}
            </if>
            <if test="gender!=null and gender!=''">
                and `gender` = #{gender}
            </if>
    </select>

2.2 где тег

В 2.1 мы используем операцию 1=1 после where, что означает, что она всегда истинна, что не является стандартной операцией с базой данных, мы обычно используем тег where и тег if в условной части оператора select. на этот раз 1= можно исключить 1 Отрицательные последствия эксплуатации

    <select id="getCustomer" resultType="com.zszxz.dynamic.entity.Customer" >
        select
            *
        from `customer`
        <where>
            <if test="customer_name!=null and customer_name!='' ">
                and `customer_name` = #{customer_name}
            </if>
            <if test="gender!=null and gender!=''">
                and `gender` = #{gender}
            </if>
        </where>
            
    </select>

2.3 выбирать, когда, иначе метки

Иногда необходим сценарий, представляющий собой суждение в форме if else, как в следующем примере.

  1. Когда имя_клиента не пусто, будет выполнено содержимое тела тега когда; в это время выбирается sqlgender from customer;
  2. Когда входное условие customer_name пусто, содержимое тела тега, в противном случае, будет выполнено; в это время SQL выбирается * изcustomer;
  <select id="getCustomer" resultType="com.zszxz.dynamic.entity.Customer" >
        select
        <choose>
            <when test="customer_name=!null">
                `gender`
            </when>
            <otherwise>
                *
            </otherwise>
        </choose>
        from `customer`
    </select>

2.4 теги обрезки

Поговорим о значении атрибута trim

  1. префикс означает префикс, то есть префикс будет добавлен к телу тега обрезки;
  2. prefixOverrides означает, что первая совпавшая строка будет удалена;
  3. суффикс означает суффикс, который добавит суффикс к телу тега обрезки;
  4. suffixOverrides означает, что будет удалена последняя совпавшая строка;

Оператор SQL, выполняемый в следующем примере, называется select * fromcustomer where customer_name = #{customer_name}

    <select id="getCustomer" resultType="com.zszxz.dynamic.entity.Customer" >
        select
            *
        from `customer`
        <trim prefix="where" prefixOverrides="and">
            and `customer_name` = #{customer_name}
        </trim> 

    </select>

2.5 установить тег

Тег set можно использовать только в операции обновления, в следующем примере тег set удалит последнюю лишнюю запятую по умолчанию;

    <update id="updateCustomer" parameterType="com.zszxz.dynamic.entity.Customer">
        update `customer`
        <set>
            <if test="customer_name!=null">
                `customer_name` = #{customer_name},
            </if>
            <if test="gender!=null">
                `gender` = #{gender},
            </if>
            <if test="telephone!=null">
                `telephone` = #{telephone},
            </if>
            <if test="register_time!=null">
                `register_time` = #{register_time},
            </if>
        </set>
        <where>
            id = #{id}
        </where>
    </update>

Если все параметры не пусты, выполняется следующий оператор

update `customer` SET `customer_name` = ?, `gender` = ?, `telephone` = ?, `register_time` = ? WHERE id = ? 

Тег set теперь будет эквивалентен следующей форме тега trim

<trim prefix="SET" suffixOverrides=",">
  ...
</trim>

2.6 реализация тега foreach в

Описание атрибута тега foreach выглядит следующим образом.

  1. параметр коллекции
  2. открытый префикс
  3. сепаратор сепаратор
  4. Значение получается в итерации элемента, когда входным параметром является Map.Entry или карта является значением
  5. index получает ключ в итерации, когда входным параметром является Map.Entry или карта, это ключ, если входным параметром является номер группы, это индекс;
    <select id="getCustomerById" resultType="com.zszxz.dynamic.entity.Customer" >
        select
            *
        from `customer`
        <where>
            <if test="ids!=null">
                and id in 
                <foreach collection="ids" open="(" separator="," item="id" index="i"  close=")">
                    #{id}
                </foreach>
            </if>
        </where>
    </select>

Окончательная форма выполнения оператора SQL выглядит следующим образом.

select * from `customer` WHERE id in ( ? , ? )

2.7 тег foreach для пакетной вставки

Добавьте следующий оператор в xml

 <insert id="addCustomer" >
         insert into `customer`(
            `customer_name`,
            `gender`,
            `telephone`,
            `register_time`
         )values 
         <foreach collection="customers"  separator="," item="customer" index="i">
             (
                 #{customer.customer_name},
                 #{customer.gender},
                 #{customer.telephone},
                 #{customer.register_time}
             )
         </foreach>
    </insert>

Вот некоторые тестовые классы. Создайте 3 объекта клиента в цикле for и поместите их в список, а затем выполните метод пакетной вставки.


    @Test
    public void testInsert(){
        // 获得mapper的形式
        CustomerMapper mapper = sqlSession.getMapper(CustomerMapper.class);
        ArrayList<Customer> list = new ArrayList<>();
        for (int i = 0; i < 3; i++) {
            Customer customer = new Customer();
            customer.setCustomer_name("知识追寻者");
            customer.setGender("男");
            customer.setTelephone("999"+i);
            list.add(customer);
        }
        // 添加客户
        mapper.addCustomer(list);
        sqlSession.commit();
        sqlSession.close();
    }

Формат окончательного исполняемого оператора SQL выглядит следующим образом.

insert into `customer`( `customer_name`, `gender`, `telephone`, `register_time` )values ( ?, ?, ?, ? ) , ( ?, ?, ?, ? ) , ( ?, ?, ?, ? ) 

2.8 теги сценария

Тег script используется для аннотирования версии динамического SQL.Официальный пример выглядит следующим образом.

@Update({"<script>",
      "update Author",
      "  <set>",
      "    <if test='username != null'>username=#{username},</if>",
      "    <if test='password != null'>password=#{password},</if>",
      "    <if test='email != null'>email=#{email},</if>",
      "    <if test='bio != null'>bio=#{bio}</if>",
      "  </set>",
      "where id=#{id}",
      "</script>"})
    void updateAuthorValues(Author author);

2.9 sql, включить тег

Тег sql представляет собой фрагмент sql.В следующем примере условие запроса извлекается во фрагмент sql, а затем тег include используется для реализации ссылки; это очень полезно, когда мы хотим повторно использовать фрагмент sql и уменьшить количество кода;

<sql id="condition">
        <where>
            <if test="customer_name!=null and customer_name!='' ">
                and `customer_name` = #{customer_name}
            </if>
            <if test="gender!=null and gender!=''">
                and `gender` = #{gender}
            </if>
        </where>
    </sql>
    <select id="getCustomer" resultType="com.zszxz.dynamic.entity.Customer" >
        select
            *
        from `customer`
        <include refid="condition">

        </include>

    </select>

2.10 тег привязки

bindЭлемент может создать переменную из выражения OGNL и привязать ее к контексту; преимущество использования тега привязки заключается в том, что влияние различных синтаксисов базы данных может быть удалено в процессе замены базы данных; в следующем примере данные могут быть реализованы в mysql, oracle, postgresql Замена, если вы используете mysql, функция concat больше не применима в oracle;

 <sql id="condition">
        <where>
            <if test="customer_name!=null and customer_name!='' ">
                and customer_name like #{customer_name}
            </if>
            <if test="gender!=null and gender!=''">
                and gender = #{gender}
            </if>
        </where>
    </sql>
    <select id="getCustomer" resultType="com.zszxz.dynamic.entity.Customer" >
        <bind name="customer_name" value="'%'+customer_name+'%'"/>
        select
            *
        from customer
        <include refid="condition">

        </include>

    </select>

Три исходника

Если вы новичок, если вы не понимаете некоторые места, вы можете обратиться к авторской колонке mybatis, чтобы объяснить, что есть адрес исходного кода, и каждый пример в исходном коде имеет полный код для личного обучения;