«1. Введение

MyBatis — это инфраструктура персистентности с открытым исходным кодом, которая упрощает реализацию доступа к базе данных в приложениях Java. Он обеспечивает поддержку пользовательского SQL, хранимых процедур и различных типов отношений отображения.

Проще говоря, это альтернатива JDBC и Hibernate.

2. Зависимости Maven

Чтобы использовать MyBatis, нам нужно добавить зависимость в наш pom.xml:

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.4</version>
</dependency>

Последнюю версию зависимости можно найти здесь.

3. API-интерфейсы Java

3.1. SQLSessionFactory

SQLSessionFactory — это базовый класс для каждого приложения MyBatis. Этот класс создается с помощью метода builder() SQLSessionFactoryBuilder, который загружает XML-файл конфигурации:

String resource = "mybatis-config.xml";
InputStream inputStream Resources.getResourceAsStream(resource);
SQLSessionFactory sqlSessionFactory
  = new SqlSessionFactoryBuilder().build(inputStream);

Файл конфигурации Java включает такие параметры, как определение источника данных, сведения о диспетчере транзакций и список преобразователей, определяющих отношения между сущностями, вместе они используются для создания экземпляра SQLSessionFactory:

public static SqlSessionFactory buildqlSessionFactory() {
    DataSource dataSource 
      = new PooledDataSource(DRIVER, URL, USERNAME, PASSWORD);

    Environment environment 
      = new Environment("Development", new JdbcTransactionFactory(), dataSource);
        
    Configuration configuration = new Configuration(environment);
    configuration.addMapper(PersonMapper.class);
    // ...

    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    return builder.build(configuration);
}

3.2. SQLSession

SQLSession содержит методы для выполнения операций с базой данных, получения картографов и управления транзакциями. Его можно создать из класса SQLSessionFactory. Экземпляры этого класса не являются потокобезопасными.

После выполнения операции с базой данных сессия должна быть закрыта. Поскольку SqlSession реализует интерфейс AutoCloseable, мы можем использовать блок try-with-resources:

try(SqlSession session = sqlSessionFactory.openSession()) {
    // do work
}

4. Преобразователи

Преобразователи — это интерфейсы Java, которые сопоставляют методы с соответствующими операторами SQL. MyBatis предоставляет аннотации для определения операций с базой данных:

public interface PersonMapper {

    @Insert("Insert into person(name) values (#{name})")
    public Integer save(Person person);

    // ...

    @Select(
      "Select personId, name from Person where personId=#{personId}")
    @Results(value = {
      @Result(property = "personId", column = "personId"),
      @Result(property="name", column = "name"),
      @Result(property = "addresses", javaType = List.class,
        column = "personId", [email protected](select = "getAddresses"))
    })
    public Person getPersonById(Integer personId);

    // ...
}

5. Аннотации MyBatis

Давайте рассмотрим некоторые основные аннотации, предоставляемые MyBatis:


    «@Insert, @Select, @Update, @Delete — эти аннотации представляют операторы SQL, которые должны выполняться путем вызова аннотированных методов: @Insert(\»Вставить в значения person(name) (#{name})\»)\nобщественное целочисленное сохранение (человек-человек);\n\n@Update(\»Обновить имя набора персон = #{name}, где personId=#{personId}\»)\npublic void updatePerson (человек-человек);\n\n@Delete(\»Удалить из Person, где personId=#{personId}\»)\npublic void deletePersonById (Integer personId);\n\n@Select(\»ВЫБЕРИТЕ person.personId, person.name FROM человека\n ГДЕ person.personId = #{personId}\»)\nЧеловек getPerson(Integer personId); @Results — это список сопоставлений результатов, содержащих сведения о том, как столбцы базы данных сопоставляются с атрибутами класса Java: @Select(\»Выбрать personId, имя из Person, где personId=#{personId}\»)\n@Результаты (значение = {\n @Result (свойство = \»personId\», столбец = \»personId\»)\n // …\n})\nпубличный человек getPersonById (Integer personId); @Result — представляет один экземпляр Result из списка результатов, полученных из @Results. Он включает в себя такие детали, как сопоставление столбца базы данных со свойством компонента Java, тип свойства Java, а также связь с другими объектами Java: @Results(value = {\n @Результат (свойство = \»personId\», столбец = \»personId\»),\n @Результат (свойство = \»имя\», столбец = \»имя\»),\n @Result (свойство = «адреса», javaType = List.class)\n // …\n})\nпубличный человек getPersonById (Integer personId); @Many – определяет сопоставление одного объекта с набором других объектов: @Results(value ={\n @Result(property = \»адреса\», javaType = List.class,\n столбец = \»ID человека\»,\n [электронная почта защищена](выберите = \»getAddresses\»))\n}) Здесь getAddresses — это метод, который возвращает коллекцию Address, запрашивая таблицу Address. @Select(\»выберите addressId, streetAddress, personId из адреса\n где personId=#{personId}\»)\nпубличный адрес getAddresses (Integer personId); Подобно аннотации @Many, у нас есть аннотация @One, которая указывает отношение отображения один к одному между объектами. @MapKey — используется для преобразования списка записей в карту записей с ключом, определенным атрибутом value: @Select(\»select * from Person\»)\n@MapKey(\»Идентификатор человека\»)\nMap\u003cInteger, Person\u003e getAllPerson(); @Options — эта аннотация определяет широкий диапазон переключателей и конфигураций, которые необходимо определить, чтобы вместо определения их в других операторах мы могли @Options определить их: @Insert(\»Вставить в адрес (streetAddress, personId)\n значения(#{streetAddress}, #{personId})\»)\n@Options(useGeneratedKeys = false, flushCache=true)\nобщественное целое saveAddress (адресный адрес);

6. Динамический SQL

Динамический SQL — очень мощная функция MyBatis. Благодаря этому мы можем точно структурировать наш сложный SQL.

В традиционном коде JDBC мы должны писать операторы SQL, объединять их с точностью до пробелов между ними и ставить запятые в нужных местах. Это очень подвержено ошибкам и очень трудно отлаживается в случае больших операторов SQL.

Давайте рассмотрим, как мы можем использовать динамический SQL в нашем приложении:

@SelectProvider(type=MyBatisUtil.class, method="getPersonByName")
public Person getPersonByName(String name);

Здесь мы указали класс и имя метода, который фактически создает и генерирует окончательный SQL:

public class MyBatisUtil {
 
    // ...
 
    public String getPersonByName(String name){
        return new SQL() {{
            SELECT("*");
            FROM("person");
            WHERE("name like #{name} || '%'");
        }}.toString();
    }
}

Динамический SQL предоставляет все конструкции SQL как класс, например SELECT, WHERE и т. д. При этом мы можем динамически изменять генерацию предложения WHERE.


7. Поддержка хранимых процедур

Мы также можем выполнить хранимую процедуру, используя аннотацию @Select. Здесь нам нужно передать имя хранимой процедуры, список параметров и использовать явный вызов этой процедуры:

@Select(value= "{CALL getPersonByProc(#{personId,
  mode=IN, jdbcType=INTEGER})}")
@Options(statementType = StatementType.CALLABLE)
public Person getPersonByProc(Integer personId);

8. Заключение

В этом кратком руководстве мы рассмотрели различные функции, предоставляемые MyBatis и то, как он упрощает разработку приложений для работы с базами данных. Мы также видели различные аннотации, предоставляемые библиотекой.

Полный код этой статьи доступен на GitHub.