Spring Boot avec SQLite

1. Vue d'ensemble

Dans ce tutoriel rapide, nous allons passer par les étapes pour utiliser une base de données SQLite dans une application Spring Boot compatible JPA.

Spring Boot prend en charge quelques bases de données en mémoire bien connues, mais SQLite nécessite un peu plus de notre part.

Jetons un coup d'œil à ce qu'il faut.

2. Configuration du projet

Pour notre illustration, nous allons commencer avec une application Spring Data Rest que nous avons utilisée dans les tutoriels précédents.

Dans le pom, nous devons ajouter la dépendance sqllite-jdbc :

 org.xerial sqlite-jdbc 3.25.2 

Cette dépendance nous donne ce dont nous avons besoin pour utiliser JDBC pour communiquer avec SQLite. Mais si nous allons utiliser un ORM, ce n'est pas suffisant.

3. Dialecte SQLite

Voir, Hibernate n'est pas livré avec un Dialect pour SQLite . Nous devons en créer un nous-mêmes.

3.1. Extension du dialecte

Notre première étape consiste à étendre la classe org.hibernate.dialect.Dialect pour enregistrer les types de données fournis par 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 } }

Il y en a plusieurs, alors jetez un œil à l'exemple de code pour le reste.

Ensuite, nous devrons remplacer certains comportements par défaut de Dialect .

3.2. Prise en charge de la colonne d'identité

Par exemple, nous devons indiquer à Hibernate comment SQLite gère les colonnes @Id , ce que nous pouvons faire avec une implémentation IdentityColumnSupport personnalisée :

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

Pour garder les choses simples ici, gardons le type de colonne d'identité sur Integer uniquement. Et pour obtenir la prochaine valeur d'identité disponible, nous spécifierons le mécanisme approprié.

Ensuite, nous remplaçons simplement la méthode correspondante dans notre classe SQLiteDialect croissante :

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

3.3. Désactiver la gestion des contraintes

Et, SQLite ne prend pas en charge les contraintes de base de données, nous devrons donc les désactiver en remplaçant à nouveau les méthodes appropriées pour les clés primaires et étrangères:

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

Et, dans un instant, nous pourrons référencer ce nouveau dialecte dans notre configuration Spring Boot.

4. Configuration de la source de données

De plus, étant donné que Spring Boot ne fournit pas de prise en charge de la configuration de la base de données SQLite prête à l'emploi , nous devons également exposer notre propre 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; }

Et enfin, nous allons configurer les propriétés suivantes dans notre fichier 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

Notez que nous devons garder le cache partagé afin de garder les mises à jour de la base de données visibles sur plusieurs connexions de base de données.

Ainsi, avec les configurations ci-dessus, l'application démarrera et lancera une base de données en mémoire appelée myDb , que la configuration restante de Spring Data Rest peut prendre.

5. Conclusion

Dans cet article, nous avons pris un exemple d'application Spring Data Rest et l'avons pointé vers une base de données SQLite. Cependant, pour ce faire, nous avons dû créer un dialecte Hibernate personnalisé.

Assurez-vous de vérifier l'application sur Github. Exécutez simplement avec mvn -Dspring.profiles.active = sqlite spring-boot: run et accédez à // localhost: 8080 .