Sqlite: Java使用、sqlite-devel

news2024/11/22 15:54:27

这里写目录标题

  • 一、简介
  • 二、使用
    • 1. Java项目中
      • (1)引入驱动
      • (2)工具类
      • (3)调用举例
    • 2. sqlite-devel in linux
      • sqlite-devel
      • 使用
  • 三、更多应用
    • 1. 数据类型
    • 2. 如何存储日期和时间
    • 3. 备份

一、简介

  1. 非常轻量级,都没有服务器进程(mysql必须要有mysqld.service 3306)
  2. 一个.db或.sqlite文件就是一个数据库, 非常方便备份和传输,只要复制文件就可以
  • sqlite 是本地数据库,不能远程。安全!
  • SQLite 在任何时刻只允许一个写入操作执行,其他写入操作需要排队
  • 数据库就是一个文件,这个文件可以在任意位置,任意后缀名,建议用.db 或者 .sqlite 作为后缀

二、使用

1. Java项目中

(1)引入驱动

       <dependency>
            <groupId>org.xerial</groupId>
            <artifactId>sqlite-jdbc</artifactId>
            <version>3.8.11.2</version>
        </dependency>

(2)工具类

  • SqlLiteHelper
package sample.common.sqlLite;

import sample.common.utils.LogUtil;

import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;

/**
 * @Author admin
 * @Date 2023/4/4 11:20
 */
public class SqlLiteHelper {
    private Connection connection;
    private Statement statement;
    private ResultSet resultSet;
    private String dbFilePath;   // db文件的位置

    Logger logger = LogUtil.installFormatter(Logger.getLogger(SqlLiteHelper.class.getSimpleName()));

    /**
     * 每次创建都将建立一个连接
     * @param dbFilePath
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public SqlLiteHelper(String dbFilePath) throws ClassNotFoundException, SQLException{
        this.dbFilePath = dbFilePath;
        connection = getConnection(dbFilePath);
    }

    public Connection getConnection(String dbFilePath) throws ClassNotFoundException, SQLException {
        Connection conn = null;
        Class.forName("org.sqlite.JDBC");
        conn = DriverManager.getConnection("jdbc:sqlite:" + dbFilePath);
        return conn;
    }

    private Connection getConnection() throws ClassNotFoundException, SQLException {
        if (null == connection) connection = getConnection(dbFilePath);
        return connection;
    }

    private Statement getStatement() throws SQLException, ClassNotFoundException {
        if (null == statement) statement = getConnection().createStatement();
        return statement;
    }



    /**返回对象**/
    public <T> T executeQuery(String sql, ResultSetExtractor<T> rse) throws SQLException, ClassNotFoundException {
        try {
            resultSet = getStatement().executeQuery(sql);
            T rs = rse.extractData(resultSet);
            return rs;
        } finally {
            destroyed();
        }
    }
    /**返回对象集合**/
    public <T> List<T> executeQuery(String sql, RowMapper<T> rm) throws SQLException, ClassNotFoundException {
        List<T> rsList = new ArrayList<T>();
        try {
            resultSet = getStatement().executeQuery(sql);
            while (resultSet.next()) {
                rsList.add(rm.mapRow(resultSet, resultSet.getRow()));
            }
        } finally {
            destroyed();
        }
        return rsList;
    }

