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

база данных MyBatis

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

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

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

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

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

...быть в курсе

Начните с предыдущей статьиУчебные заметки MyBatis (1) - используйте артикли, Можно обнаружить, что помимо некоторых базовых конфигураций, суть Mybatis заключается в части Mapper (отображение). Mybatis — это облегченная платформа, созданная для SQL и созданная картографами, которая может генерировать соответствующие JavaBeans для вызывающих объектов посредством конфигурации. В Mybatis SQL можно гибко использовать для удовлетворения потребностей различных сценариев, поэтому интернет-компании предпочитают использовать Mybatis для удовлетворения потребностей высокоскоростных изменений, в то время как традиционные компании предпочитают использовать Hibernate.

Основные элементы маппера

В предыдущем разделе мы определили только оператор select:

<mapper namespace="com.shuqing28.dao.CommodityDao">
    <select id="getAllCommodity" resultType="com.shuqing28.pojo.Commodity">
        SELECT * FROM commodity
    </select>
</mapper>

На самом деле добавления, удаления и изменения имеют соответствующие элементы в картографе Mybatis.

имя элемента описывать Примечание
select оператор запроса, наиболее часто используемый Вы можете настроить параметры и вернуть набор результатов
insert вставить оператор Возвращает целое число после выполнения, представляющее количество вставленных баров
update заявление об обновлении Возвращает целое число после выполнения, представляющее количество обновленных баров
delete удалить заявление Возвращает целое число после выполнения, представляющее количество удаленных элементов
parameterMap Определить сопоставления параметров Элемент, подлежащий удалению, объявлен устаревшим
sql Позволяет определить часть SQL, а затем ссылаться на нее в разных местах. Например, определите имя таблицы, которое будет использоваться в других местах в операторах SQL.
resultMap Используется для описания загрузки объектов из набора результатов базы данных. он предоставит правила сопоставления
cache конфигурация кеша для данного пространства имен ————
cache-ref Ссылки на другие конфигурации кэша пространства имен ————

Ниже мы рассмотрим основные элементы, используемые

select

Элемент select является наиболее часто используемым элементом, так же как и одной из самых важных функций в функции запроса в SQL. В нашем здравом смысле операторы запросов обычно основаны наодин или большеусловие, запрос к базе данныхВозвращает одно, несколько или все поля. Мы моглиgetAllCommodityНет условий запроса, возвращаются все поля.

В Mybatis мы можем передавать простые типы параметров, такие как int, float, String, а также некоторые сложные типы, такие как JavaBean, Map и т. д. Mybatis преобразует эти параметры в тип, требуемый оператором SQL, возвращает результат , и автоматически привязывает результирующий набор к JavaBean через сопоставление, поэтому операция получения значения из ResultSet по одному в JDBC опускается.

Давайте посмотрим на оператор select с параметрами:

<select id="getCommodityById" parameterType="int" resultType="com.shuqing28.pojo.Commodity">
            SELECT * FROM commodity where id=#{id}
</select>

В то же время мы определяем метод интерфейса:

Commodity getCommodityById(Integer id);

отличается отgetAllCommodityНикакие параметры не передаются,getCommodityByIdЕсть входящий параметр типа int, и возвращается Commodity. Приведенный выше оператор select содержит следующие свойства:

  • idЭтот sql идентифицирован, и его идентификатор соответствует имени интерфейса.
  • parameterTypeОпределите тип параметра, здесь int
  • resultTypeОпределен тип возвращаемого значения, вот определенный нами класс POJO

Глядя на результат, мы запрашиваем все поля товара и снова просматриваем определения полей:

имя поля тип
id int
name varchar(255)
price decimal(8,2)
description varchar(255)

И наш класс POJO содержит:

private Integer id;
private String name;
private Double price;
private String description;

Здесь Mybatis сделал это за насавтоматическое сопоставление, если возвращаемые имена столбцов SQL соответствуют свойствам JavaBean, Mybatis может помочь нам автоматически заполнить эти поля без какой-либо настройки. Мы можем установить автоматическое сопоставление через autoMappingBehavior в файле конфигурации Mybatis, который содержит 3 значения:

  • NONE: Отменить автоматическое сопоставление
  • PARTIAL: это также значение по умолчанию, оно будет только автоматически сопоставлено, и набор результатов, который не определяет сопоставление вложенного набора результатов
  • FULL: будет автоматически отображать произвольно сложные наборы результатов (вложенные или нет)

В примере, который мы только что передали, передается только один параметр, а что, если передается несколько параметров? Теперь давайте поговорим о сопоставлении ввода.

сопоставление ввода

Обычно существует три способа передачи нескольких параметров: через Map, через аннотации и через объекты POJO.

Передать параметры через карту

Предположим, мы хотим сделать запрос с помощьюкексЕда и цена меньше 80. Затем мы можем написать оператор SQL следующим образом.

<select id="getCommodityByMap" parameterType="map" resultType="com.shuqing28.pojo.Commodity">
                SELECT * FROM commodity WHERE name like '%${name}%' AND price&lt;#{price}
        </select>

