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

目录

前言 

基本介绍

Sqlite 对比 MySQL

字段类型

语法

创建表

插入数据

更新数据

查询数据

删除数据

查看建表语句

Sqlite-JDBC

嵌入到Java程序


前言 

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

基本介绍

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

Sqlite 对比 MySQL

  1. 轻量级:SQLite没有独立的服务器进程,整个数据库管理系统就是一个库文件,非常轻便,可以很方便地嵌入到其他应用程序中。
  2. 快速:SQLite的设计目标是快速读写,它采用了许多优化策略,如内存缓存、页缓存、预编译语句等,可以实现高性能的数据读写操作。
  3. 稳定可靠:SQLite的设计目标是可靠性,它采用了ACID事务模型,能够保证数据的一致性和完整性。
  4. 跨平台:SQLite可以在各种操作系统上运行,包括Windows、Linux、macOS等,同时还支持多种编程语言,如C/C++、Java、Python等。
  5. 简单易用: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

  1. 加载SQLite-JDBC驱动程序:
  2. 连接SQLite数据库:
  3. 进行数据库操作:使用Connection对象进行数据库操作,可以执行SQL语句、查询数据、更新数据等操作。
  4. 关闭资源

下面是简单的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>

不需要配置用户名密码、可直接配置  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/16105.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT能让智能客服更上一层楼么?

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 现实生活中&#xff0c;智能客服的身影已随处可见。 随着全球经济从以产品为主向以服务为主转型&#xff0c;体验经济也快速发展。客户服务逐渐成为一个独立的产业&#xff0c;而客服中心也成为所有企业的基本部门。然而&am…

利用snpEff对基因型VCF文件进行变异注释的详细方法

利用snpEff对VCF文件进行变异注释 群体遗传研究中&#xff0c;在获得SNP位点后,我们需要对SNP位点进行注释&#xff0c;对这些SNP位点进行更深的了解。 snpEff是一个用于对基因组单核苷酸多态性(SNP)进行注释的软件&#xff0c;snpEff软件可以用于对VCF文件进行变异注释&…

Packet Tracer - 配置和验证小型网络

Packet Tracer - 配置和验证小型网络 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 RTA G0/0 10.10.10.1 255.255.255.0 不适用 G0/1 10.10.20.1 255.255.255.0 不适用 SW1 VLAN1 10.10.10.2 255.255.255.0 10.10.10.1 SW2 VLAN1 10.10.20.2 255.25…

基于AI技术的智能考试系统设计与实现(论文+源码)_kaic

摘 要 随着当今世界互联网信息技术的飞速发展&#xff0c;互联网在人们生活中的应用越来越广泛&#xff0c;在线考试成为选拔人才的重要方法。实现一个基于AI技术的智能考试系统&#xff0c;该系统采用Java编程语言实现。通过使用自然语言处理技术和机器学习算法&#xff0c;该…

GPT-3.5 也能直接联网了

ChatGPT 常令人诟病的一个问题&#xff0c;就是它的模型训练数据&#xff0c;迄今为止用的还是 2021 年的老数据。 对于当下这个信息大爆炸时代&#xff0c;相隔两小时&#xff0c;消息都有可能滞后&#xff0c;更别说相隔两年了。 目前正式开放了 Web Browsing 这款插件。 …

力扣刷题2023-04-29-1——题目:1431. 拥有最多糖果的孩子

题目&#xff1a; 给你一个数组 candies 和一个整数 extraCandies &#xff0c;其中 candies[i] 代表第 i 个孩子拥有的糖果数目。 对每一个孩子&#xff0c;检查是否存在一种方案&#xff0c;将额外的 extraCandies 个糖果分配给孩子们之后&#xff0c;此孩子有 最多 的糖果…

PostgreSQL16中pg_dump的LZ4和ZSTD压缩

PostgreSQL16中pg_dump的LZ4和ZSTD压缩 pg_dump压缩lz4和zstd LZ4和ZSTD压缩算法合入了PG16。LZ4补丁的作者是Georgios Kokolatos。由Tomas Vondra提交。由Michael Paquier、Rachel Heaton、Justin Pryzby、Shi Yu 和 Tomas Vondra 审阅。提交消息是&#xff1a; Expand pg_dum…

开箱即用的ChatGPT替代模型,还可训练自己数据

一、普遍关注是什么&#xff1f; OpenAI 是第一个在该领域取得重大进展的公司&#xff0c;并且使围绕其服务构建抽象变得更加容易。然而&#xff0c;便利性带来了集中化、通过中介的成本、数据隐私和版权问题。 而数据主权和治理是这些新的LLM服务提供商如何处理商业秘密或敏…

VS Code C++ 输出窗口中文乱码问题解决

