Кратко ръководство за MyBatis

1. Въведение

MyBatis е рамка за постоянство с отворен код, която опростява внедряването на достъп до база данни в Java приложения. Осигурява поддръжка за потребителски SQL, съхранени процедури и различни видове връзки за картографиране.

Най-просто казано, това е алтернатива на JDBC и Hibernate.

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

За да използваме MyBatis, трябва да добавим зависимостта към нашия pom.xml:

 org.mybatis mybatis 3.4.4 

Най-новата версия на зависимостта може да бъде намерена тук.

3. Java API

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. Картографи

Mappers са интерфейси на 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);
  • @ Резултати - това е списък с картографиране на резултатите, които съдържат подробности за това как колоните на базата данни се преобразуват в атрибутите на класа 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 е методът, който връща колекцията от адреси чрез заявка към таблица с адреси.

    @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

Dynamic 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(); } }

Dynamic 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.