Перейти к основному содержимому

Краткое руководство по MyBatis

· 5 мин. чтения

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", many=@Many(select = "getAddresses"))
})
public Person getPersonById(Integer personId);

// ...
}

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

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

  • @Insert, @Select, @Update, @Delete — эти аннотации представляют операторы SQL, которые должны выполняться путем вызова аннотированных методов:
@Insert("Insert into person(name) values (#{name})")
public Integer save(Person person);

@Update("Update Person set name= #{name} where personId=#{personId}")
public void updatePerson(Person person);

@Delete("Delete from Person where personId=#{personId}")
public void deletePersonById(Integer personId);

@Select("SELECT person.personId, person.name FROM person
WHERE person.personId = #{personId}")
Person getPerson(Integer personId);
  • @Results — это список сопоставлений результатов, содержащих сведения о том, как столбцы базы данных сопоставляются с атрибутами класса Java:
@Select("Select personId, name from Person where personId=#{personId}")
@Results(value = {
@Result(property = "personId", column = "personId")
// ...
})
public Person getPersonById(Integer personId);
  • @Result — представляет один экземпляр Result из списка результатов, полученных из @Results. Он включает в себя такие детали, как сопоставление столбца базы данных со свойством Java-бина, тип свойства Java, а также связь с другими объектами Java:
@Results(value = {
@Result(property = "personId", column = "personId"),
@Result(property="name", column = "name"),
@Result(property = "addresses", javaType =List.class)
// ...
})
public Person getPersonById(Integer personId);
  • @Many — указывает сопоставление одного объекта с набором других объектов:
@Results(value ={
@Result(property = "addresses", javaType = List.class,
column = "personId",
many=@Many(select = "getAddresses"))
})

Здесь getAddresses — это метод, который возвращает коллекцию Address , запрашивая таблицу Address.

@Select("select addressId, streetAddress, personId from address 
where personId=#{personId}")
public Address getAddresses(Integer personId);

Подобно аннотации @Many , у нас есть аннотация @One , которая указывает отношение отображения один к одному между объектами.

  • @MapKey — используется для преобразования списка записей в карту записей с ключом, определенным атрибутом value :
@Select("select * from Person")
@MapKey("personId")
Map<Integer, Person> getAllPerson();
  • @Options — эта аннотация указывает широкий диапазон переключателей и конфигураций, которые необходимо определить, поэтому вместо их определения в других операторах мы можем определить их с помощью @Options :
@Insert("Insert into address (streetAddress, personId) 
values(#{streetAddress}, #{personId})")
@Options(useGeneratedKeys = false, flushCache=true)
public Integer saveAddress(Address address);

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 .