目录
SQLite + Spring Boot + JdbcTemplate
SQLite 数据库概述
1、SQLite 是一个 C 语言库,它实现了一个小型、快速、独立、高可靠性、功能齐全、开源的关系型嵌入式 SQL 数据库引擎。SQLite 是世界上使用最广泛的数据库引擎。SQLite 内置于所有手机和大多数计算机中,并捆绑在人们每天使用的无数其他应用程序中。
2、SQLite 文件格式是稳定的、跨平台的和向后兼容的,开发人员承诺在 2050 年之前保持这种状态。SQLite 数据库文件通常用作容器,在系统之间传输丰富的内容,并用作数据的长期存档格式 。有超过 1 万亿 个 SQLite 数据库正在积极使用。
3、SQLite 是一个嵌入式 SQL 数据库引擎。与大多数其他 SQL 数据库不同,SQLite 没有单独的服务器进程。SQLite 直接读取和写入普通磁盘文件。具有多个表、索引、触发器和视图的完整 SQL 数据库包含在单个磁盘文件中。
4、SQLite 遵循 SQL 标准的大部分基本语法和功能,如数据定义语言(DDL)、数据操纵语言(DML)、数据查询语言(DQL)等,所以大多数场景下使用跟其他数据库语法基本一致,比如 Mysql。
5、某些极端情况下可能会导致 DB 文件损坏,比如断电、文件系统异常、硬件问题等,解决办法是:定期备份 -> 备份恢复。
官网:SQLite Home Page。
优势 & 特性
-
轻量级:SQLite 不需要单独的服务器进程或系统资源,数据库存储在一个单一的磁盘文件中,这使得它非常适合于小型应用和移动设备。
-
无需配置:SQLite 不需要复杂的安装和配置过程,可以很容易地集成到各种应用程序中。比如 Java 只需要在 pom.xml 引入依赖即可使用。
-
嵌入式:SQLite 是一个嵌入式的库,不作为一个独立的服务运行,而是直接嵌入到应用程序中。
-
事务性:支持 ACID 事务,确保数据的一致性和完整性。
-
零配置:无需运行数据库服务器或进行复杂的配置,SQLite 数据库文件可以被多个进程共享访问。
-
适合嵌入式系统:由于其轻量级和简单性,SQLite 经常用于嵌入式系统和移动应用。
应用场景
-
移动应用:移动应用通常需要一个轻量级的数据库来存储本地数据,SQLite 因其小体积和无需服务器的特性非常适合
-
桌面应用:需要本地数据库存储的桌面应用
-
嵌入式系统:嵌入式系统和物联网设备
-
独立应用:不需要网络数据库连接的独立应用
-
轻量级 Web 应用:不需要复杂事务处理或高并发访问的应用
-
边缘计算:边缘设备上运行 SQLite,仅将重要更改同步到云端,可以有效降低网络带宽的使用,并提高数据处理的实时性
不适合场景
-
高并发应用:SQLite 不适合需要高并发写入操作的应用场景
-
分布式系统:SQLite 是一个文件基的数据库,不适合分布式系统或需要跨多个服务器共享数据库的场景
-
复杂的事务处理:SQLite 处理复杂的事务业务相对其他数据库较弱
-
需要数据库高级功能:如存储过程等,不支持
-
多用户实时协作:类似并发操作
SQLite 数据库常见语法
src/main/resources/static/sql/SQLite.sql · 汪少棠/sqliteapp3 - Gitee.com。
客户端工具
Navicat Premium(推荐)
1、Navicat Premium 默认支持对 SQLite 的连接,因为 SQLite 不需要安装,一个文件就是一个数据库,所以操作非常简单,存在 .db 文件时直接连接即可,不存在时,直接手动或者自动创建文件。
2、Win 10 安装 Navicat 11、16 客户端。
sqlite-tools
1、官网下载地址:SQLite Download Page。
2、这是官网用于管理 SQLite 数据库文件的一组命令行工具, 包括 (1) sqlite3.exe 命令行 shell,(2) sqldiff.exe, (3) sqlite3_analyzer.exe,以及 (4) sqlite3_rsync.exe 64 位。
3、下载 sqlite-tools-win-x64-3480000.zip,然后解压如下。
4、为方便后续使用这个工具,可以将此目录配置到系统环境变量 path 中。如下所示。
5、这样可以在任意目录下使用这些工具,使用非常简单,进入之后,可以使用 .help 查看相关命令,.quit 是退出。
E:\IDEA_Projects\sqliteapp3\data>sqlite3
SQLite version 3.48.0 2025-01-14 11:05:00
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>
6、使用 sqlite3 工具连接数据库文件后即可操作。
E:\IDEA_Projects\sqliteapp3\data>sqlite3 test.db
SQLite version 3.48.0 2025-01-14 11:05:00
Enter ".help" for usage hints.
sqlite> select * from users;
1|张三|30|5600.45|1737198128677|1737198128677
2|Joni|42|7600.45|1837398128677|1837398128677
sqlite> .quit
E:\IDEA_Projects\sqliteapp3\data>
SQLiteStudio
1、SQLiteStudio 是一款专门用于管理和操作 SQLite 数据库的免费工具。它提供直观的图形化界面,简化了数据库的创建、编辑、查询和维护,适合数据库开发者和数据分析师使用。
2、SQLiteStudio 提供的主要功能包括:
- 免费开源,可以用于任何目的,包括商业使用。
- 跨平台支持,包括 Windows、Linux 以及 MacOS X 系统。
- SQL 高级编辑,支持语法高亮、自动补全、历史记录等。
- 跨数据库支持,可以在单个查询中访问多个数据库中的表,通过拖拽方式跨数据库复制表。
- 数据导入导出,支持 CSV、JSON、Excel、SQL 脚本等多种格式。
- 管理加密数据库,包括 SQLCipher、WxSQLite3 以及 System.Data.SQLite。
- 插件扩展,提供插件机制扩展 SQLite 功能,例如 JavaScript、Python 以及 Tcl 脚本创建自定义函数。
- 数据生成,支持各种方式自动填充数据,方便测试。
官方网址:https://sqlitestudio.pl/。
下载地址:https://github.com/pawelsalawa/sqlitestudio/releases。有安装版本,也有解压版本,这里我选择的是解压版。
3、安装或者解压后双击 SQLiteStudio.exe 运行工具,第一次会提示选择语言,选择简体中文即可。添加数据库,一个文件就是一个数据库,可以直接创建数据库,也可以连接已存在的数据库文件。
4、扩展插件的管理可以通过“工具”->“打开配置对话框”菜单打开。【外观】那里可以设置语言。
DBeaver 通用数据库工具
1、DBeaver社区是一个免费的跨平台通用数据库工具,适用于开发人员、数据库管理员、分析师和所有处理数据的人。它支持所有流行的SQL数据库,如MySQL、MariaDB、PostgreSQL、SQLite、Apache Family等。
2、https://wangmaoxiong.blog.youkuaiyun.com/article/details/82659949。
SQLite + JDBC 快速使用
1、因为 SQLite 是嵌入式的,所以和H2数据库一样,都不需要单独安装数据库,而只需要在程序中引入它们的依赖,即可使用。SQLite 的每一个 .db 文件就是一个单独的数据库,可以随意复制粘贴使用。
引入依赖:
<!-- https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc -->
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.48.0.0</version>
</dependency>
pom.xml · 汪少棠/sqliteapp3 - Gitee.com。
操作数据库:
/**
* 原生JDBC-创建表
* http://localhost:8080/sqlite/createTable
*/
@GetMapping("sqlite/createTable")
public ResultData<Object> createTable() {
String url = "jdbc:sqlite:" + db0Path;
try (Connection connection = DriverManager.getConnection(url);
Statement statement = connection.createStatement()) {
String sql = "CREATE TABLE IF NOT EXISTS users (" +
"id INTEGER PRIMARY KEY AUTOINCREMENT, " +
"name TEXT NOT NULL, " +
"age INTEGER NOT NULL, " +
"annual_salary float(18,2) NOT NULL, " +
"create_time INTEGER NOT NULL, " + // 时间类型直接使用数字或者字符串存储
"update_time INTEGER NOT NULL" +
")";
statement.execute(sql);
return ResultData.success("建表成功:" + sql);
} catch (Exception e) {
log.error(ExceptionUtils.getStackTrace(e));
return ResultData.error(ResultCode.FAIL, e);
}
}
src/main/java/com/wmx/sqliteapp3/sqlite/SqliteController.java · 汪少棠/sqliteapp3 - Gitee.com。
SQLite + Spring Boot + JdbcTemplate
1、Spring boot 操作数据库的方式有很多种,比如 JdbcTemplate、Spring Data JPA、Mybatis 等等。无论什么方式,其实都只要在其它数据库的基础上,换一下 pom.xml 里面的依赖,然后修改一下 yml 里面的数据库地址就行。
2、这里以 JdbcTemplate + 默认数据源 HikariDataSource 为例,进行演示。引入依赖。pom.xml · 汪少棠/sqliteapp3 - Gitee.com
<!-- 引入Spring封装的jdbc,内部默认依赖了 HikariDataSource 数据源-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc -->
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.48.0.0</version>
</dependency>
3、配置数据库地址与数据源:src/main/resources/application.yml · 汪少棠/sqliteapp3 - Gitee.com
spring:
datasource:
# jdbc 连接基础配置
# 指定数据库文件地址,一个文件相当于一个数据库,目录必须存在,文件不存在时会自动新建;SQLite不需要配置账号与密码;
url: jdbc:sqlite:E:\sql\sqlite3\test2.db
#url: jdbc:sqlite:${user.home}\test_pm.db # ${user.home} 表示用户的根目录,如 C:\Users\用户名
driver-class-name: org.sqlite.JDBC
4、数据源测试:src/test/java/com/wmx/sqliteapp3/DataSourceTest.java · 汪少棠/sqliteapp3 - Gitee.com。
5、JdbcTemplate 进行CRUD
/**
* JdbcTemplate 是 core 包的核心类,用于简化 JDBC 操作,还能避免一些常见的错误,如忘记关闭数据库连接
* Spring Boot 默认提供了数据源,默认提供了 org.springframework.jdbc.core.JdbcTemplate
* JdbcTemplate 中会自己注入数据源,使用起来也不用再自己来关闭数据库连接
*/
@Resource
private JdbcTemplate jdbcTemplate;
/**
* 新增 iphone 数据
* http://localhost:8080/savePhone
*
* @return
*/
@GetMapping("savePhone")
public ResultData<Object> savePhone() {
String sql = "INSERT INTO iphone(id,name,price,publish_time) VALUES (?,?,?,?)";
Object[] objects = new Object[4];
objects[0] = null;
objects[1] = "大米S" + String.valueOf(System.currentTimeMillis()).substring(10, 12);
objects[2] = 800 + new SecureRandom().nextFloat() * 5000;
objects[3] = DateUtil.date().getTime();
int update = jdbcTemplate.update(sql, objects);
return ResultData.success(update);
}
src/main/java/com/wmx/sqliteapp3/sqlite/PhoneController.java · 汪少棠/sqliteapp3 - Gitee.com。