当前位置: 首页 > news >正文

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优化的作用介绍&#xff1a; 百度SEO优化是指通过对网站的内部结构、外部链接、内容质量、用户体验等方面进行优化&#xff0c;提升网站在百度搜索结果中的排名&#xff0c;从而提高网站的曝光率和流量。通过百度SEO优化&#xff0c;可以让更多的潜在用户找到你的网站&…...

用python实现基本数据结构【03/4】

说明 如果需要用到这些知识却没有掌握&#xff0c;则会让人感到沮丧&#xff0c;也可能导致面试被拒。无论是花几天时间“突击”&#xff0c;还是利用零碎的时间持续学习&#xff0c;在数据结构上下点功夫都是值得的。那么Python 中有哪些数据结构呢&#xff1f;列表、字典、集…...

软件测试面试题汇总

测试技术面试题 软件测试面试时一份好简历的重要性 1、什么是兼容性测试&#xff1f;兼容性测试侧重哪些方面&#xff1f; 5 2、我现在有个程序&#xff0c;发现在Windows上运行得很慢&#xff0c;怎么判别是程序存在问题还是软硬件系统存在问题&#xff1f; 5 3、测试的策略…...

AP5101C 高压线性恒流IC 宽电压6-100V LED汽车大灯照明 台灯LED矿灯 指示灯电源驱动

产品描述 AP5101C 是一款高压线性 LED 恒流芯片 &#xff0c; 外围简单 、 内置功率管 &#xff0c; 适用于6- 100V 输入的高精度降压 LED 恒流驱动芯片。电流2.0A。AP5101C 可实现内置MOS 做 2.0A,外置 MOS 可做 3.0A 的。AP5101C 内置温度保护功能 &#xff0c;温度保护点为…...

【大数问题】字符串相减(大数相减)<模拟>

类似 【力扣】415. 字符串相加&#xff08;大数相加&#xff09;&#xff0c;实现大数相减。 题解 模拟相减的过程&#xff0c;先一直使大数减小数&#xff0c;记录借位&#xff0c;最后再判断是否加负号。&#xff08;中间需要删除前导0&#xff0c;例如10001-1000000001&am…...

easycode生成代码模板配置

实体&#xff1a; ##引入宏定义 $!define##使用宏定义设置回调&#xff08;保存位置与文件后缀&#xff09;$!autoImport import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.NoArgsConstructor; i…...

【数据结构】堆排序和Top-k问题

【数据结构】堆 堆排序 如果只是将待排数组建立一个大堆或者小堆是无法得到一个升序或者降序的数组&#xff0c;因为对与一个堆&#xff0c;我们没法知道同一层的大小关系。 但是&#xff0c;如果建立了一个大堆&#xff0c;那么堆顶元素一定是这个数组中最大的&#xff0c;…...

经典的生产者和消费者模型问题

典型的生产者-消费者问题,可以使用 Java 中的 java.util.concurrent 包提供的 BlockingQueue 来实现。BlockingQueue 是一个线程安全的队列,它可以处理这种生产者-消费者的场景。以下是一个示例代码: import java.util.concurrent.ArrayBlockingQueue; import java.util.co…...

Java基础:代理

这里写目录标题 什么是代理1.静态代理&#xff08;委托类、代理类&#xff09;&#xff1a;使用步骤&#xff1a;示例优缺点 2.动态代理&#xff08;委托类、中介类&#xff09;2.1 JDK动态代理使用&#xff1a;中介类&#xff1a;示例1&#xff1a;示例2&#xff1a; 2.2 CGLi…...

每日一学——防火墙2

防火墙是一种网络安全设备&#xff0c;用于保护计算机网络免受未经授权的访问、攻击和恶意行为的影响。以下是一些防火墙的基本概念&#xff1a; 防火墙规则&#xff1a;防火墙会根据预先设置的规则来决定允许或拒绝特定的网络流量。这些规则可以指定源 IP 地址、目标 IP 地址、…...

Web学习笔记-React(组合Components)

笔记内容转载自 AcWing 的 Web 应用课讲义&#xff0c;课程链接&#xff1a;AcWing Web 应用课。 CONTENTS 1. 创建父组件2. 从上往下传递数据3. 传递子节点4. 从下往上调用函数5. 兄弟组件间传递消息6. 无状态函数组件7. 组件的生命周期 本节内容是组件与组件之间的组合&#…...

【strstr函数的介绍和模拟实现——超详细版】

strstr函数的介绍和模拟实现 strstr函数的介绍 资源来源于cplusplus网站 strstr函数声明&#xff1a; char *strstr( const char *str1, const char *str2 ); 它的作用其实就是&#xff1a; 在字符串str1中查找是否含有字符串str2&#xff0c;如果存在&#xff0c;返回str2在…...

【Terraform】Terraform自动创建云服务器脚本

Terraform 是由 HashiCorp 创建的开源“基础架构即代码”工具 &#xff08;IaC&#xff09; 使用HCL&#xff08;配置语言&#xff09;描述云平台基础设施&#xff08;这里教你使用低级基础设施&#xff1a;交换机、云服务器、VPC、带宽&#xff09; Terraform提供者&#xf…...

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 &#xff0c;但数据格式使用的是用&#xff1a; -- -- 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镜像仓库介绍

一 对外发布服务&#xff08;端口映射&#xff09; 1 概述 新创建容器的IP 地址是随机的 容器在重启后每次 IP 都会发生变化 容器服务只有宿主机才能访问 如何才能使用容器对外提供稳定的服务? 容器端口可以与宿主机的端口进行映射绑定 从而把宿主机变成对应的服务&a…...

Day_13 > 指针进阶(2)

目录 1.函数指针数组 2.指向函数指针数组的指针 3.回调函数 qsort()函数 代码示例 void* 4.结束 今天我们在进阶指针的基础上&#xff0c;学习进阶指针的第二部分 1.函数指针数组 首先我们回顾一下指针数组 char* arr[5]://字符指针数组 - 数组 - 存放的是字符指针 in…...

对Transformer中的Attention(注意力机制)的一点点探索

摘要&#xff1a;本文试图对 Transformer 中的 Attention 机制进行一点点探索。并就 6 个问题深入展开。 ✅ NLP 研 1 选手的学习笔记 简介&#xff1a;小王&#xff0c;NPU&#xff0c;2023级&#xff0c;计算机技术 研究方向&#xff1a;文本生成、摘要生成 文章目录 一、为啥…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...