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

1. Введение

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

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

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

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

 org.mybatis mybatis 3.4.4 

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

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("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", [email protected](select = "getAddresses")) })

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

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

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

  • @MapKey - используется для преобразования списка записей в карту записей с ключом, определенныматрибутом значения :
    @Select("select * from Person") @MapKey("personId") Map 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.