Поскольку mybatis использует xml для определения Mapper, здесь используется escape-символ '&lt;Сказал, что все так же. Тип параметра определяется как карта, и интерфейс, который мы определяем, также принимает карту в качестве параметра.

List<Commodity> getCommodityByMap(Map<String, Object> params);

использовать:

CommodityDao commodityDao = sqlSession.getMapper(CommodityDao.class);
Map<String, Object> paramsMap = new HashMap<String , Object>();
paramsMap.put("name", "饼");
paramsMap.put("price", 80.0);
List<Commodity> commodities = commodityDao.getCommodityByMap(paramsMap);

Наконец, напечатайте товары:

[Commodity{id=1001, name='野葡萄烤饼', price=10.0, description='吃完还有点饿'}, Commodity{id=1003, name='南瓜百吉饼', price=50.0, description='份大量足,可以去很远的地方'}]

Хотя Карта очень простая, просто взглянув на входящий параметр Карта, вы не знаете, какой контент в ней содержится.Если копнуть глубже, то придется смотреть, как настроить Карту, а также нужно указать имя Ключа Карты при его использовании. Как продвигать использование.

Передать параметры с помощью аннотаций

Метод аннотации использует аннотацию **@Param**, и мы определяем интерфейс следующим образом:

List<Commodity> getCommodityByAnnation(@Param("name") String name, @Param("price") Double price);

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

Поэтому чаще всего используется POJO для передачи параметров.

Передать параметры с помощью POJO

Обычно нам нужно только передать простой объект POJO, например, мы определяем элемент select следующим образом:

<select id="getCommodityByPOJO" parameterType="com.shuqing28.pojo.Commodity" resultType="com.shuqing28.pojo.Commodity">
    SELECT * FROM commodity WHERE name like '%${name}%' AND price&lt;#{price}
</select>

контрольная работа:

@Test
public void getLowPriceCommodityByPOJO(){
    SqlSession sqlSession = sqlSessionFactory.openSession();
    try {
        CommodityDao commodityDao = sqlSession.getMapper(CommodityDao.class);
        Commodity commodity = new Commodity();
        commodity.setName("饼");
        commodity.setPrice(80.0);
        List<Commodity> commodities = commodityDao.getCommodityByPOJO(commodity);
        System.out.println(commodities);
    } finally {
        sqlSession.close();
    }
}

Он также вернет тот же результат, что и выше. Здесь Mybatis передаст соответствующее значение атрибута в POJO в SQL, а затем вернет результат. Обратите внимание, что входящий параметр — это полное имя POJO, которое совпадает с ResultType.На самом деле, вы можете передать псевдоним.Чтобы уменьшить длину имени, нам нужно толькоmybatis-config.xmlОпределяется в конфигурации в:

<typeAliases>
        <typeAlias alias="commodity" type="com.shuqing28.pojo.Commodity" />
</typeAliases>

Вы можете заменить все полные имена на Товар, но нельзя иметь одинаковое имя, иначе произойдет ошибка.

В некоторых ответственных случаях нам необходимо определить POJO как параметры запроса. Например, в приведенном выше примере вам нужны только два входных параметра. Вы также можете настроить POJO, который содержит только эти два параметра.

public class CommodityCustom {
    private String name;
    private Double price;

Конечно, процесс использования остается прежним.Определение собственного упакованного POJO обычно используется для решения сложных условий входящего запроса, таких как разработка совместного запроса нескольких таблиц.В настоящее время изначально определенный POJO не может решить проблему, поэтому вам нужно определить некоторые составные POJO.

Также есть часто упоминаемая проблема во входных параметрах, то есть разница между # и $

Разница между # и $

Сам Mybatis инкапсулирован на основе JDBC. так#{para}предварительно скомпилирован(PreparedStatement), эквивалентно оригиналу?${para}является заменой строки. Когда Mybatis обрабатывает #, он вызываетPreparedStatementизsetряд методов для присвоения значений; обработка$, это поставить${para}Замените значением переменной.#способ предотвратитьsqlинъекция,$Этот метод обычно используется для передачи объектов базы данных, таких как передача имени таблицы, которое обычно можно использовать#не используй$.

После разговора о вводе мы поговорим о отображении вывода.

выходная карта

Выходное отображение MyBatis делится на два способа: resultType и resultMap.

resultType

Во всех наших примерах выше определен тип результата, а тип результата может быть простым типом, например, мы хотим получить количество продуктов и т. д., а также вывести объекты POJO или списки POJO.

Будь то объект POJO или список POJO, наше определение в resultType одинаково, но определение интерфейса отличается:

один объект
Commodity getCommodityById(Integer id);

Mybatis возвращает объект в соответствии с возвращаемым значением интерфейса.Если вы использовали ibatis, вы можете знать, что внутри вызывается session.selectOne.

Обратно к списку
List<Commodity> getCommodityByPOJO(Commodity commodity);

Внутренне используйте session.selectList, интерфейс Mapper используетList<XXX>как возвращаемое значение.

Объект POJO будет создан до тех пор, пока одно из запрошенных имен столбцов и атрибутов POJO непротиворечивы, а большинство других полей имеют значения по умолчанию, но если все они несовместимы, объект POJO не будет создан.

resultMap

Приведенный выше тип результата может быть успешно сопоставлен только в том случае, если имя столбца запроса согласуется со значением атрибута POJO.

Если имя запрошенного столбца не соответствует имени атрибута POJO, между именем столбца и именем атрибута POJO устанавливается отношение сопоставления путем определения resultMap.

Перед использованием resultMap нам нужно определить resultMap Предположим, мы запрашиваем два поля: идентификатор и название класса товаров, но запрос определяется какid_иname_. Имя столбца и имя атрибута несовместимы, сначала определите resultMap

<resultMap id="commodityResultMap" type="commodity">
    	<id column="id_" property="id"/>
    	<result column="name_" property="name"/>
    </resultMap>

в

