O SQLite é um motor de banco de dados relacional compacto, amplamente reconhecido por sua arquitetura serverless e conformidade com ACID. Diferente de sistemas tradicionais como MySQL ou PostgreSQL, o SQLite é encapsulado em uma biblioteca C e armazena os dados em um único arquivo local, o que o torna ideal para aplicações embarcadsa, prototipagem rápida e softwares que demandam baixo consumo de recursos de hardware.
Dependências Necessárias
Para habilitar o suporte ao SQLite em um projeto Spring Boot moderno (utilizando Hibenrate 6+), é necessário incluir o driver JDBC específico e o módulo de dialetos da comunidade do Hibernate, além do starter básico do Spring Data JPA.
<!-- Driver JDBC para SQLite -->
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
</dependency>
<!-- Dialeto SQLite para Hibernate 6+ -->
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-community-dialects</artifactId>
</dependency>
<!-- Spring Data JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Configuração do Application YAML
A configuração abaixo define o caminho do arquivo de banco de dados e instrui o Hibernate a utilizar o dialeto correto para gerar as consultas SQL compatíveis com a sintaxe do SQLite.
app:
db-name: storage.db
spring:
datasource:
url: jdbc:sqlite:${app.db-name}
driver-class-name: org.sqlite.JDBC
jpa:
database-platform: org.hibernate.community.dialect.SQLiteDialect
hibernate:
ddl-auto: update
show-sql: true
properties:
hibernate:
format_sql: true
Definição da Camada de Modelo (Entity)
Abaixo, apresentamos uma implementação de entidade JPA. Neste exemplo, simulamos um sistema de gerenciamento de dispositivos de rede.
@Entity
@Table(name = "tb_dispositivo")
public class Dispositivo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, unique = true)
private String numeroSerie;
private String modelo;
private String enderecoIp;
private String usuarioAcesso;
private String senhaAcesso;
private Integer statusOperacional;
// Getters e Setters
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getNumeroSerie() { return numeroSerie; }
public void setNumeroSerie(String numeroSerie) { this.numeroSerie = numeroSerie; }
public String getModelo() { return modelo; }
public void setModelo(String modelo) { this.modelo = modelo; }
public String getEnderecoIp() { return enderecoIp; }
public void setEnderecoIp(String enderecoIp) { this.enderecoIp = enderecoIp; }
public String getUsuarioAcesso() { return usuarioAcesso; }
public void setUsuarioAcesso(String usuarioAcesso) { this.usuarioAcesso = usuarioAcesso; }
public String getSenhaAcesso() { return senhaAcesso; }
public void setSenhaAcesso(String senhaAcesso) { this.senhaAcesso = senhaAcesso; }
public Integer getStatusOperacional() { return statusOperacional; }
public void setStatusOperacional(Integer statusOperacional) { this.statusOperacional = statusOperacional; }
}
Camada de Acesso a Dados (Repository)
A interface de repositório estende JpaRepository, permitindo operações de CRUD padrão e a definição de consultas customizadas através de convenções de nomenclatura.
@Repository
public interface DispositivoRepository extends JpaRepository<Dispositivo, Long> {
/**
* Busca um dispositivo específico através do seu número de série.
* @param numeroSerie Identificador único do hardware
* @return Optional contendo o dispositivo se encontrado
*/
Optional<Dispositivo> findByNumeroSerie(String numeroSerie);
/**
* Lista dispositivos filtrando pelo status de operação.
*/
List<Dispositivo> findByStatusOperacional(Integer status);
}
Ao iniciar a aplicação, o Hibernate verificará a existência do arquivo definido na URL de conexão. Caso o arquivo não exista, ele será criado automaticamente, e as tabelas serão geradas com base nas anotações das entidades, graças à propriedade ddl-auto: update.