VS Code C 输出窗口中文乱码问题解决 系统cmd终端乱码 的情况&#xff1a;原因解决方法&#xff1a;&#xff08;仅针对cmd终端输出的情况&#xff09;方法一&#xff1a;更改代码文件的编码方法二 &#xff1a;更改cmd默认终端的编码方式 系统cmd终端乱码 的情况&#xff1a; …

Go官方指南(五)并发

Go 程 Go 程&#xff08;goroutine&#xff09;是由 Go 运行时管理的轻量级线程。 go f(x, y, z) 会启动一个新的 Go 程并执行 f(x, y, z) f, x, y 和 z 的求值发生在当前的 Go 程中&#xff0c;而 f 的执行发生在新的 Go 程中。 Go 程在相同的地址空间中运行&#xff0c…

HTML学习笔记一

目录 HTML学习笔记 一、HTML标签 1、HTML语法规范 1.1标签的语法概述 1.2标签关系 2、HTML基本结构标签 2.1第一个HTML 2.2基本结构标签总结 3、开发工具 4、HTML常用标签 4.1标签的语义 4.2标题标签 4.3段落和换行标签 4.4文本格式化标签 4.5div和span标签 4.…

光缆线路网的组网结构是怎样的

1 引言 根据GB 51158-2015《通信线路工程设计规范》&#xff0c;通信线路网包括长途线路、本地线路和接入线路&#xff0c;如图1所示。 图1 通信线路网的组成 根据传输媒质的不同&#xff0c;通信线路分为光缆线路和电缆线路。通信线路也经历了从架空明线到电缆线路再到光缆线路…

WRF模式的移植、运行、后处理及在多领域的应用

1、WRF模式的各个组成部分&#xff1b; 2、自主完成该模式的移植&#xff1b;3、自主完成模式运行&#xff1b; 4、自主完成模式后处理&#xff1b;5、通过多领域案例分析、实践&#xff0c;熟悉在多领域中的应用。 随着生态文明建设和“碳中和”战略的持续推进&#xff0c;我…

探索深度学习世界:掌握PyTorch,成为AI领域的行家

探索深度学习世界&#xff1a;掌握PyTorch&#xff0c;成为AI领域的行家 PyTorch的背景介绍PyTorch的基本概念与特点PyTorch的基本应用张量和自动求导神经网络搭建训练和测试模型 模型的保存和加载模型保存&#xff1a;模型加载&#xff1a;模型使用&#xff1a; PyTorch与其他…

前端开发在本地开发与后台进行联调阶段时,接口自动重定向https、HSTS 与 307 状态码

开发者在本地开发与后台进行联调阶段时&#xff0c;Chrome 浏览器上出现 307 状态码&#xff0c;并跳转到 https 版 但是 307 代码是什么含义呢&#xff1f;页面又为何会出现 307 状态码呢&#xff1f;我之前都没见过这个状态码&#xff0c;查了才知道原来它也是一种重定向。 …

C++-FFmpeg-8-(1)基本概念与原理-rtsp-I、P、B 帧-DTS、PTS-

目录 1.rtsp是什么&#xff1f; 2. I、P、B 帧 3.DTS、PTS 4.rtsp协议抓包分析&#xff1f; 1.rtsp是什么&#xff1f; 流程&#xff1a; 鉴权&#xff1a; 2种 &#xff1a;basice64 Digest 哈希值 哈希值不可逆。nonce 做的单项散列&#xff08;MD5,SHA512&#xff0…

【AI工具】bing chat 使用--三种模式+撰写功能

bing chat:三种模式撰写功能 以下为点击复制后粘贴的内容 Bing Chat提供三种对话模式可选择&#xff1a;创造力、平衡和精确。更多创造力&#xff08;Creative&#xff09;&#xff1a;Bing Chat回答的内容将带有更多语气和情绪&#xff0c;更像一个真实的人类与用户对话。更多…

HTML(三) -- 表单设计

目录 1. 基本语法 2. 表单控件 2.1 input控件 input 常用属性&#xff1a; input type的表单项&#xff1a; 2.2 select 控件 2.3 textarea控件 2.4 label 控件 为什么需要表单&#xff1f; 在我们网页中&#xff0c; 无论是提交搜索的信息&#xff0c;还是网上注…

前端web3入门脚本五:decode input data

一、前言 作为一个前端&#xff0c;在调用合约调试的时候&#xff0c;在区块浏览器里拿到一串 hex 格式的 input data&#xff0c;我们应该怎么decode呢&#xff1f; 二、举例 解码交易需要拥有 对应合约的 abi 以及 input data 下面举例介绍怎么获得这两个信息&#xff1a; 参…

python中snap-stanford指导手册(主要用于做图网络)

文章目录 RequirementSnap操作手册Basic TypesVector TypesHash Table TypesPair TypesGraph and Networks Types&#xff08;graph和network类型&#xff09;Node and Edge Operation Requirement 需要提前安装用于操作图网络的snap库&#xff0c;这个库中有很多现成的图数据…