利用 SQLite 实现 Spring Boot 项目

发表时间: 2021-07-04 19:24

1. 概述

在本快速教程中,我们将逐步介绍在支持 JPA 的 Spring Boot 应用程序中使用 SQLite 数据库的步骤。

Spring Boot 支持一些众所周知的内存数据库开箱即用,但 SQLite 对我们的要求更多。

让我们来看看它需要什么。

2. 项目设置

对于我们的说明,我们将从过去教程中使用过的 Spring Data Rest 应用程序开始。

在pom中,我们需要添加sqllite-jdbc依赖:

<dependency>    <groupId>org.xerial</groupId>    <artifactId>sqlite-jdbc</artifactId>    <version>3.25.2</version></dependency>

这种依赖为我们提供了使用 JDBC 与 SQLite 通信所需的东西。但是,如果我们要使用 ORM,这还不够。

3.SQLite方言

看,Hibernate 没有附带SQLite的方言。我们需要自己创造一个。

3.1. 扩展方言

我们的第一步是扩展org.hibernate.dialect.Dialect类来注册 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    }}

有几个,所以一定要查看示例代码以了解其余部分。

接下来,我们需要覆盖一些默认的方言行为。

3.2. 身份列支持

例如,我们需要告诉 Hibernate SQLite 如何处理@Id,我们可以通过自定义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";    }}

为了简单起见,让我们将标识列类型保留为仅整数。为了获得下一个可用的标识值,我们将指定适当的机制。

然后,我们只需覆盖不断增长的SQLiteDialect类中的相应方法:

@Overridepublic IdentityColumnSupport getIdentityColumnSupport() {    return new SQLiteIdentityColumnSupport();}

3.3. 禁用约束处理

而且,SQLite 不支持数据库约束,因此我们需要通过再次覆盖主键和外键的适当方法来禁用它们

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

而且,稍后,我们将能够在我们的 Spring Boot 配置中引用这个新方言。

4. 数据源配置

另外,由于Spring Boot没有为 SQLite 数据库提供开箱即用的配置支持,我们还需要公开我们自己的DataSource bean:

@Autowired Environment env;@Beanpublic 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.JDBCurl=jdbc:sqlite:memory:myDb?cache=sharedusername=sapassword=sahibernate.dialect=com.baeldung.dialect.SQLiteDialecthibernate.hbm2ddl.auto=create-drophibernate.show_sql=true

请注意,我们需要将缓存保持为共享状态,以便在多个数据库连接之间保持数据库更新可见。

因此,通过上述配置,应用程序将启动并启动一个名为myDb的内存数据库,其余的 Spring Data Rest 配置可以使用该数据库

5. 结论

在本文中,我们采用了一个示例 Spring Data Rest 应用程序并将其指向一个 SQLite 数据库。但是,为此,我们必须创建自定义的 Hibernate 方言。

请务必在 Github 上查看该应用程序。只需运行mvn -Dspring.profiles.active=sqlite spring-boot:run并浏览到http://localhost:8080