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

news2024/11/25 2:58:52

目录

前言 

基本介绍

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>

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

gdb server简单探索

前言 gdb server运行于嵌入式设备&#xff0c;比如arm或arm64体系结构&#xff0c;体积小&#xff0c;占用资源少&#xff0c;相当于一个前端。gdb server可以attach到一个strip的进程。 gdb运行于性能更高的主机&#xff0c;如x86设备上&#xff0c;需要有带符号表的相应进程…

【IPv6】基本概念及字段

IPV4知识点&#xff1a; 字段值 IPv4字段共 字段值解释Version版本版本字段&#xff0c;可以区分V4和V6版本&#xff0c;V4是0100&#xff0c;V6是0110&#xff0c;需要注意的是V4和V6头部除了版本字段位置相同外&#xff0c;其他都是不一样的&#xff0c;因此两个协议不能直…

如何编写高质量代码

如何编写高质量代码 1. 前言2. 明确业务场景和用户需求3. 编程实践技巧3.1 提高命名规范3.2 保持代码简洁3.3 好的注释 4. 软件测试5. 总结 1. 前言 现代软件开发中&#xff0c;代码是构建高质量软件的核心。高质量代码能够提高软件系统的可靠性、可维护性和可扩展性&#xff…

3.3 动态存储随机存储器

学习目标&#xff1a; 理解动态随机存取存储器的基本原理和工作机制。掌握动态随机存取存储器的读写操作及时序。理解动态随机存取存储器的存储单元结构和电路设计。熟悉动态随机存取存储器的刷新技术及其影响因素。理解动态随机存取存储器与静态随机存取存储器的异同。掌握动态…

2008-2019年主要城市PITI指数

2008-2019年主要城市PITI指数 1、来源&#xff1a;附在文件内 2、时间区间&#xff1a;2008-2019年 3、具体时间分布&#xff1a;、2008、2009-2010、2011、2012、2013-2014、2014-2015、2015-2016、2016-2017、2017-2018、2018-2019、 4、范围&#xff1a;包括110个城市&a…

Runtime Data Area(运行时数据区域)

运行时数据区是JVM用来管理和存储Java程序执行过程中所需要的各种数据的区域&#xff0c;也成为JVM内存结构。JVM内存结构主要包括以下几个部分&#xff1a; 程序计数器&#xff08;Program Counter Register&#xff09; 程序计数器是一种特殊的内存区域&#xff0c;它可以在…

线索二叉树(前中后序线索化/遍历/画线索)

线索二叉树 文章目录 线索二叉树1 线索二叉树的基本概念2 线索二叉树的构造2.1 线索二叉树的存储结构2.2 给线索二叉树画线索2.2.1 中序2.2.2 先序2.2.3 后序 2.3 二叉树线索化代码实现2.3.1 通过中序遍历线索化2.3.2 通过先序遍历线索化2.3.3 通过后序遍历线索化 3 线索二叉树…

五一欢乐赛!题解

前言 有点一言难尽, 这次本来想的给大火减减压放了很多区域赛和省赛的签到题(还有一些是写过的题), 没想到打的并不是很理想, 还用了分数值想减少一些差距, 结果看起来好像让差距更大了, 尴尬 A题 Frozen Scoreboard https://codeforces.com/gym/104076/problem/D 济南站的中…

【MST+离线】ABC235 E - MST + 1

一开始想的是分类讨论&#xff0c;看那条边加了之后成不成环&#xff0c;如果不成环且权值在前n-1&#xff0c;则一定在MST里&#xff0c;不在前n-1则不在MST里&#xff1b;如果成环了&#xff0c;如果权值不在前n-1&#xff0c;则不在MST里&#xff0c;如果权值在前n-1&#x…

InstructGPT怎么准备和标记数据集