    public <T> List<T> executeQueryList(String sql, Class<T> clazz) throws SQLException, ClassNotFoundException, IllegalAccessException, InstantiationException {
        List<T> rsList = new ArrayList<T>();
        try {
            resultSet = getStatement().executeQuery(sql);
            while (resultSet.next()) {
                T t = clazz.newInstance();
                for (Field field : t.getClass().getDeclaredFields()) {
                    field.setAccessible(true);
                    field.set(t,resultSet.getObject(field.getName()));
                }
                rsList.add(t);
            }
        } finally {
            destroyed();
        }
        return rsList;
    }
    public <T> T executeQuery(String sql, Class<T> clazz) throws SQLException, ClassNotFoundException, IllegalAccessException, InstantiationException {
        try {
            resultSet = getStatement().executeQuery(sql);
            T t = clazz.newInstance();
            for (Field field : t.getClass().getDeclaredFields()) {
                field.setAccessible(true);
                //  ---> 连接断开了
                field.set(t,resultSet.getObject(field.getName()));
            }
            return t;
        } finally {
            destroyed();
        }
    }
    public int count(String sql) throws SQLException, ClassNotFoundException, IllegalAccessException, InstantiationException {
        try {
            resultSet = getStatement().executeQuery(sql);
            if(resultSet.next()){
                return resultSet.getInt(1);
            }
        } finally {
            destroyed();
        }
        return 0;
    }
    /**返回更新成功的条数**/
    public int executeUpdate(String sql) throws SQLException, ClassNotFoundException {
        try {
            int c = getStatement().executeUpdate(sql);
            return c;
        } finally {
            destroyed();
        }
    }
    /**执行多个更新**/
    public void executeUpdate(String...sqls) throws SQLException, ClassNotFoundException {
        try {
            for (String sql : sqls) {
                getStatement().executeUpdate(sql);
            }
        } finally {
            destroyed();
        }
    }
    public void executeUpdate(List<String> sqls) throws SQLException, ClassNotFoundException {
        try {
            for (String sql : sqls) {
                getStatement().executeUpdate(sql);
            }
        } finally {
            destroyed();
        }
    }
    /**数据插入更新**/
    public int executeInsert(String tableName, Map<String,Object> param) throws SQLException, ClassNotFoundException {
        try {
            StringBuffer sql = new StringBuffer();
            sql.append("INSERT INTO ");
            sql.append(tableName);
            sql.append(" ( ");
            for (String key : param.keySet()) {
                sql.append(key);
                sql.append(",");
            }
            sql.delete(sql.length()-1,sql.length());
            sql.append(")  VALUES ( ");
            for (String key : param.keySet()) {
                sql.append("'");
                sql.append(param.get(key));
                sql.append("',");
            }
            sql.delete(sql.length()-1,sql.length());
            sql.append(");");
            int c = getStatement().executeUpdate(sql.toString());
            return c;
        } finally {
            destroyed();
        }

    }

    /**数据库资源关闭和释放**/
    public void destroyed() {
        // 每一次crud都关闭了所有的资源
        try {
            if (null != statement) {
                statement.close();
                statement = null;
            }

            if (null != connection) {
                connection.close();
                connection = null;
            }

            if (null != resultSet) {
                resultSet.close();
                resultSet = null;
            }


        } catch (SQLException e) {
            logger.info("Sqlite数据库关闭时异常"+e.getMessage());
        }
    }


}

  • 结果集实现
package sample.common.sqlLite;

import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * @Author admin
 * @Date 2023/4/4 11:25
 */
public interface RowMapper<T> {
    public abstract T mapRow(ResultSet rs, int index) throws SQLException;
}

package sample.common.sqlLite;

import java.sql.ResultSet;

/**
 * @Author admin
 * @Date 2023/4/4 11:24
 */
public interface ResultSetExtractor<T> {
    public abstract T extractData(ResultSet resulltSet);
}

(3)调用举例

  1. 加载库和表
SqliteHelper sqlLiteHelper = new SqlLiteHelper(dbFilePath);  // 库
String createCard = "create table if not exists card(id integer primary key autoincrement,name text,lastReport text)";
sqlLiteHelper.executeUpdate(createCard); // 建表

2. sqlite-devel in linux

sqlite-devel

centos7.6
https://www.sqlite.org/download.html

yum install sqlite-devel

使用

sqlite 连接不需要用户名和密码

[root@localhost trdp]# sqlite3 trdp.db
SQLite version 3.7.17 2013-05-20 00:56:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .database   
# 输出显示了当前连接的数据库文件路径。
seq  name             file                                                      
---  ---------------  ----------------------------------------------------------
0    main             /usr/local/tynoo/trdp/trdp.db

sqlite> .tables
msgs  port
sqlite> .schema port
CREATE TABLE port
(
    port String
);
sqlite> select * from msgs;
sqlite> insert into port (port) values (null);
sqlite> .quit

三、更多应用

1. 数据类型

https://www.sqlite.net.cn/datatype3.html

2. 如何存储日期和时间

在这里插入图片描述

3. 备份

因为sqlite基于文件存储的特殊特性,
它的备份本质上是这个sqlite_database.db这个文件的备份,尤其是在单用户或低并发场景下,SQLite 3 的数据备份可以通过简单的文件复制cp来实现

但是这里就存在几个问题:
(1)文件 被锁定,比如说正在写入数据
(2)事务不一致,你复制的时候,某个事务正在进行中

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

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

