Заметки об исследовании Mybatis (6) — динамический SQL

база данных MyBatis

Учебные заметки MyBatis (1) - используйте артикли

Учебные заметки MyBatis (2) — сопоставление отношений

Учебные заметки MyBatis (3) - взаимно однозначное сопоставление расширенного сопоставления

Учебные заметки Mybatis (4) - сопоставление «один ко многим» расширенного сопоставления

Учебные заметки Mybatis (5) — сопоставление «многие ко многим» расширенного сопоставления

Одной из мощных функций Mybatis является динамический SQL.Вы можете использовать динамический SQL, чтобы внести некоторую логику в операторы SQL, чтобы избежать проблем сборки SQL при использовании JDBC.Давайте рассмотрим некоторые из наиболее распространенных приложений.

если (элемент суждения)

Мы часто используем оператор if для вынесения суждений в коде, а в Mybatis мы также можем использовать элемент if Давайте рассмотрим простое использование на примере:

<select id="findProductList" parameterType="com.shuqing28.pojo.Products"
        resultType="com.shuqing28.pojo.Products">
    SELECT * FROM products
    WHERE 1=1
    <if test="prodName!=null and prodName!=''">
            AND prod_name like '%${prodName}%'
    </if>
</select>

Здесь мы используем оператор if, чтобы определить, пусто ли prodName. Если оно не пусто, добавьте нечеткое соответствие prod_name. Если параметр пуст, не создавайте это условие. Здесь мы видимWHERE 1=1На самом деле это для предотвращения последнего условия, раз оно верно, то не добавлятьWHERE 1=1, оператор запроса становитсяSELECT * FROM products AND prod_name like '%${prodName}%', подключенный напрямую к И, есть проблема.

На самом деле, есть несколько способов, которые мы не можем использовать.WHERE 1=1

where, trim, set

для вышеперечисленногоWHERE 1=1Вместо этого мы можем использовать элемент WHERE:

<select id="findProductList" parameterType="com.shuqing28.pojo.Products"
        resultType="com.shuqing28.pojo.Products">
    SELECT * FROM products
    <where>
    <if test="prodName!=null and prodName!=''">
            AND prod_name like '%${prodName}%'
    </if>
    </where>
</select>

Когда if в элементе where истинно, он добавит предложение WHERE и автоматически отрегулирует, существует ли AND.

также можно использоватьtrimдля настройки формата:

<select id="findProductList" parameterType="com.shuqing28.pojo.Products"
        resultType="com.shuqing28.pojo.Products">
    SELECT * FROM products
    <trim prefix="WHERE" prefixOverrides="AND">
    <if test="prodName!=null and prodName!=''">
            AND prod_name like '%${prodName}%'
    </if>
    </trim>
</select>

это здесьprefixобозначает префикс,prefixoverrideудалю первыйAND, поэтому конечный эффект такой же, как у элемента where.

Элемент set используется для обновления, добавляя, что мы хотим обновить поле:

<update id="updateProduct" parameterType="com.shuqing28.pojo.Products">
    UPDATE products
    <set>
    <if test="prodName!=null and prodName!=''">
            AND prod_name like '%${prodName}%'
    </if>
    </set>
    WHERE prod_id=#{prodId}
</update>

Это завернуто в набор, то есть, если элемент if считается истинным, он будет автоматически добавленSETпункт

UPDATE products SET prod_name like '%${prodName}% WHERE prod_id=#{prodId}

Конечно, вы также можете использовать элемент отделки:

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

Пока префикс заменен на SET, suffixOverride автоматически заменит последний нежелательный,удалить, конечноsetПоставляется с функцией удаления последней запятой.

foreach

очевидноforeachЯвляется оператором цикла, его роль заключается в обходе коллекции, если входящий набор представляет собой набор интерфейса List, Set, то он может показать свои таланты. Предположим, у вас есть следующий запрос:

SELECT * FROM products WHERE prod_id IN ("ANV01", "ANV02", "ANV03");

Затем мы можем инкапсулировать 3 параметра в список, а затем использоватьforeachВывод обхода оператора:

<select id="findProductListByProdId" parameterType="java.util.List"
        resultType="com.shuqing28.pojo.Products">
    SELECT * FROM products
    WHERE prod_id IN
    <foreach item="prod_id" index="index" collection="list" open="(" separator="," close=")">
            #{prod_id}
    </foreach>
</select>

Давайте посмотрим, как это работает при использовании:

@Test
public void findProductListByProdId(){
    SqlSession sqlSession = sqlSessionFactory.openSession();
    try {
        OrdersDao ordersDao = sqlSession.getMapper(OrdersDao.class);
        List<String> prodList = new ArrayList<String>();
        prodList.add("ANV01");
        prodList.add("ANV02");
        prodList.add("ANV03");
        List<Products> productList = ordersDao.findProductListByProdId(prodList);
        System.out.println(productList);
    } finally {
        sqlSession.close();
    }
}

Создайте параметры запроса и непосредственно передайте их в список.

bind

Другие параметры динамического SQL включают те, которые были включены ранее.test, используемый для проверки истинности и ложности в элементах условного суждения, иbindэлемент, используемый для определения переменной контекста, например, в нашем первом примере%${prodName}%, мы также можем использоватьbindОпределяется заранее:

<select id="findProductList" parameterType="com.shuqing28.pojo.Products"
        resultType="com.shuqing28.pojo.Products">
        <bind name="pattern" value="'%' + _parameter + '%'"/>
    SELECT * FROM products
    WHERE 1=1
    <if test="prodName!=null and prodName!=''">
            AND prod_name like #{pattern}'
    </if>
</select>

В приведенном выше примере мы предварительно определяем шаблон, который можно использовать непосредственно при его использовании.Это подходит для переменных, используемых в нескольких местах.Здесь_parameterПредставляет входящий параметр, который объединяется с подстановочными знаками и назначаетсяpattern.

Что касается динамического SQL, это наиболее часто используемые элементы.