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.