JDBC操作SQLite的工具类
直接调用无需拼装sql
注入依赖
<dependency><groupId>org.xerial</groupId><artifactId>sqlite-jdbc</artifactId><version>3.43.0.0</version></dependency>
工具类
import org.sqlite.SQLiteConnection;/*** @Author cpf* @Date 2023/9/8*/
import java.sql.*;public class SQLiteUtils {private static final String DB_FILE = "src/main/resources/database.db"; // SQLite数据库文件名public static void main(String[] args) throws SQLException {Connection conn = getConnection();//创建表String[] columns = new String[]{"id", "name", "age", "gender"};createTable(conn, "students", columns);//插入Object[] column = new Object[]{"name", "age", "gender"};Object[] values = new Object[]{"张三", "16", "汉族"};insertRecord(conn, "students",column, values);//查询所有记录ResultSet students = queryAll(conn, "students");while (students.next()){System.out.println(students.getString("name") + " | " + students.getString("age") + " | " + students.getString("gender"));}//查询指定字段的记录ResultSet resultSet = queryByColumn(conn, "students", "name");while (resultSet.next()){System.out.println("姓名: " + resultSet.getString("name"));}//查询指定条件的记录String[] column01 = new String[]{"name"};Object[] values01 = new Object[]{"张三"};ResultSet students1 = queryByCondition(conn, "students", column01, values01);while (students1.next()){System.out.println(students1.getString("name") + " | " + students1.getString("age") + " | " + students1.getString("gender"));}/*** 更新一条记录* @param conn 数据库连接* @param tableName 表名* @param conditionSet 更新字段的数组* @param conditionSetValue 更新字段的数组* @param conditions 条件的数组* @param conditionsValue 条件值的数组*/String[] conditionSet = new String[]{"age"};Object[] conditionSetValue = new Object[]{"45"};String[] conditions = new String[]{"id"};Object[] conditionsValue = new Object[]{"5"};updateRecord(conn, "students", conditionSet, conditionSetValue, conditions, conditionsValue);//根据条件删除数据String[] conditions02 = new String[]{"id"};Object[] conditionsValue02 = new Object[]{"5"};deleteRecord(conn, "students", conditions02, conditionsValue02);//根据ID删除数据deleteRecordById(conn, "students", "4");closeConnection(conn);}/*** 创建SQLite数据库连接* @return 数据库连接*/public static Connection getConnection() {Connection conn = null;try {Class.forName("org.sqlite.JDBC");conn = DriverManager.getConnection("jdbc:sqlite:" + DB_FILE);} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();}return conn;}/*** 关闭数据库连接* @param conn 数据库连接*/public static void closeConnection(Connection conn) {try {if (conn != null) {conn.close();}} catch (SQLException e) {e.printStackTrace();}}/*** 创建SQLite表* @param conn 数据库连接* @param tableName 表名* @param columns 列名和数据类型的数组*/public static void createTable(Connection conn, String tableName, String[] columns) {StringBuilder sql = new StringBuilder();sql.append("CREATE TABLE IF NOT EXISTS ").append(tableName).append(" (");for (int i = 0; i < columns.length; i++) {sql.append(columns[i]).append(" ").append(getColumnType(columns[i]));if (i != columns.length - 1) {sql.append(",");}}sql.append(")");try (Statement stmt = conn.createStatement()) {System.out.println("建表sql: " + sql.toString());stmt.executeUpdate(sql.toString());} catch (SQLException e) {e.printStackTrace();}}/*** 获取列的数据类型* @param columnName 列名* @return 数据类型*/private static String getColumnType(String columnName) {/*if (columnName.equalsIgnoreCase("id")) {return "INTEGER PRIMARY KEY";} else if (columnName.equalsIgnoreCase("name")) {return "TEXT";} else if (columnName.equalsIgnoreCase("age")) {return "INTEGER";} else if (columnName.equalsIgnoreCase("gender")) {return "TEXT";} else {return "TEXT";}*/if (columnName.equalsIgnoreCase("id")) {return "INTEGER PRIMARY KEY";} else {return "TEXT";}}/*** 插入一条记录* @param conn 数据库连接* @param tableName 表名* @param columns 字段的数组* @param values 值的数组*/public static void insertRecord(Connection conn, String tableName, Object[] columns, Object[] values) {StringBuilder sql = new StringBuilder();sql.append("INSERT INTO ").append(tableName).append(" (");for (int i = 0; i < columns.length; i++) {sql.append(columns[i].toString()).append(",");}sql.deleteCharAt(sql.length() - 1);sql.append(") VALUES (");for (int i = 0; i < columns.length; i++) {sql.append("?,");}sql.deleteCharAt(sql.length() - 1);sql.append(")");System.out.println("插入: " + sql.toString());try (PreparedStatement pstmt = conn.prepareStatement(sql.toString())) {for (int i = 0; i < values.length; i++) {pstmt.setObject(i + 1, values[i]);}pstmt.executeUpdate();} catch (SQLException e) {e.printStackTrace();}}/*** 查询所有记录* @param conn 数据库连接* @param tableName 表名* @return 查询结果*/public static ResultSet queryAll(Connection conn, String tableName) {StringBuilder sql = new StringBuilder();sql.append("SELECT * FROM ").append(tableName);System.out.println("查询所有记录: " + sql.toString());try {Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery(sql.toString());return rs;} catch (SQLException e) {e.printStackTrace();}return null;}/*** 查询指定字段的记录* @param conn 数据库连接* @param tableName 表名* @param columnName 列名* @return 查询结果*/public static ResultSet queryByColumn(Connection conn, String tableName, String columnName) {StringBuilder sql = new StringBuilder();sql.append("SELECT ").append(columnName).append(" FROM ").append(tableName);try{Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery(sql.toString());return rs;} catch (SQLException e) {e.printStackTrace();}return null;}/*** 查询指定条件的记录* @param conn 数据库连接* @param tableName 表名* @param conditions 条件字段的数组* @param values 条件值的数组* @return 查询结果*/public static ResultSet queryByCondition(Connection conn, String tableName, String[] conditions, Object[] values) {StringBuilder sql = new StringBuilder();sql.append("SELECT * FROM ").append(tableName).append(" WHERE ");for (int i = 0; i < conditions.length; i++) {sql.append(conditions[i]).append("=?");if (i != conditions.length - 1) {sql.append(" AND ");}}System.out.println("询指定条件的记录: " + sql.toString());try{PreparedStatement pstmt = conn.prepareStatement(sql.toString());for (int i = 0; i < values.length; i++) {pstmt.setObject(i + 1, values[i]);}return pstmt.executeQuery();} catch (SQLException e) {e.printStackTrace();}return null;}/*** 更新一条记录* @param conn 数据库连接* @param tableName 表名* @param conditionSet 更新字段的数组* @param conditionSetValue 更新字段的数组* @param conditions 条件的数组* @param conditionsValue 条件值的数组*/public static void updateRecord(Connection conn, String tableName, String[] conditionSet, Object[] conditionSetValue, String[] conditions, Object[] conditionsValue) {StringBuilder sql = new StringBuilder();sql.append("UPDATE ").append(tableName).append(" SET ");for (int i = 0; i < conditionSet.length; i++) {sql.append(conditionSet[i]).append("=?");if (i != conditionSet.length - 1) {sql.append(",");}}sql.append(" WHERE ");for (int i = 0; i < conditions.length; i++) {sql.append(conditions[i]).append("=?");if (i != conditions.length - 1) {sql.append(" AND ");}}try{System.out.println("更新一条记录: " + sql.toString());PreparedStatement pstmt = conn.prepareStatement(sql.toString());for (int i = 0; i < conditionSetValue.length; i++) {pstmt.setObject(i + 1, conditionSetValue[i]);}for (int i = 0; i < conditionsValue.length; i++) {pstmt.setObject(i + conditionsValue.length + 1, conditionsValue[i]);}pstmt.executeUpdate();} catch (SQLException e) {e.printStackTrace();}}/*** 删除一条记录* @param conn 数据库连接* @param tableName 表名* @param conditions 条件的数组* @param conditionsValue 条件值的数组*/public static void deleteRecord(Connection conn, String tableName, String[] conditions, Object[] conditionsValue) {StringBuilder sql = new StringBuilder();sql.append("DELETE FROM ").append(tableName).append(" WHERE ");for (int i = 0; i < conditions.length; i++) {sql.append(conditions[i]).append("=?");if (i != conditions.length - 1) {sql.append(" AND ");}}try{System.out.println("根据条件删除数据: " + sql.toString());PreparedStatement pstmt = conn.prepareStatement(sql.toString());for (int i = 0; i < conditionsValue.length; i++) {pstmt.setObject(i + 1, conditionsValue[i]);}pstmt.executeUpdate();} catch (SQLException e) {e.printStackTrace();}}/*** 根据ID删除一条记录* @param conn 数据库连接* @param tableName 表名* @param id ID值*/public static void deleteRecordById(Connection conn, String tableName, String id) {StringBuilder sql = new StringBuilder();sql.append("DELETE FROM ").append(tableName).append(" WHERE id=?");try{System.out.println("根据条件删除数据: " + sql.toString());PreparedStatement pstmt = conn.prepareStatement(sql.toString());pstmt.setString(1, id);pstmt.executeUpdate();} catch (SQLException e) {e.printStackTrace();}}
}相关文章:
JDBC操作SQLite的工具类
直接调用无需拼装sql 注入依赖 <dependency><groupId>org.xerial</groupId><artifactId>sqlite-jdbc</artifactId><version>3.43.0.0</version></dependency>工具类 import org.sqlite.SQLiteConnection;/*** Author cpf* Dat…...
SEO百度优化基础知识全解析(了解百度SEO标签作用)
百度SEO优化的作用介绍: 百度SEO优化是指通过对网站的内部结构、外部链接、内容质量、用户体验等方面进行优化,提升网站在百度搜索结果中的排名,从而提高网站的曝光率和流量。通过百度SEO优化,可以让更多的潜在用户找到你的网站&…...
用python实现基本数据结构【03/4】
说明 如果需要用到这些知识却没有掌握,则会让人感到沮丧,也可能导致面试被拒。无论是花几天时间“突击”,还是利用零碎的时间持续学习,在数据结构上下点功夫都是值得的。那么Python 中有哪些数据结构呢?列表、字典、集…...
软件测试面试题汇总
测试技术面试题 软件测试面试时一份好简历的重要性 1、什么是兼容性测试?兼容性测试侧重哪些方面? 5 2、我现在有个程序,发现在Windows上运行得很慢,怎么判别是程序存在问题还是软硬件系统存在问题? 5 3、测试的策略…...
AP5101C 高压线性恒流IC 宽电压6-100V LED汽车大灯照明 台灯LED矿灯 指示灯电源驱动
产品描述 AP5101C 是一款高压线性 LED 恒流芯片 , 外围简单 、 内置功率管 , 适用于6- 100V 输入的高精度降压 LED 恒流驱动芯片。电流2.0A。AP5101C 可实现内置MOS 做 2.0A,外置 MOS 可做 3.0A 的。AP5101C 内置温度保护功能 ,温度保护点为…...
【大数问题】字符串相减(大数相减)<模拟>
类似 【力扣】415. 字符串相加(大数相加),实现大数相减。 题解 模拟相减的过程,先一直使大数减小数,记录借位,最后再判断是否加负号。(中间需要删除前导0,例如10001-1000000001&am…...
easycode生成代码模板配置
实体: ##引入宏定义 $!define##使用宏定义设置回调(保存位置与文件后缀)$!autoImport import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.NoArgsConstructor; i…...
【数据结构】堆排序和Top-k问题
【数据结构】堆 堆排序 如果只是将待排数组建立一个大堆或者小堆是无法得到一个升序或者降序的数组,因为对与一个堆,我们没法知道同一层的大小关系。 但是,如果建立了一个大堆,那么堆顶元素一定是这个数组中最大的,…...
经典的生产者和消费者模型问题
典型的生产者-消费者问题,可以使用 Java 中的 java.util.concurrent 包提供的 BlockingQueue 来实现。BlockingQueue 是一个线程安全的队列,它可以处理这种生产者-消费者的场景。以下是一个示例代码: import java.util.concurrent.ArrayBlockingQueue; import java.util.co…...
Java基础:代理
这里写目录标题 什么是代理1.静态代理(委托类、代理类):使用步骤:示例优缺点 2.动态代理(委托类、中介类)2.1 JDK动态代理使用:中介类:示例1:示例2: 2.2 CGLi…...
每日一学——防火墙2
防火墙是一种网络安全设备,用于保护计算机网络免受未经授权的访问、攻击和恶意行为的影响。以下是一些防火墙的基本概念: 防火墙规则:防火墙会根据预先设置的规则来决定允许或拒绝特定的网络流量。这些规则可以指定源 IP 地址、目标 IP 地址、…...
Web学习笔记-React(组合Components)
笔记内容转载自 AcWing 的 Web 应用课讲义,课程链接:AcWing Web 应用课。 CONTENTS 1. 创建父组件2. 从上往下传递数据3. 传递子节点4. 从下往上调用函数5. 兄弟组件间传递消息6. 无状态函数组件7. 组件的生命周期 本节内容是组件与组件之间的组合&#…...
【strstr函数的介绍和模拟实现——超详细版】
strstr函数的介绍和模拟实现 strstr函数的介绍 资源来源于cplusplus网站 strstr函数声明: char *strstr( const char *str1, const char *str2 ); 它的作用其实就是: 在字符串str1中查找是否含有字符串str2,如果存在,返回str2在…...
【Terraform】Terraform自动创建云服务器脚本
Terraform 是由 HashiCorp 创建的开源“基础架构即代码”工具 (IaC) 使用HCL(配置语言)描述云平台基础设施(这里教你使用低级基础设施:交换机、云服务器、VPC、带宽) Terraform提供者…...
TCP机制之确认应答及超时重传
TCP因为其可靠传输的特性被广泛使用,这篇博客将详细介绍一下TCP协议是如何保证它的可靠性的呢?这得主要依赖于其确认应答及超时重传机制,同时三次握手四次挥手也起到了少部分不作用,但是主要还是由确认应答和超时重传来决定的;注意:这里的可靠传输并不是说100%能把数据发送给接…...
Openharmony3.2 源码编译(ubuntu 22.04) 过程记录
OS: ubuntu 22.04 x64 1. 下载源码 1.1 安装码云repo工具 sudo apt install python3-pip git-lfsmkdir ~/bin curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 -o ~/bin/repo chmod ax ~/bin/repo pip3 install -i https://repo.huaweicloud.com/repository/p…...
PostgreSQL 数据库使用 psql 导入 SQL
最近我们有一个 SQL 需要导入到 PostgreSQL ,但数据格式使用的是用: -- -- TOC entry 7877 (class 0 OID 21961) -- Dependencies: 904 -- Data for Name: upload_references; Type: TABLE DATA; Schema: public; Owner: - --COPY public.upload_refere…...
容器编排学习(三)端口映射与Harber镜像仓库介绍
一 对外发布服务(端口映射) 1 概述 新创建容器的IP 地址是随机的 容器在重启后每次 IP 都会发生变化 容器服务只有宿主机才能访问 如何才能使用容器对外提供稳定的服务? 容器端口可以与宿主机的端口进行映射绑定 从而把宿主机变成对应的服务&a…...
Day_13 > 指针进阶(2)
目录 1.函数指针数组 2.指向函数指针数组的指针 3.回调函数 qsort()函数 代码示例 void* 4.结束 今天我们在进阶指针的基础上,学习进阶指针的第二部分 1.函数指针数组 首先我们回顾一下指针数组 char* arr[5]://字符指针数组 - 数组 - 存放的是字符指针 in…...
对Transformer中的Attention(注意力机制)的一点点探索
摘要:本文试图对 Transformer 中的 Attention 机制进行一点点探索。并就 6 个问题深入展开。 ✅ NLP 研 1 选手的学习笔记 简介:小王,NPU,2023级,计算机技术 研究方向:文本生成、摘要生成 文章目录 一、为啥…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