  • idИдентифицирует этот результатMap
  • typeОпределите атрибуты, в которых отображается POJO. Поскольку псевдоним упоминается выше, это POJO отображаемого товара.
  • idЭлемент идентифицирует первичный ключ этого объекта, а результат является общим полем.
  • propertyИмя свойства, представляющее POJO
  • columnПредставляет имя столбца базы данных SQL.

Посмотрите еще раз на наш элемент select:

<select id="getCommodityByPrice" parameterType="double" resultMap="commodityResultMap">
       SELECT id id_, name name_ FROM USER WHERE price=#{price}
</select>

При использовании resultType для сопоставления вывода столбец может быть успешно сопоставлен только в том случае, если имя запрошенного столбца совпадает с именем атрибута в pojo. Если имя запрошенного столбца не соответствует имени атрибута pojo, отношение сопоставления между именем столбца и именем атрибута pojo устанавливается путем определения resultMap. Кроме того, resultMap также может выполнять расширенное сопоставление, такое как «один ко многим» и «многие ко многим», которые будут представлены в последующих статьях.

insert

Вставить намного проще, чем выбрать.Ниже приведен пример вставки товара в таблицу товаров:

<insert id="insertCommodity" useGeneratedKeys="true"
   keyProperty="id">
   insert into commodity (name,price,description)
   values (#{name},#{price},#{description})
</insert>

Интерфейс:

void insertCommodity(Commodity commodity);

Здесь мы замечаем, что в операторе вставки есть еще два свойства.useGeneratedKeysиkeyProperty, Здесь задействована концепция обратной засыпки первичного ключа.

  • useGeneratedKeys: сообщите Mybatis, следует ли использовать встроенную стратегию базы данных для генерации первичного ключа.
  • keyProperty: сообщить Mybatis, какой столбец является первичным ключом. Таким образом, нам не нужно передавать значение идентификатора, Mybatis может помочь нам установить первичный ключ, а также заполнить значение идентификатора в POJO, когда мы вызываем его следующим образом:
@Test
public void insertCommodity(){
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
    CommodityDao commodityDao = sqlSession.getMapper(CommodityDao.class);
    Commodity commodity = new Commodity();
    //commodity.setId(1005);
    commodity.setName("艾蒿小麦饼");
    commodity.setPrice(100.0);
    commodity.setDescription("像在艳阳下恋爱");
    commodityDao.insertCommodity(commodity);
    System.out.println(commodity.getId());
} finally {
    sqlSession.close();
}
}

Распечатав, мы можем получить1005, что указывает на то, что у товара уже есть идентификатор, что является результатом заполнения. Здесь метод системы по умолчанию состоит в том, чтобы добавить к значению первичного ключа 1. Если мы хотим определить наш собственный метод генерации первичного ключа, мы можем использовать selectKey для настройки:

<insert id="insertCommodity" useGeneratedKeys="true"
    keyProperty="id">
    <selectKey keyProperty="id" resultType="int" order="BEFORE">
        select if (max(id) is null, 1, max(id) + 2) as newId from commodity
    </selectKey>
    insert into commodity (name,price,description)
    values (#{name},#{price},#{description})
</insert>

Здесь мы определяем значение первичного ключа как максимальный идентификатор плюс 2, если записи нет, она инициализируется до 1.

обновить и удалить

И обновление, и удаление возвращают количество затронутых записей. Ниже перечислены только примеры конфигураций:

<update id="updateCommodity" parameterType="commodity">
    update commodity set 
    name=#{name},
    price=#{price},
    description=#{description}
    where id=#{id}
</update>

<delete id="deleteCommodity" parameterType="int">
    delete from commodity where id=#{id}
</delete>

Этот раздел в основном знакомит с использованием основных операторов, фокусируется на операторе select и объясняет содержимое сопоставления ввода и вывода в Mybatis в сочетании с оператором select.Другое расширенное содержимое сопоставления зарезервировано для последующих статей.