Spring Boot mit SQLite

1. Übersicht

In diesem kurzen Tutorial werden die Schritte zur Verwendung einer SQLite-Datenbank in einer JPA-fähigen Spring Boot-Anwendung beschrieben.

Spring Boot unterstützt sofort einige bekannte In-Memory-Datenbanken, aber SQLite verlangt von uns etwas mehr.

Werfen wir einen Blick darauf, was es braucht.

2. Projekteinrichtung

Zur Veranschaulichung beginnen wir mit einer Spring Data Rest-App, die wir in früheren Tutorials verwendet haben.

Im pom müssen wir die sqllite-jdbc- Abhängigkeit hinzufügen :

 org.xerial sqlite-jdbc 3.25.2 

Diese Abhängigkeit gibt uns das, was wir brauchen, um JDBC für die Kommunikation mit SQLite zu verwenden. Aber wenn wir ein ORM verwenden, reicht das nicht aus.

3. SQLite-Dialekt

Der Ruhezustand wird nicht mit einem Dialekt für SQLite ausgeliefert . Wir müssen selbst einen schaffen.

3.1. Erweitern von Dialect

Unser erster Schritt besteht darin, die Klasse org.hibernate.dialect.Dialect zu erweitern , um die von SQLite bereitgestellten Datentypen zu registrieren:

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 } }

Es gibt mehrere, sehen Sie sich also auf jeden Fall den Beispielcode für den Rest an.

Als nächstes müssen wir einige Standard- Dialektverhalten überschreiben .

3.2. Unterstützung für Identitätsspalten

Zum Beispiel müssen wir Hibernate mitteilen, wie SQLite mit @ ID- Spalten umgeht , was mit einer benutzerdefinierten IdentityColumnSupport- Implementierung möglich ist:

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"; } }

Um die Dinge hier einfach zu halten, lassen wir den Identitätsspaltentyp nur auf Integer . Um den nächsten verfügbaren Identitätswert zu erhalten, geben wir den entsprechenden Mechanismus an.

Dann überschreiben wir einfach die entsprechende Methode in unserer wachsenden SQLiteDialect- Klasse:

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

3.3. Deaktivieren Sie die Behandlung von Einschränkungen

Und SQLite hat keine Unterstützung für die Datenbankbeschränkungen, so dass wir diejenigen deaktivieren müssen durch erneutes Überschreiben der entsprechenden Methoden für Primär- und Fremdschlüssel:

@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 ""; }

Und in Kürze können wir diesen neuen Dialekt in unserer Spring Boot-Konfiguration referenzieren.

4. DataSource- Konfiguration

Da Spring Boot keine sofort einsatzbereite Konfigurationsunterstützung für SQLite-Datenbanken bietet, müssen wir auch unsere eigene DataSource- Bean verfügbar machen :

@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; }

Und schließlich konfigurieren wir die folgenden Eigenschaften in unserer Datei 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

Beachten Sie, dass der Cache wie freigegeben bleiben muss, damit die Datenbankaktualisierungen über mehrere Datenbankverbindungen hinweg sichtbar bleiben.

Mit den oben genannten Konfigurationen startet die App und startet eine In-Memory-Datenbank namens myDb , die die verbleibende Spring Data Rest-Konfiguration belegen kann.

5. Schlussfolgerung

In diesem Artikel haben wir eine Beispielanwendung für Spring Data Rest genommen und auf eine SQLite-Datenbank verwiesen. Dazu mussten wir jedoch einen benutzerdefinierten Hibernate-Dialekt erstellen.

Stellen Sie sicher, dass Sie die Anwendung auf Github überprüfen. Führen Sie einfach mit mvn -Dspring.profiles.active = sqlite spring-boot: run aus und navigieren Sie zu // localhost: 8080 .