Учебные заметки 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, это наиболее часто используемые элементы.