Guia rápido do MyBatis

Guia rápido do MyBatis

*1. Introdução *

MyBatis é uma estrutura de persistência de código aberto que simplifica a implementação do acesso ao banco de dados em aplicativos Java. Ele fornece suporte para SQL personalizado, procedimentos armazenados e diferentes tipos de relações de mapeamento.

Simplificando, é uma alternativa ao JDBC e Hibernate.

===* 2. Dependências do Maven *

Para usar o MyBatis, precisamos adicionar a dependência ao nosso _pom.xml: _

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.4</version>
</dependency>

A versão mais recente da dependência pode ser encontrada aqui.

===* 3. APIs Java *

====* 3.1 SQLSessionFactory *

SQLSessionFactory é a classe principal de todos os aplicativos MyBatis. Esta classe é instanciada usando o método builder () _ de __SQLSessionFactoryBuilder ' que carrega um arquivo XML de configuração:

String resource = "mybatis-config.xml";
InputStream inputStream Resources.getResourceAsStream(resource);
SQLSessionFactory sqlSessionFactory
  = new SqlSessionFactoryBuilder().build(inputStream);

O arquivo de configuração Java inclui configurações como definição da fonte de dados, detalhes do gerenciador de transações e uma lista de mapeadores que definem relações entre entidades, que juntos são usados ​​para criar a instância 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 contém métodos para executar operações de banco de dados, obter mapeadores e gerenciar transações. Ele pode ser instanciado da classe SQLSessionFactory. Instâncias desta classe não são seguras para threads.

Após executar a operação do banco de dados, a sessão deve ser fechada. Como SqlSession implementa a interface AutoCloseable, podemos usar o bloco try-with-resources:

try(SqlSession session = sqlSessionFactory.openSession()) {
   //do work
}

===* 4. Mapeadores *

Mapeadores são interfaces Java que mapeiam métodos para as instruções SQL correspondentes. MyBatis fornece anotações para definir operações do banco de dados:

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. Anotações MyBatis

Vamos ver algumas das principais anotações fornecidas pelo MyBatis:

*_* @ Insert, @Select, @Update, @ Delete * –_ essas anotações representam instruções SQL a serem executadas chamando métodos anotados:
@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_ - é uma lista de mapeamentos de resultados que contêm os detalhes de como as colunas do banco de dados são mapeadas para os atributos da classe Java:

@Select("Select personId, name from Person where personId=#{personId}")
@Results(value = {
  @Result(property = "personId", column = "personId")
   //...
})
public Person getPersonById(Integer personId);
  • _ @ Result_ - representa uma única instância de Result da lista de resultados recuperados de @Results. Inclui detalhes como mapeamento da coluna do banco de dados para a propriedade Java bean, tipo Java da propriedade e também a associação com outros objetos 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 * –_ especifica um mapeamento de um objeto para uma coleção dos outros objetos:
@Results(value ={
  @Result(property = "addresses", javaType = List.class,
    column = "personId",
    [email protected](select = "getAddresses"))
})

+ Aqui getAddresses é o método que retorna a coleção de Address consultando a tabela de endereços.

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

+ Semelhante à anotação _ @ Many_, temos a anotação _ @ One_ que especifica o relacionamento de mapeamento um para um entre os objetos. @ MapKey *–