Введение
Для изучения этой статьи требуется определенная вводная база mybatis; если вы новичок, перейдите по следующей ссылке для систематического обучения.
учебник по мибатису
- Начало работы с mybatis (1)
- статьи о картировании mybatis (2)
- статьи о конфигурации mybatis (3)
- mybatis динамический SQL и пакетная вставка (4)
- Пользовательский обработчик типов mybatis (5)
- Конфигурация плагина mybatis (6)
- продолжение следует
Конечно, если вы старший читатель и не изучали систематически, вы можете напрямую войти в эту статью и показать вам, как использовать динамические теги;
Динамический SQL может выполнять разные операторы SQL, задавая разные условия.Способ достижения динамического SQL заключается в его настройке с помощью синтаксиса тегов, предоставляемого mybatis;
Два динамических тега SQL
2.1 если тег
- если тег указывает условное суждение
- Если имя_клиента не пусто, будет выполнено содержимое текущего тега if; оператор sql в это время выбирает * из
customerwhere andcustomer_name= #{customer_name} - Если поле не пусто, будет выполнен оператор if; в это время выполняется оператор sql select * from
customerwhere 1 = 1 andgender= #{gender} - Когда метки имя_клиента и пол не пусты, оператор sql, выполняемый в это время, выбирает * из
customerwhere andcustomer_name= #{customer_name} andgender= #{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, как в следующем примере.
- Когда имя_клиента не пусто, будет выполнено содержимое тела тега когда; в это время выбирается sql
genderfromcustomer; - Когда входное условие 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
- префикс означает префикс, то есть префикс будет добавлен к телу тега обрезки;
- prefixOverrides означает, что первая совпавшая строка будет удалена;
- суффикс означает суффикс, который добавит суффикс к телу тега обрезки;
- 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 выглядит следующим образом.
- параметр коллекции
- открытый префикс
- сепаратор сепаратор
- Значение получается в итерации элемента, когда входным параметром является Map.Entry или карта является значением
- 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, чтобы объяснить, что есть адрес исходного кода, и каждый пример в исходном коде имеет полный код для личного обучения;