在现代的软件开发中,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
首先,移除 H2 数据库的依赖,并添加 SQLite 的依赖:
xml Copy Code
<!-- 添加 SQLite 依赖 -->
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.34.0</version> <!-- 请使用最新版本 -->
</dependency>
在 src/main/resources/application.properties 文件中,配置 SQLite 数据库连接:
properties Copy Code
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
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。
在 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;
}
}
现在你可以创建实体类和相应的 Repository 接口。例如,创建一个简单的 User 实体类:
java Copy Code package com.example.sqlitedemo.model;
import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id;
@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> { }
你可以在你的 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 数据库的操作。
😩抱歉,出了点小问题,请稍后重试