[Из песочницы] MyBatis как более быстрая альтернатива Hibernate
В Java сообществе Hibernate framework де-факто считается стандартом для удобной работы с базой данных. Разработчику трудно выбрать другой фреймфорк, потому что порой он не знает о существовании альтернатив. В этой статье я проведу курс молодого бойца по работе с MyBatis framework. Полностью охватить весь framework не получится, но информации будет достаточно, что бы увидеть преимущества и слабые стороны данного framework’а и начать работать с MyBatis.MyBatis не реализует JPA спеки, а является альтернативой JPA. Основное отличие MyBatis от Hibernate — это то как производится мапинг объектов. Hibernate мапит таблицы БД на сущности, давая нам доступ к данным. Для получения данных Hibernate генерирует SQL запросы, а генерируемые запросы хороши до поры — до времени, а потом они съедают кучу времени, становятся громоздкими и не управляемыми. MyBatis мапится не на таблицы, а на SQL запросы, за формирование запросов отвечает разработчик и только от него будет зависеть как быстро будет работать приложение.С преамбулой закончили, теперь можно перейти непосредственно к созданию небольшого проекта с использованием MyBatis, что бы познакомиться с ним поближе. Не буду оригинальным, сделаем пару запросов к БД с использованием MyBatis. В примере буду использовать СУБД MySQL, а вы можете использовать любую другую СУБД, которая вам по душе.
Создадим БД mybatis:
CREATE DATABASE `mybatis`; Создадим таблицы subscriber, tariff, payments: subscriber:
CREATE TABLE `mybatis`.`subscriber` (
`id` INT (10) NOT NULL,
`name` VARCHAR (255) NOT NULL,
`ref_tariff` VARCHAR (10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE = MYISAM
tariff:
CREATE TABLE `mybatis`.`tariff` (
`id` INT (10) NOT NULL,
`descr` VARCHAR (255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE = MYISAM
payments:
CREATE TABLE `mybatis`.`payments` (
`id` INT (10) NOT NULL,
`ref_subscriber` INT (10) NOT NULL,
`summa` INT (10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE = MYISAM
Самое скучное позади — у нас есть БД, из которой мы будем получать данные, теперь приступим непосредственно к работе с MyBatis. Для начала нам необходима библиотека MyBatis. Для получения библиотеки мы будем использовать maven, необходимо добавить зависимость в настройки проекта (pom.xml):
Ниже приведен листинг конфигурационного файла:
Создадим интерфейс kz.jazzsoft.mapper.SubscriberMapper:
package kz.jazzsoft.mapper;
import kz.jazzsoft.dal.Subscriber;
public interface SubscriberMapper {
Subscriber getSubscriberById (Integer id);
List getSubscriber ();
} В данном интерфейсе мы определили два метода:1. getSubscriberById — вернет одного пользователя по id;
2. getSubscriber — вернет список пользователей;
Но что бы данные методы заработали необходимо создать xml маппер с sql запросами.
package kz.jazzsoft.dal;
import java.util.List;
public class Subscriber {
private Long id;
private String name;
private Tariff tariff;
private List
package kz.jazzsoft;
import kz.jazzsoft.mapper.SubscriberMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.Reader;
public class Work {
public static void main (String[] args) {
SqlSessionFactory sqlSessionFactory;
SubscriberMapper subscriberMapper;
Reader reader = null;
try {
reader = Resources
.getResourceAsReader («mybatis-config.xml»); //Читаем файл с настройками подключения и настройками MyBatis
sqlSessionFactory = new SqlSessionFactoryBuilder ().build (reader);
subscriberMapper = sqlSessionFactory.openSession ().getMapper (SubscriberMapper.class); //Создаем маппер, из которого и будем вызывать методы getSubscriberById и getSubscribers
List
package kz.jazzsoft.dal;
public class Tariff {
private Long id;
private String descr;
public Long getId () {
return id;
}
public void setId (Long id) {
this.id = id;
}
public String getDescr () {
return descr;
}
public void setDescr (String descr) {
this.descr = descr;
}
}
Создаем интерфейс мапера TariffMapper, нам понадобится только один метод:
package kz.jazzsoft.mapper;
import kz.jazzsoft.dal.Tariff;
public interface TariffMapper {
Tariff getTariffById (Integer id);
}
Создаем мапер:
Добавим к Абоненту (Subscriber) список его платежей (Payments)(one-to-many):
Для начала необходимо создать EntityBean Payment:
package kz.jazzsoft.dal;
public class Payment {
private Long id;
private Integer summa;
public Long getId () {
return id;
}
public void setId (Long id) {
this.id = id;
}
public Integer getSumma () {
return discount;
}
public void getSumma (Integer summa) {
this.summa = summa;
}
}
Теперь необходимо создать интерфейс мапера PaymentMapper, он будет простой. Только один метод получения списка платежей по id пользователя.
package kz.jazzsoft.mapper;
import kz.jazzsoft.dal.Payment;
import java.util.List;
public interface PaymentMapper {
List
Для динамического формирования SQL запросов в арсенале MyBatis имеется достаточно компонентов для решения большинства задач. Рассматривать все мы не будем, так как их достаточно много и их можно комбинировать и тп. Для примера расмотрим IF оператор, больше информации можно прочитать в официальном руководстве: mybatis.github.io/mybatis-3/dynamic-sql.html
IF Оператор:
В запросе приведенном выше выполняется проверка, на то что объект в Map по ключу descr не null, тогда в запрос будет добавлена строка в блоке if и таких блоков может быть сколько угодно, они могу быть вложенными.
Не существует одного универсального решения, которое подошло бы всем, в каждом выборе нужен четкий расчет. MyBatis можно использовать совместно с Hibernate там где это действительно нужно, а это сможете определить только вы.