相关文章

MySQL深入:B+树的演化、索引和索引结构

提示&#xff1a;内容是读《MySQL技术内幕&#xff1a;InnoDB存储引擎》&#xff0c;笔记摘要 文章目录 二叉查找树平衡二叉树(AVL) B树(BTree)B树(BTree)InnoDB B树索引索引结构&#xff08;InnoDB B树&#xff09;B树存放的数据量 二叉查找树 在二叉查找树中&#xff0c;左子…

C语言-11-18笔记

1.C语言数据类型 类型存储大小值范围char1 字节-128 到 127 或 0 到 255unsigned char1 字节0 到 255signed char1 字节-128 到 127int2 或 4 字节-32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647unsigned int2 或 4 字节0 到 65,535 或 0 到 4,294,967,295short2 字节…

“乐鑫组件注册表”简介

当启动一个新的开发项目时&#xff0c;开发者们通常会利用库和驱动程序等现有的代码资源。这种做法不仅节省时间&#xff0c;还简化了项目的维护工作。本文将深入探讨乐鑫组件注册表的概念及其核心理念&#xff0c;旨在指导您高效地使用和贡献组件。 概念解析 ESP-IDF 的架构…

【人工智能】PyTorch、TensorFlow 和 Keras 全面解析与对比:深度学习框架的终极指南

文章目录 PyTorch 全面解析2.1 PyTorch 的发展历程2.2 PyTorch 的核心特点2.3 PyTorch 的应用场景 TensorFlow 全面解析3.1 TensorFlow 的发展历程3.2 TensorFlow 的核心特点3.3 TensorFlow 的应用场景 Keras 全面解析4.1 Keras 的发展历程4.2 Keras 的核心特点4.3 Keras 的应用…

Sigrity SPEED2000 TDR TDT Simulation模式如何进行时域阻抗仿真分析操作指导-差分信号

Sigrity SPEED2000 TDR TDT Simulation模式如何进行时域阻抗仿真分析操作指导-差分信号 Sigrity SPEED2000 TDR TDT Simulation模式如何进行时域阻抗仿真分析操作指导-单端信号详细介绍了单端信号如何进行TDR仿真分析,下面介绍如何对差分信号进行TDR分析,还是以下图为例进行分…

Django一分钟:django中收集关联对象关联数据的方法

场景&#xff1a;我有一个模型&#xff0c;被其它多个模型关联&#xff0c;我配置了CASCADE级联删除&#xff0c;我想要告知用户删除该实例之后&#xff0c;哪些关联数据将会被一同删除。 假设我们当前有这样一组模型&#xff1a; class Warehouse(models.Model):""…

Flink学习连载第二篇-使用flink编写WordCount(多种情况演示)

使用Flink编写代码&#xff0c;步骤非常固定&#xff0c;大概分为以下几步&#xff0c;只要牢牢抓住步骤&#xff0c;基本轻松拿下&#xff1a; 1. env-准备环境 2. source-加载数据 3. transformation-数据处理转换 4. sink-数据输出 5. execute-执行 DataStream API开发 //n…

利用开源的低代码表单设计器FcDesigner高效管理和渲染复杂表单结构

FcDesigner 是一个强大的开源低代码表单设计器组件&#xff0c;支持快速拖拽生成表单。提供丰富的自定义及扩展功能&#xff0c;FcDesigner支持多语言环境&#xff0c;并允许开发者进行二次开发。通过将表单设计输出为JSON格式&#xff0c;再通过渲染器进行加载&#xff0c;实现…

【三合黑马指标】指标操盘技术图文教程,三线粘合抓黑马,短线买点持股辅助,通达信炒股软件指标

如上图&#xff0c;副图指标【三合黑马指标】&#xff0c;三条线彩线1-2-3&#xff0c;四条虚线代表四种短线技术做多信号&#xff0c;最底部的凸起形态线短线做多确认信号 。 黑马牛股选股技巧&#xff0c;可以选择周线三线粘合状态&#xff0c;在粘合时选股关注&#xff0c;如…

nwjs崩溃复现、 nwjs-控制台手动操纵、nwjs崩溃调用栈解码、剪切板例子中、nwjs混合模式、xdotool显示nwjs所有进程窗口列表

