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 *–