Um framework de persistência semi-automático baseado em ORM.
ORM (Object-Relational Mapping): Mapeamento Objeto-Relacional, estabelece uma correspondência entre objetos Java e o modelo relacional do banco de dados.
Característica semi-automática: Desenvolvedor escreve manualmente as instruções SQL. Fornece mapeamento de entrada e saída, facilitando a configuração de parâmetros SQL e encapsulamento de resultados.
Camada de persistência: Dados que podem ser salvos permanentemente no disco, neste contexto referindo-se às operações com banco de dados.
Hibernate: Solução totalmente automática onde apenas a definição do mapeamento ORM é necessária para realizar operações CRUD.
Passos Básicos
- Criação do arquivo de configuração global
- Desenvolvimento do arquivo de mapeamento do mapper
- Carregamento do arquivo de configuração global para gerar o SqlSessionFactory
- Criação de SqlSession e invocação das instruções SQL do mapper para executar operações CRUD
Exemplo Prático
Criação do Banco de Dados
Projeto Maven
Dependências Maven
<dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.10</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> <scope>provided</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> </dependencies>
Classe POJO com base na tabela do banco
import lombok.*;
@Getter @Setter @NoArgsConstructor @AllArgsConstructor @ToString public class Aluno {
private Integer id;
private String nome;
private Integer nota;
private Integer idade;
private Integer genero;
}
Arquivo de mapeamento do mapper (SQL)
<!-- AlunoMapper.xml --> <?xml version="1.0" encoding="UTF-8" ?>
<mapper namespace="escola"> <select id="buscarTodos" resultType="com.escola.modelo.Aluno"> SELECT * FROM aluno; </select>
<insert id="inserir" parameterType="com.escola.modelo.Aluno"> INSERT INTO aluno (nome,nota,idade,genero) VALUES (#{nome},#{nota},#{idade},#{genero}); </insert>
<delete id="remover" parameterType="int"> DELETE FROM aluno WHERE id = #{id}; </delete> </mapper>
Arquivo de propriedades da fonte de dados
jdbc.url=jdbc:mysql://192.168.183.129:3306/escola?characterEncoding=utf8
jdbc.usuario=root
jdbc.senha=root
jdbc.driver=com.mysql.jdbc.Driver
Arquivo de configuração global (principalmente configuração da fonte de dados)
<?xml version="1.0" encoding="UTF-8" ?>
<configuration> <properties resource="db.properties"/>
<environments default="desenvolvimento"> <environment id="desenvolvimento"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.usuario}"/> <property name="password" value="${jdbc.senha}"/> </dataSource> </environment> </environments>
<mappers> <mapper resource="AlunoMapper.xml"/> </mappers> </configuration>
Classe DAO
Testes
Notas Importantes:
- Desenvolva o arquivo mapper.xml com as instruções SQL, definindo claramente os parâmetros de entrada e saída
- Crie o arquivo de configuração global com informações da fonte de dados e dos arquivos mapper.xml a serem carregados
- Utilize o arquivo de configuração global para criar uma instância de SqlSessionFactory
- Para cada operação CRUD, crie um SqlSession a partir do SqlSessionFactory
- Utilize métodos como selectOne, selectList, insert, delete, update no SqlSession, passando o ID da etiqueta SQL do mapper.xml e os parâmetros de entrada
- A ordem dos elementos no arquivo de configuração global deve seguir esta sequência (pois o MyBatis carrega o arquivo nesta ordem):
<configuration> <!-- Configuração de propriedades --> <!-- Geralmente, informações da fonte de dados são colocadas em um arquivo properties separado, que é importado aqui. Nos elementos environment, pode-se usar o placeholder ${} para obter rapidamente informações da fonte de dados -->
<settings> <!-- Utilizado para ativar ou desativar características do MyBatis. Por exemplo, <setting name="lazyLoadingEnabled" value="true"/> ativa carregamento preguiçoso, e <setting name="cacheEnabled" value="true"/> ativa cache de segundo nível --> </settings>
<typeAliases> <!-- Nos arquivos mapper.xml, é necessário usar os atributos parameterType e resultType para configurar os tipos de parâmetro de entrada e saída da instrução SQL. A classe deve ser especificada com seu nome completo, por exemplo, se um SQL mapeia o resultado para a classe Aluno, o atributo resultType deve ser com.escola.modelo.Aluno, o que é longo. Portanto, aliases podem ser usados para simplificar --> </typeAliases>
<typeHandlers> <!-- Responsável pela conversão entre tipos Java e tipos JDBC. O MyBatis possui muitos TypeHandlers embtuidos, como StringTypeHandler, que lida com o tipo Java String e os tipos JDBC CHAR e VARCHAR. Este elemento é pouco utilizado --> </typeHandlers>
<objectFactory> <!-- O MyBatis cria instâncias de objetos com base nos atributos resultType ou resultMap para encapsular os resultados da consulta. Ele tem um DefaultObjectFactory padrão para criar instâncias de objetos. Este elemento também é pouco utilizado --> </objectFactory>
<plugins> <!-- Pode ser usado para configurar plugins do MyBatis. Por exemplo, no desenvolvimento, frequentemente é necessário paginar resultados de consultas, o que requer o plugin de paginação PageHelper. Esses plugins são configurados através deste elemento. Na camada inferior do MyBatis, o padrão de cadeia de responsabilidade + proxy dinâmico é usado para implementar a funcionalidade dos plugins --> </plugins>
<environments> <!-- Utilizado para configurar a fonte de dados -->
<environment> <transactionManager> </transactionManager> <dataSource> </dataSource> </environment> </environments>
<mappers> <!-- Configura arquivos de mapeamento mapper.xml, que contêm instruções SQL --> </mappers> </configuration>
Mapeamento de Aliases
Motivação: Os valores de parameterType e resultType exigem o nome totalmente qualificado da classe, o que é inconveniente. Deseja-se usar nomes curtos para substituir nomes totalmente qualificados de classes.
Limpeza de Tabela
truncate nome_tabela;
Estratégias de Carregamento
Carregamento Eager (precoce): Ao acessar o objeto principal e suas propriedades, não apenas o objeto principal (informações do banco de dados) é carregado, mas também os objetos associados são carregados simultaneamente.
Carregamento Lazy (preguiçoso): Ao acessar as propriedades do objeto principal, apenas o objeto principal é carregado. Apenas quando as propriedades do objeto associado são acessadas, o objeto associado é carregado.
Configuração de subconsultas no arquivo de mapeamento
fetchType="eager" - Não suporta carregamento preguiçoso fetchType="lazy" - Suporta carregamento preguiçoso