Spring Boot с SQLite
1. обзор
В этом кратком руководстве мы рассмотрим шаги по использованию базы данныхSQLite в приложении Spring Boot с поддержкой JPA.
Spring Bootsupports a few well known in-memory databases из коробки, но SQLite требует от нас немного большего.
Давайте посмотрим, что для этого нужно.
2. Настройка проекта
Для нашей иллюстрацииwe’ll start with a Spring Data Rest app we’ve used in past tutorials.
В pom нам нужно добавить зависимостьsqllite-jdbc:
org.xerial
sqlite-jdbc
3.25.2
Эта зависимость дает нам то, что нам нужно для использованияJDBC для связи с SQLite. Но,if we are going to use an ORM, it’s not enough.
3. SQLite Диалект
Смотрите,Hibernate doesn’t ship with a Dialect for SQLite. Нам нужно создать его самим.
3.1. РасширениеDialect
Наш первый шаг - расширить классorg.hibernate.dialect.Dialect, чтобы зарегистрироватьdata types, предоставляемые 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
}
}
Их несколько, поэтому обязательно ознакомьтесь с примером кода для остальных.
Затем нам нужно будет переопределить поведениеDialect по умолчанию.
3.2. Поддержка столбцов идентификации
Например,we need to tell Hibernate how SQLite handles @Id columns, что мы можем сделать с помощью специальной реализации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";
}
}
Для простоты оставим тип столбца идентификаторов толькоInteger. И чтобы получить следующее доступное значение идентификатора, мы укажем соответствующий механизм.
Затем мы просто переопределяем соответствующий метод в нашем растущем классеSQLiteDialect:
@Override
public IdentityColumnSupport getIdentityColumnSupport() {
return new SQLiteIdentityColumnSupport();
}
3.3. Отключить обработку ограничений
ИSQLite doesn’t have support for the database constraints, so we’ll need to disable those, снова переопределив соответствующие методы как для первичного, так и для внешнего ключей:
@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 "";
}
И через мгновение мы сможем сослаться на этот новый диалект в нашей конфигурации Spring Boot.
4. DataSource Конфигурация
Кроме того, посколькуSpring Boot doesn’t provide configuration support for SQLite database out of the box, нам также необходимо предоставить наш собственный 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;
}
И, наконец, мы настроим следующие свойства в нашем файлеpersistence.properties:
driverClassName=org.sqlite.JDBC
url=jdbc:sqlite:memory:myDb?cache=shared
username=sa
password=sa
hibernate.dialect=com.example.dialect.SQLiteDialect
hibernate.hbm2ddl.auto=create-drop
hibernate.show_sql=true
Обратите внимание, что нам нужно сохранить кеш какshared, чтобы обновления базы данных были видны при нескольких подключениях к базе данных.
So, with the above configurations, the app will start and will launch an in-memory database called myDb, которую может занять оставшаяся конфигурацияSpring Data Rest.
5. Заключение
В этой статье мы взяли пример приложения Spring Data Rest и направили его на базу данных SQLite. Однако для этого нам пришлось создать собственный диалект Hibernate.
Обязательно проверьте приложениеover on Github. Просто запустите сmvn -Dspring.profiles.active=sqlite spring-boot:run и перейдите кhttp://localhost:8080.