Spring Boot met SQLite

1. Overzicht

In deze korte tutorial gaan we door de stappen om een ​​SQLite-database te gebruiken in een JPA-enabled Spring Boot-applicatie.

Spring Boot ondersteunt standaard enkele bekende in-memory databases, maar SQLite vereist iets meer van ons.

Laten we eens kijken wat er nodig is.

2. Projectconfiguratie

Ter illustratie, we beginnen met een Spring Data Rest-app die we in eerdere tutorials hebben gebruikt.

In de pom moeten we de sqllite-jdbc afhankelijkheid:

 org.xerial sqlite-jdbc 3.25.2 

Deze afhankelijkheid geeft ons wat we nodig hebben om JDBC te gebruiken om te communiceren met SQLite. Maar, als we een ORM gaan gebruiken, is dat niet genoeg.

3. SQLite-dialect

Zien, Hibernate wordt niet geleverd met een Dialect voor SQLite. We moeten er zelf een maken.

3.1. Verlengend Dialect

Onze eerste stap is om uit te breiden org.hibernate.dialect.Dialect class om de gegevenstypen van SQLite te registreren:

openbare klasse SQLiteDialect breidt Dialect uit {openbare SQLiteDialect () {registerColumnType (Types.BIT, "integer"); registerColumnType (Types.TINYINT, "tinyint"); registerColumnType (Types.SMALLINT, "smallint"); registerColumnType (Types.INTEGER, "integer"); // andere gegevenstypen}}

Er zijn er meerdere, dus bekijk zeker de voorbeeldcode voor de rest.

Vervolgens moeten we een aantal standaardinstellingen overschrijven Dialect gedrag.

3.2. Ondersteuning voor identiteitskolommen

Bijvoorbeeld, we moeten Hibernate vertellen hoe SQLite omgaat @ID kaart kolommen, wat we kunnen doen met een gewoonte IdentityColumnSupport implementatie:

openbare klasse SQLiteIdentityColumnSupport breidt IdentityColumnSupportImpl uit {@Override openbare boolean supportsIdentityColumns () {return true; } @Override public String getIdentitySelectString (String-tabel, String-kolom, int-type) gooit MappingException {return "select last_insert_rowid ()"; } @Override public String getIdentityColumnString (int type) gooit MappingException {return "integer"; }}

Om het hier eenvoudig te houden, laten we het identiteitskolomtype op Geheel getal enkel en alleen. En om de volgende beschikbare identiteitswaarde te krijgen, specificeren we het juiste mechanisme.

Dan overschrijven we gewoon de overeenkomstige methode in onze kweek SQLiteDialect klasse:

@Override openbare IdentityColumnSupport getIdentityColumnSupport () {retourneer nieuwe SQLiteIdentityColumnSupport (); }

3.3. Schakel het afhandelen van beperkingen uit

En, SQLite heeft geen ondersteuning voor de databasebeperkingen, dus we zullen deze moeten uitschakelen door opnieuw de juiste methoden voor zowel primaire als externe sleutels te overschrijven:

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

En straks kunnen we naar dit nieuwe dialect verwijzen in onze Spring Boot-configuratie.

4. Databron Configuratie

Ook sinds Spring Boot biedt geen configuratie-ondersteuning voor SQLite-database uit de doos, we moeten ook die van onszelf blootleggen Databron Boon:

@Autowired Environment env; @Bean openbare DataSource dataSource () {laatste DriverManagerDataSource dataSource = nieuwe DriverManagerDataSource (); dataSource.setDriverClassName (env.getProperty ("driverClassName")); dataSource.setUrl (env.getProperty ("url")); dataSource.setUsername (env.getProperty ("gebruiker")); dataSource.setPassword (env.getProperty ("wachtwoord")); retourneer dataSource; }

En tot slot zullen we de volgende eigenschappen configureren in onze persistence.properties het dossier:

driverClassName = org.sqlite.JDBC url = jdbc: sqlite: geheugen: myDb? cache = gedeelde gebruikersnaam = sa wachtwoord = sa hibernate.dialect = com.baeldung.dialect.SQLiteDialect hibernate.hbm2ddl.auto = create-drop hibernate.show_sql = waar

Merk op dat we de cache moeten behouden als gedeeld om de database-updates zichtbaar te houden over meerdere databaseverbindingen.

Dus met de bovenstaande configuraties zal de app starten en een in-memory database genaamd myDb, die de resterende Spring Data Rest-configuratie kan innemen.

5. Conclusie

In dit artikel hebben we een Spring Data Rest-voorbeeldtoepassing genomen en deze op een SQLite-database gericht. Om dit te doen, moesten we echter een aangepast Hibernate-dialect maken.

Zorg ervoor dat je de applicatie op Github bekijkt. Ren gewoon mee mvn -Dspring.profiles.active = sqlite spring-boot: run en blader naar // localhost: 8080.