在现代的软件开发中,Spring Boot 已成为构建 Java 应用程序的热门框架之一。其简洁的配置、快速的开发周期以及对各种数据库的支持,使得开发者能够高效地创建稳定的应用程序。SQLite 作为一种轻量级的嵌入式数据库,常用于开发、测试和小型应用程序。本文将介绍如何在 Spring Boot 项目中使用 SQLite 数据库。

环境准备 JDK: 确保你的系统上安装了 JDK 8 或更高版本。 Maven/Gradle: 你需要一个构建工具来管理项目依赖。 IDE: 例如 IntelliJ IDEA 或 Eclipse,用于开发。 创建 Spring Boot 项目

你可以通过 Spring Initializr 网站(https://start.spring.io/)快速生成一个 Spring Boot 项目。选择以下配置:

Project: Maven Project Language: Java Spring Boot: 最新版本 Project Metadata: Group: com.example Artifact: sqlite-demo Name: sqlite-demo Description: Demo project for Spring Boot with SQLite Package name: com.example.sqlitedemo Dependencies: Spring Web Spring Data JPA H2 Database(先选择这个,之后我们会替换为 SQLite)

生成项目后,解压并导入到你的 IDE 中。

替换 H2 为 SQLite

  1. 修改 pom.xml

首先,移除 H2 数据库的依赖,并添加 SQLite 的依赖:

xml Copy Code

<!-- 添加 SQLite 依赖 -->
<dependency>
    <groupId>org.xerial</groupId>
    <artifactId>sqlite-jdbc</artifactId>
    <version>3.34.0</version> <!-- 请使用最新版本 -->
</dependency>
  1. 配置 application.properties

在 src/main/resources/application.properties 文件中,配置 SQLite 数据库连接:

properties Copy Code

SQLite 数据库配置

spring.datasource.url=jdbc:sqlite:src/main/resources/db/test.db spring.datasource.driver-class-name=org.sqlite.JDBC spring.datasource.username= spring.datasource.password= spring.jpa.database-platform=com.example.sqlitedemo.config.SQLiteDialect

JPA/Hibernate 配置

spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.SQLiteDialect

注意:SQLiteDialect 类是我们需要自定义的,因为 Spring Data JPA 默认不支持 SQLite。

  1. 自定义 SQLiteDialect

在 src/main/java/com/example/sqlitedemo/config 目录下创建一个新的 Java 类 SQLiteDialect:

java Copy Code package com.example.sqlitedemo.config;

import org.hibernate.dialect.Dialect; import org.hibernate.dialect.function.StandardSQLFunction; import org.hibernate.dialect.function.SQLFunctionTemplate; import org.hibernate.type.StandardBasicTypes;

public class SQLiteDialect extends Dialect {

public SQLiteDialect() {
    registerColumnType(Types.BIT, "integer");
    registerColumnType(Types.TINYINT, "integer");
    registerColumnType(Types.SMALLINT, "integer");
    registerColumnType(Types.INTEGER, "integer");
    registerColumnType(Types.BIGINT, "integer");
    registerColumnType(Types.FLOAT, "real");
    registerColumnType(Types.DOUBLE, "double");
    registerColumnType(Types.DECIMAL, "decimal");
    registerColumnType(Types.NUMERIC, "numeric");
    registerColumnType(Types.CHAR, "char");
    registerColumnType(Types.VARCHAR, "varchar");
    registerColumnType(Types.CLOB, "clob");
    registerColumnType(Types.BLOB, "blob");
    registerColumnType(Types.DATE, "date");
    registerColumnType(Types.TIME, "time");
    registerColumnType(Types.TIMESTAMP, "timestamp");

    registerFunction("concat", new StandardSQLFunction("||", StandardBasicTypes.STRING));
    registerFunction("mod", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "?1 % ?2"));
    registerFunction("substr", new SQLFunctionTemplate(StandardBasicTypes.STRING, "substr(?1, ?2, ?3)"));
    
    // 添加其他自定义函数,如有需要
}

@Override
public String getNativeIdentifierGeneratorStrategy() {
    return "native";
}

@Override
public boolean supportsIdentityColumns() {
    return true;
}

@Override
public boolean hasDataTypeInIdentityColumn() {
    return true;
}

@Override
public String getIdentityColumnString() {
    return "integer PRIMARY KEY AUTOINCREMENT";
}

@Override
public String getIdentitySelectString() {
    return "SELECT last_insert_rowid()";
}

@Override
public boolean supportsLimit() {
    return true;
}

@Override
public boolean supportsLimitOffset() {
    return true;
}

@Override
public boolean bindLimitParametersInReverseOrder() {
    return true;
}

@Override
public boolean supportsTemporaryTables() {
    return true;
}

@Override
public String getDropTemporaryTableString() {
    return "DROP TABLE IF EXISTS";
}

@Override
public boolean dropTemporaryTableAfterUse() {
    return true;
}

@Override
public boolean supportsCurrentTimestampSelection() {
    return true;
}

@Override
public boolean isCurrentTimestampSupported() {
    return true;
}

@Override
public String getCurrentTimestampSQL() {
    return "CURRENT_TIMESTAMP";
}

@Override
public boolean supportsUnionAll() {
    return true;
}

@Override
public boolean hasAlterTable() {
    return false; // SQLite has limited ALTER TABLE support
}

@Override
public boolean dropConstraints() {
    return false;
}

}

  1. 创建实体类和 Repository

现在你可以创建实体类和相应的 Repository 接口。例如,创建一个简单的 User 实体类:

java Copy Code package com.example.sqlitedemo.model;

import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import ;

@Entity public class User {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String name;
private String email;

// Getters and Setters

}

创建 UserRepository 接口:

java Copy Code package com.example.sqlitedemo.repository;

import com.example.sqlitedemo.model.User; import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> { }

  1. 使用数据库

你可以在你的 Service 或 Controller 中注入 UserRepository 并进行数据库操作。

java Copy Code package com.example.sqlitedemo.service;

import com.example.sqlitedemo.model.User; import com.example.sqlitedemo.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;

import java.util.List;

@Service public class UserService {

@Autowired
private UserRepository userRepository;

public List<User> getAllUsers() {
    return userRepository.findAll();
}

public User saveUser(User user) {
    return userRepository.save(user);
}

}

测试

启动你的 Spring Boot 应用程序,并访问你定义的 API 端点来测试对 SQLite 数据库的操作。

😩抱歉,出了点小问题,请稍后重试