【五一创作】嵌入式Sqlite数据库【基本语法、Sqlite-JDBC、嵌入到Java程序】

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介: 最近在用JavaFX做一个桌面软件需要用到数据库,但MySQL这种数据库明显只能本地访问,把软件移植到别的电脑上就不能运行了,即使能够嵌入到程序中也太大了(MySQL8.x占用内存大约700MB)。所以,嵌入式轻量级的数据库应运而生,但这种轻量级数据库不只有Sqlite,还有H2数据库等,但网上资料比较少,Sqlite用的人可能更多。

前言

       最近在用JavaFX做一个桌面软件需要用到数据库,但MySQL这种数据库明显只能本地访问,把软件移植到别的电脑上就不能运行了,即使能够嵌入到程序中也太大了(MySQL8.x占用内存大约700MB)。所以,嵌入式轻量级的数据库应运而生,但这种轻量级数据库不只有Sqlite,还有H2数据库等,但网上资料比较少,Sqlite用的人可能更多。


基本介绍

SQLite是一种轻量级的关系型数据库管理系统,它以库文件的形式存储数据,没有独立的服务器进程或配置需求,可以在各种操作系统(包括Windows、Linux、macOS等)上运行。SQLite的设计目标是嵌入式数据库,它占用资源少、体积小、速度快,常用于移动设备、嵌入式设备等场景。


Sqlite 对比 MySQL

轻量级:SQLite没有独立的服务器进程,整个数据库管理系统就是一个库文件,非常轻便,可以很方便地嵌入到其他应用程序中。

快速:SQLite的设计目标是快速读写,它采用了许多优化策略,如内存缓存、页缓存、预编译语句等,可以实现高性能的数据读写操作。

稳定可靠:SQLite的设计目标是可靠性,它采用了ACID事务模型,能够保证数据的一致性和完整性。

跨平台:SQLite可以在各种操作系统上运行,包括Windows、Linux、macOS等,同时还支持多种编程语言,如C/C++、Java、Python等。

简单易用:SQLite的语法类似于标准的SQL语法,易于学习和使用,同时还提供了多种API和命令行工具,方便用户进行数据库操作。

此外,Mysql是支持多线程操作(多读多写)的,但是Sqlite是单线程的(仅允许一个线程进行写操作,但允许多个线程进行读操作)。所以用Sqlite数据库就会深刻理解JDBC中关闭资源(ResultSet、Connection、Statement)的重要性,因为只要你的代码中有多个地方需要与数据库交互,如果资源未关闭,就会报错 'database is locked...'


字段类型

NULL:空值

INTEGER:整型

REAL:浮点型

TEXT:文本

BLOB:二进制数据

语法

Sqlite的语法与MySQL基本一致,所以有MySQL的基础很容易上手。


创建表

CREATE TABLE student(
                    id integer primary key autoincrement ,
                    student_id text not null ,
                    name text not null ,
                    sex text not null
);


插入数据

INSERT INTO student (student_id,name,sex)

VALUES ('2023001','燕双鹰','男');


更新数据

UPDATE student

SET student='2023002', name='李大喜',

WHERE name='燕双鹰';


查询数据

-- 查询满足条件的记录

SELECT *

FROM student

WHERE name = '李大喜';

-- 查询所有记录

SELECT * FROM student;


删除数据

DELETE FROM student

WHERE id = 1;

查看建表语句

-- 查看sqlite数据库中student表的建表语句

SELECT sql FROM sqlite_master WHERE type='table' AND name='student';

Sqlite-JDBC

加载SQLite-JDBC驱动程序:

连接SQLite数据库:

进行数据库操作:使用Connection对象进行数据库操作,可以执行SQL语句、查询数据、更新数据等操作。

关闭资源

下面是简单的Sqlite工具类:


