Spring Boot con SQLite

1. Panoramica

In questo breve tutorial, esamineremo i passaggi per utilizzare un database SQLite in un'applicazione Spring Boot abilitata per JPA.

Spring Boot supporta alcuni database in memoria ben noti fuori dalla scatola, ma SQLite richiede un po 'di più da noi.

Diamo un'occhiata a cosa ci vuole.

2. Configurazione del progetto

Per la nostra illustrazione, inizieremo con un'app Spring Data Rest che abbiamo utilizzato nei tutorial precedenti.

Nel pom, dobbiamo aggiungere la dipendenza sqllite-jdbc :

 org.xerial sqlite-jdbc 3.25.2 

Questa dipendenza ci fornisce ciò di cui abbiamo bisogno per utilizzare JDBC per comunicare con SQLite. Ma se utilizziamo un ORM, non è sufficiente.

3. Dialetto SQLite

Vedi, Hibernate non viene fornito con un dialetto per SQLite . Dobbiamo crearne uno noi stessi.

3.1. Estensione del dialetto

Il nostro primo passo è estendere la classe org.hibernate.dialect.Dialect per registrare i tipi di dati forniti da SQLite:

public class SQLiteDialect extends Dialect { public SQLiteDialect() { registerColumnType(Types.BIT, "integer"); registerColumnType(Types.TINYINT, "tinyint"); registerColumnType(Types.SMALLINT, "smallint"); registerColumnType(Types.INTEGER, "integer"); // other data types } }

Ce ne sono diversi, quindi controlla sicuramente il codice di esempio per il resto.

Successivamente, dovremo sovrascrivere alcuni comportamenti dialetto predefiniti .

3.2. Supporto colonna identità

Ad esempio, dobbiamo dire a Hibernate come SQLite gestisce le colonne @Id , cosa che possiamo fare con un'implementazione personalizzata di IdentityColumnSupport :

public class SQLiteIdentityColumnSupport extends IdentityColumnSupportImpl { @Override public boolean supportsIdentityColumns() { return true; } @Override public String getIdentitySelectString(String table, String column, int type) throws MappingException { return "select last_insert_rowid()"; } @Override public String getIdentityColumnString(int type) throws MappingException { return "integer"; } }

Per semplificare le cose qui, manteniamo il tipo di colonna Identity solo su Integer . E per ottenere il prossimo valore di identità disponibile, specificheremo il meccanismo appropriato.

Quindi, sovrascriviamo semplicemente il metodo corrispondente nella nostra classe SQLiteDialect in crescita :

@Override public IdentityColumnSupport getIdentityColumnSupport() { return new SQLiteIdentityColumnSupport(); }

3.3. Disabilita la gestione dei vincoli

Inoltre , SQLite non supporta i vincoli del database, quindi dovremo disabilitarli nuovamente sovrascrivendo i metodi appropriati sia per le chiavi primarie che per le chiavi esterne:

@Override public boolean hasAlterTable() { return false; } @Override public boolean dropConstraints() { return false; } @Override public String getDropForeignKeyString() { return ""; } @Override public String getAddForeignKeyConstraintString(String cn, String[] fk, String t, String[] pk, boolean rpk) { return ""; } @Override public String getAddPrimaryKeyConstraintString(String constraintName) { return ""; }

E, tra un momento, saremo in grado di fare riferimento a questo nuovo dialetto nella nostra configurazione Spring Boot.

4. Configurazione DataSource

Inoltre, poiché Spring Boot non fornisce il supporto di configurazione per il database SQLite fuori dalla scatola , dobbiamo anche esporre il nostro bean DataSource :

@Autowired Environment env; @Bean public DataSource dataSource() { final DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName(env.getProperty("driverClassName")); dataSource.setUrl(env.getProperty("url")); dataSource.setUsername(env.getProperty("user")); dataSource.setPassword(env.getProperty("password")); return dataSource; }

Infine, configureremo le seguenti proprietà nel nostro file persistence.properties :

driverClassName=org.sqlite.JDBC url=jdbc:sqlite:memory:myDb?cache=shared username=sa password=sa hibernate.dialect=com.baeldung.dialect.SQLiteDialect hibernate.hbm2ddl.auto=create-drop hibernate.show_sql=true

Si noti che è necessario mantenere la cache condivisa per mantenere gli aggiornamenti del database visibili su più connessioni al database.

Quindi, con le configurazioni di cui sopra, l'app si avvierà e avvierà un database in memoria chiamato myDb , che la restante configurazione Spring Data Rest può occupare.

5. conclusione

In questo articolo, abbiamo preso un esempio di applicazione Spring Data Rest e l'abbiamo puntato su un database SQLite. Tuttavia, per farlo, abbiamo dovuto creare un dialetto Hibernate personalizzato.

Assicurati di controllare l'applicazione su Github. Esegui semplicemente con mvn -Dspring.profiles.active = sqlite spring-boot: esegui e vai a // localhost: 8080 .