目录 1. 谁标记数据集 2. 数据集的来源 3.数据预处理 4. 标记数据集的方法 5. 数据多样性 6. 这样标记的数据的不足之处 名词解释 1. 谁标记数据集 OpenAI 公司在Upwork平台上和Scale AI公司聘请了大约 40 名承包商为他们标记数据&#xff0c;通过筛选测试(screening tes…

ros基础笔记

1创建工作空间 catkin_init_workspace 将文件夹初始化成ros文件 编译工作空间catkin_make vi ~/.bashrc 加入环境变量bashrc一下在任何终端都生效 catkin_create_pkg learning_communication通讯机制 std_msgs数据结构 rospy roscpp catkin_create_pkg mbot_description ur…

【C++】string类常用接口

目录 一、string类二、string类的常用接口1.string类对象的常见构造2.string类对象的容量操作3.string类对象的访问及遍历操作4.string类对象的修改操作5.string类非成员函数6.vs和g下string结构的说明 一、string类 STL的六大组件&#xff1a; 字符串是表示字符序列的类标准…

E. Train Hard, Win Easy(数学推导 + 前缀和)

Problem - E - Codeforces 这是一个有关竞赛编程的问题。Zibi 是一名竞赛编程教练&#xff0c;有 n 名选手想要备战。培训比赛具有一些不同寻常的规则——每个团队有两名成员和两个问题&#xff0c;每个选手都会编写其中一个问题的代码。当然&#xff0c;一个团队中的人将编写不…

ViveNAS - 一个基于LSM tree的文件存储实现 (一)

1. ViveNAS &#xff08;GitHub - cocalele/ViveNAS&#xff09; ViveNAS 是一个开源分布式的网络文件系统&#xff08;NAS&#xff09;, 具有下面的特点: - 通过不同存储介质的结合&#xff0c;在高性能、低成本间寻找动态的平衡 - 解决数据的长期、低成本存储问题&#xff…

JVM-0428

执行引擎 执行引擎做什么的 执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念&#xff0c;这两种机器都有代码执行能力&#xff0c;其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的&#xff0c;而虚拟机的执行引…

java基础入门-03

Java基础入门-03 10、字符串10.1.API10.1.1API概述10.1.2如何使用API帮助文档 10.2.String类10.2.1 String类概述10.2.2 String类的特点10.2.3 String类的构造方法10.2.4 创建字符串对象两种方式的区别10.2.5 字符串的比较10.2.5.1 号的作用10.2.5.2 equals方法的作用 10.2.6 用…

java web会话管理

在人机交互过程中&#xff0c;会话管理是指保持用户的整个会话活动的交互与计算机系统跟踪的过程。会话管理分为桌面会话管理、浏览器会话管理、Web会话管理。本书讨论的是Web会话管理(通常指的是session以及Cookie) &#xff0c; 也称为会话跟踪。 会话管理基本原理 使用隐藏…

机器学习笔记 图像特征提取器(卷积变体)的技术发展与演变

一、图像特征提取器简述 图像特征提取器是可用于从图像中学习表示的函数或模块。最常见的特征提取器类型是卷积,其中内核在图像上滑动,允许参数共享和平移不变性。 在深度学习技术的快速发展过程中,基于卷积也演变出来了若干新技术由于图像特征的提取,这里进行了一下简单梳…

[oeasy]python0145_版本控制_git_备份还原

git版本控制 回忆上次内容 上次我们了解了 try 的完全体 try 尝试运行 except 发现异常时运行的代码块 else 没有发现异常时运行的代码块 finally 无论是否发现异常最终都要运行的代码块 发现导入部分 可以再分为两个子模块一个输入 a一个输入 b 可以再拆分么&#xff1f;&…

【Python基础练习100题--第一篇:文件篇】

前言 这些题都是在B站的练习题&#xff0c;链接在这 对于刚学python的新手来说十分的适合&#xff0c; 可以加强和巩固我们的基础。 嘿嘿 一起噶油吧&#xff01;&#x1f349; &#x1f349;1.对学生成绩排序 # 这里对字典进行排序&#xff0c;同事使用到了sorted函数 # 这…