-1. nwjs在低版本ubuntu运行情况 ubuntu16.04运行nw-v0.93或0.89报错找不到NSS_3.30、GLIBC_2.25 uname -a #Linux Asus 4.15.0-112-generic #113~16.04.1-Ubuntu SMP Fri Jul 10 04:37:08 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux cat /etc/issue #Ubuntu 16.04.7 LTS \n \l…

DICOM图像解析:深入解析DICOM格式文件的高效读取与处理

引言 在医学影像领域,DICOM(Digital Imaging and Communications in Medicine)标准已成为信息交换和存储的核心规范。掌握DICOM文件的读取与解析,对于开发医学影像处理软件至关重要。本文将系统地解析DICOM文件的结构、关键概念,并提供高效的读取与显示方法,旨在为开发者…

npm上传自己封装的插件(vue+vite)

一、npm账号及发包删包等命令 若没有账号&#xff0c;可在npm官网&#xff1a;https://www.npmjs.com/login 进行注册。 在当前项目根目录下打开终端命令窗口&#xff0c;常见命令如下&#xff1a; 1、登录命令&#xff1a;npm login&#xff08;不用每次都重新登录&#xff0…

SpringAOP模拟实现

文章目录 1_底层切点、通知、切面2_切点匹配3_从 Aspect 到 Advisor1_代理创建器2_代理创建时机3_Before 对应的低级通知 4_静态通知调用1_通知调用过程2_模拟 MethodInvocation 5_动态通知调用 1_底层切点、通知、切面 注意点&#xff1a; 底层的切点实现底层的通知实现底层的…

Scala学习记录,全文单词统计

全文单词统计&#xff1a; 可分为以下几个步骤&#xff1a; 1.读取文件&#xff0c;得到很长的字符串 2.把字符串拆分成一个一个的单词 3.统计每个单词出现的次数 4.排序 5.把结果写入到一个文件中 完整代码如下&#xff1a; import java.io.PrintWriter import scala.io.So…

【UE5】使用基元数据对材质传参,从而避免新建材质实例

在项目中&#xff0c;经常会遇到这样的需求&#xff1a;多个模型&#xff08;例如 100 个&#xff09;使用相同的材质&#xff0c;但每个模型需要不同的参数设置&#xff0c;比如不同的颜色或随机种子等。 在这种情况下&#xff0c;创建 100 个实例材质不是最佳选择。正确的做…

电子应用设计方案-16:智能全屋灯光系统方案设计

智能全屋灯光系统方案设计 一、系统概述 本智能全屋灯光系统旨在为用户提供便捷、舒适、节能且个性化的照明体验&#xff0c;通过智能化的控制方式实现对全屋灯光的集中管理和灵活调控。 二、系统组成 1. 智能灯具 - 包括吸顶灯、吊灯、壁灯、台灯、筒灯、射灯等多种类型&#…

逆向题(23):nss:2956(花指令)

nss&#xff1a;2956&#xff08;花指令&#xff09; 打开主程序后&#xff0c;我们发现在这里有问题。而且跟之前学长讲的不一样。 我们学学长那样&#xff0c;先分解成数据&#xff0c;然后一步步从上往下按c去做&#xff0c;看看最后还会不会报错&#xff0c; 很显然没有…

28.<Spring博客系统⑤(部署的整个过程(CentOS))>

引入依赖 Spring-boot-maven-plugin 用maven进行打包的时候必须用到这个插件。看看自己pom.xml中有没有这个插件 并且看看配置正确不正常。 注&#xff1a;我们这个项目打的jar包在30MB左右。 <plugin><groupId>org.springframework.boot</groupId><artif…

力扣力扣力:860柠檬水找零

860. 柠檬水找零 - 力扣&#xff08;LeetCode&#xff09; 需要注意的是&#xff0c;我们一开始是没有任何钱的&#xff0c;也就是说我们需要拿着顾客的钱去找零。如果第一位顾客上来就是要找零那么我们无法完成&#xff0c;只能返回false。 分析&#xff1a; 上来我们先不分…

[开源] SafeLine 好用的Web 应用防火墙(WAF)

SafeLine&#xff0c;中文名 “雷池”&#xff0c;是一款简单好用, 效果突出的 Web 应用防火墙(WAF)&#xff0c;可以保护 Web 服务不受黑客攻击 一、简介 雷池通过过滤和监控 Web 应用与互联网之间的 HTTP 流量来保护 Web 服务。可以保护 Web 服务免受 SQL 注入、XSS、 代码注…