public class DBUtils {
    private static Connection con = null;
    private static PreparedStatement stm = null;
    private static Statement stmt = null;
    private static ResultSet rs = null;
    /**
     * 获取数据库连接对象
     * @return 连接
     * @throws Exception 异常
     */
    public static Connection getConnection() throws Exception{
        //通过反射加载驱动
        Class.forName("org.sqlite.JDBC");
        con = DriverManager.getConnection("jdbc:sqlite:test.db");
        return con;
    }
    /**
     * 执行SQL语句
     * @param sql sql语句
     * @return 返回查询结果集
     */
    public static ResultSet executeQuery(String sql){
        // SQLite连接串,指向本地的test.db文件
        try {
            // 建立连接
            con = getConnection();
            // 创建Statement对象
            stmt = con.createStatement();
            // 执行SELECT语句
            rs = stmt.executeQuery(sql);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return rs;
    }
    /**
     * 执行增删改操作
     * @param sql SQL语句
     * @param params 参数数组
     * @return 返回操作的表的行数
     */
    public static int executeUpdate(String sql,String[] params){
//        DBUtils.close();
        int count = 0;
        try {
            con = getConnection();
            stm = con.prepareStatement(sql);
            for (int i = 0; i < params.length; i++) {
                stm.setString(i+1,params[i]);
            }
            count = stm.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            close();
        }
        return count;
    }
    /**
     * 执行增删改操作
     * @param sql SQL语句
     * @param params 参数数组
     * @return 返回操作的表的行数
     */
    public static int executeUpdate(String sql,String[] params,byte[] face_feature){
        int count = 0;
        try {
            con = getConnection();
            stm = con.prepareStatement(sql);
            for (int i = 0; i < params.length; i++) {
                stm.setString((i+1),params[i]);
            }
            stm.setBytes(7,face_feature);//默认第7个参数位置是特征值
            count = stm.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            close();
        }
        return count;
    }
    /**
     * 关闭所有资源
     */
    public static void close(){
        if (rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (stm!=null){
            try {
                stm.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (stmt!=null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (con!=null){
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}


嵌入到Java程序

不需要下载Sqlite数据库到本地,只需要安装sqlite的jar包到java项目

<!-- https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc -->
        <dependency>
            <groupId>org.xerial</groupId>
            <artifactId>sqlite-jdbc</artifactId>
            <version>3.41.2.1</version>
        </dependency>

image.png

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
4月前
|
SQL Java 数据库连接
除了JDBC,还有哪些常见的数据库访问技术?
除了JDBC,还有哪些常见的数据库访问技术?
416 2
|
5月前
|
SQL Oracle 关系型数据库
Oracle数据库创建表空间和索引的SQL语法示例
以上SQL语法提供了一种标准方式去组织Oracle数据库内部结构,并且通过合理使用可以显著改善查询速度及整体性能。需要注意,在实际应用过程当中应该根据具体业务需求、系统资源状况以及预期目标去合理规划并调整参数设置以达到最佳效果。
406 8
|
5月前
|
存储 数据库 开发者
Python SQLite模块:轻量级数据库的实战指南
本文深入讲解Python内置sqlite3模块的实战应用,涵盖数据库连接、CRUD操作、事务管理、性能优化及高级特性,结合完整案例,助你快速掌握SQLite在小型项目中的高效使用,是Python开发者必备的轻量级数据库指南。
479 0
|
9月前
|
存储 JSON 数据格式
什么情况,一夜之间冲上热搜,狂揽29.6k星,再见吧SQLite!这个嵌入式分析引擎实在太香了
DuckDB是一款嵌入式OLAP数据库,专为高效分析型查询设计,被誉为“分析型SQLite”。它采用列式存储和向量化查询引擎,显著提升分析任务性能。无需独立服务器,支持Python、R、Java等语言,安装简单,5分钟即可上手。DuckDB可直接查询CSV、JSON、Parquet文件,支持Pandas零拷贝交互,优化SQL语法简化复杂查询。适用于探索性数据分析、数据湖ETL流水线及边缘设备实时分析等场景,是数据科学家和开发者的理想工具。项目地址:https://github.com/duckdb/duckdb
1027 4
|
10月前
|
SQL 数据库连接 数据库
在C++的QT框架中实现SQLite数据库的连接与操作
以上就是在C++的QT框架中实现SQLite数据库的连接与操作的基本步骤。这些步骤包括创建数据库连接、执行SQL命令、处理查询结果和关闭数据库连接。在实际使用中,你可能需要根据具体的需求来修改这些代码。
640 14
|
11月前
|
SQL Java 中间件
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
在BeetISQL 2.13.8版本中,客户使用batch insert向yashandb表插入数据并尝试获取自动生成的sequence id时,出现类型转换异常。原因是beetlsql在prepareStatement时未指定返回列,导致yashan JDBC驱动返回rowid(字符串),与Java Bean中的数字类型tid不匹配。此问题影响业务流程,使无法正确获取sequence id。解决方法包括:1) 在batchInsert时不返回自动生成的sequence id;2) 升级至BeetISQL 3,其已修正该问题。
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
|
11月前
|
SQL druid Oracle
【YashanDB知识库】yasdb jdbc驱动集成druid连接池,业务(java)日志中有token IDENTIFIER start异常
客户Java日志中出现异常,影响Druid的merge SQL功能(将SQL字面量替换为绑定变量以统计性能),但不影响正常业务流程。原因是Druid在merge SQL时传入null作为dbType,导致无法解析递归查询中的`start`关键字。
|
Java 数据库连接 数据库
springboot java.lang.ClassNotFoundException: dm.jdbc.driver.DmDriver应该如何解决
通过上述步骤,可以有效解决Spring Boot项目中遇到的 `java.lang.ClassNotFoundException: dm.jdbc.driver.DmDriver`问题。确保在项目中正确添加达梦数据库的JDBC驱动依赖,并在配置文件中正确配置数据源信息,是解决此问题的关键。通过这些方法,可以确保Spring Boot项目能够正确连接达梦数据库并正常运行。
2421 31
|
11月前
|
SQL Java 数据库连接
【YashanDB数据库】由于网络带宽不足导致的jdbc向yashandb插入数据慢
由于网络带宽不足导致的jdbc向yashandb插入数据慢
|
SQL Java 关系型数据库
使用 JDBC 实现 Java 数据库操作
JDBC(Java Database Connectivity)是 Java 提供的数据库访问技术,允许通过 SQL 语句与数据库交互。本文详细介绍了 JDBC 的使用方法,包括环境准备、编程步骤和完整示例。
1121 7