SQLite 是一个开源的嵌入式关系数据库,实现了自给自足的、无服务器的、配置无需的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库系统不同,比如 MySQL、PostgreSQL 等,SQLite 不需要在系统中设置和管理一个单独的服务。这也使得 SQLite 是一种非常轻量级的数据库解决方案,非常适合小型项目、嵌入式数据库或者测试环境中。

SQLite 的一些主要特性包括:
无服务器的:SQLite 不是一个单独的服务进程,而是直接嵌入到应用程序中。它直接读取和写入磁盘文件。
事务性的:SQLite 支持 ACID(原子性、一致性、隔离性、持久性)属性,能够确保所有事务都是安全、一致的,即使在系统崩溃或者电力中断的情况下。
零配置的:SQLite 不需要任何配置或者管理,这使得它非常容易安装和使用。
自包含的:SQLite 是一个自包含系统,这意味着它几乎不依赖其他任何外部系统或者库,这使得 SQLite 的跨平台移植非常方便。
小型的:SQLite 非常小巧轻量,全功能的 SQLite 数据库引擎的大小只有几百KB。
广泛应用:SQLite 被广泛应用在各种各样的产品和系统中,包括手机、平板电脑、嵌入式系统、物联网设备等。它也被广泛用于网站开发、科学研究、数据分析等领域。
在一些轻量级的应用场景下,SQLite 是一个非常理想的选择,因为它简单、高效、易于使用和部署。然而,对于需要处理大量并发写操作或者需要更高级的功能(如用户管理或者存储过程等)的应用场景,更全功能的数据库系统(如 PostgreSQL 或 MySQL)可能会是更好的选择。
一些基本的知识和概念,大街上随便捡,这里封装了一个操作类,简化对于SQLit的操作
首先在POM中引入SQLit支持
<dependency> <groupId>org.xerial</groupId> <artifactId>sqlite-jdbc</artifactId> <version>3.8.11.2</version> </dependency>
工具类
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.RowMapper;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* sqlite帮助类,直接创建该类示例,并调用相应的借口即可对sqlite数据库进行操作
* 本类基于 sqlite jdbc v56
*/
public class SqliteHelper {
final static Logger logger = LoggerFactory.getLogger(SqliteHelper.class);
private Connection connection;
private Statement statement;
private ResultSet resultSet;
private String dbFilePath;
/**
* 构造函数
*
* @param dbFilePath sqlite db 文件路径
*/
public SqliteHelper(String dbFilePath) throws ClassNotFoundException, SQLException {
this.dbFilePath = dbFilePath;
connection = getConnection(dbFilePath);
}
/**
* 获取数据库连接
*
* @param dbFilePath db文件路径
* @return 数据库连接
*/
public Connection getConnection(String dbFilePath) throws ClassNotFoundException, SQLException {
Connection conn = null;
Class.forName("org.sqlite.JDBC");
conn = DriverManager.getConnection("jdbc:sqlite:" + dbFilePath);
return conn;
}
/**
* 执行sql查询
*
* @param sql sql select 语句
* @param rse 结果集处理类对象
* @return 查询结果
*/
public <T> T executeQuery(String sql, ResultSetExtractor<T> rse) throws SQLException, ClassNotFoundException {
try {
logger.info("执行sql:{}", sql);
resultSet = getStatement().executeQuery(sql);
T rs = rse.extractData(resultSet);
return rs;
} finally {
destroyed();
}
}
/**
* 执行select查询,返回结果列表
*
* @param sql sql select 语句
* @param rm 结果集的行数据处理类对象
*/
public <T> List<T> executeQuery(String sql, RowMapper<T> rm) throws SQLException, ClassNotFoundException {
List<T> rsList = new ArrayList<T>();
try {
logger.info("执行sql:{}", sql);
resultSet = getStatement().executeQuery(sql);
while (resultSet.next()) {
rsList.add(rm.mapRow(resultSet, resultSet.getRow()));
}
} finally {
destroyed();
}
return rsList;
}
/**
* 执行数据库更新sql语句
*/
public int executeUpdate(String sql) throws SQLException, ClassNotFoundException {
try {
logger.info("执行sql:{}", sql);
int c = getStatement().executeUpdate(sql);
return c;
} finally {
destroyed();
}
}
/**
* 执行多个sql更新语句
*/
public void executeUpdate(String... sqls) throws SQLException, ClassNotFoundException {
try {
for (String sql : sqls) {
logger.info("执行sql:{}", sql);
getStatement().executeUpdate(sql);
}
} finally {
destroyed();
}
}
/**
* 执行数据库更新 sql List
*/
public void executeUpdate(List<String> sqls) throws SQLException, ClassNotFoundException {
try {
for (String sql : sqls) {
logger.info("执行sql:{}", sql);
getStatement().executeUpdate(sql);
}
} finally {
destroyed();
}
}
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 void destroyed() {
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.error("Sqlite数据库关闭时异常", e);
}
}
/**
* 执行select查询,返回结果列表
*/
public <T> List<T> executeQueryList(String sql, Class<T> clazz) throws SQLException, ClassNotFoundException, IllegalAccessException, InstantiationException {
List<T> rsList = new ArrayList<T>();
try {
logger.info("执行sql:{}", sql);
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;
}
/**
* 执行sql查询,适用单条结果集
*/
public <T> T executeQuery(String sql, Class<T> clazz) throws SQLException, ClassNotFoundException, IllegalAccessException, InstantiationException {
try {
logger.info("执行sql:{}", sql);
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();
}
}
/**
* 执行数据库更新sql语句
*/
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()) {
Object value = param.get(key);
if (value instanceof String) {
sql.append("'");
sql.append(param.get(key));
sql.append("',");
} else {
sql.append(param.get(key));
sql.append(",");
}
}
sql.delete(sql.length() - 1, sql.length());
sql.append(");");
logger.info("执行sql:{}", sql);
int c = getStatement().executeUpdate(sql.toString());
return c;
} finally {
destroyed();
}
}
/**
* 检查表名是否存在
*/
public boolean isTableExists(String tableName) throws SQLException, ClassNotFoundException {
String sql = "SELECT name FROM sqlite_master WHERE type='table' AND name=?";
try {
Connection conn = getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, tableName);
ResultSet rs = pstmt.executeQuery();
boolean exists = rs.next();
rs.close();
return exists;
} catch (SQLException e) {
System.out.println(e.getMessage());
return false;
}
}
}表对应的实体类
import lombok.Data;
/**
* 接收SqlLit一行数据
*/
@Data
public class SqlLiteDemoResult {
private String id;
private Integer bizNo;
private String content;
private String createTime;
}测试类
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.text.StrFormatter;
import com.galileo.ops.common.utils.SqliteHelper;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* sqlite帮助类,直接创建该类示例,并调用相应的借口即可对sqlite数据库进行操作
*/
public class SqliteTest {
public static void main(String args[]) {
try {
SqliteHelper h = new SqliteHelper("D:\\tmp\\testHelper.db");
boolean tableNameQuery = h.isTableExists("NOTE");
System.out.println("表名是否存在:" + tableNameQuery);
if(!tableNameQuery) {
h.executeUpdate("drop table if exists NOTE;");
h.executeUpdate("CREATE TABLE NOTE (" +
"UUID TEXT NOT NULL," +
"BIZ_NO INTEGER," +
"CONTENT TEXT," +
"CREATE_TIME TEXT," +
"CONSTRAINT NOTE_PK PRIMARY KEY (UUID)" +
");");
}
// insert 例子
String UUID = cn.hutool.core.lang.UUID.randomUUID().toString(true);
Map<String, Object> map = new HashMap<>();
map.put("UUID", UUID);
map.put("BIZ_NO", 1);
map.put("CONTENT", "举个例子");
map.put("CREATE_TIME", DateUtil.now());
h.executeInsert("NOTE", map);
// 取list例子
List<SqlLiteDemoResult> demoList = h.executeQueryList("select UUID as id,BIZ_NO as bizNo,CONTENT as content,CREATE_TIME as createTime from NOTE", SqlLiteDemoResult.class);
System.out.println(" =====> 打印列表 <=====");
for (SqlLiteDemoResult result : demoList) {
System.out.print(result.getId() + "\t");
System.out.print(result.getBizNo() + "\t");
System.out.print(result.getContent() + "\t");
System.out.print(result.getCreateTime() + "\t");
}
System.out.println();
// UPDATE 例子
StrFormatter formatter = new StrFormatter();
String sqlUpdate = formatter.format("UPDATE NOTE SET CONTENT = '{}' WHERE UUID = '{}'", "改个例子修改", UUID);
h.executeUpdate(sqlUpdate);
// 取单条例子
SqlLiteDemoResult demoResult = h.executeQuery("select UUID as id,BIZ_NO as bizNo,CONTENT as content,CREATE_TIME as createTime from NOTE WHERE UUID = '" + UUID + "'", SqlLiteDemoResult.class);
System.out.println(" =====> 打印单条 <=====");
System.out.print(demoResult.getId() + "\t");
System.out.print(demoResult.getBizNo() + "\t");
System.out.print(demoResult.getContent() + "\t");
System.out.print(demoResult.getCreateTime() + "\t");
System.out.println();
} catch (Exception e) {
e.printStackTrace();
}
}
}打印如下
表名是否存在:false 2025-07-25 09:24:06.037 INFO c.galileo.ops.common.utils.SqliteHelper LN:92 执行sql:drop table if exists NOTE; 2025-07-25 09:24:06.042 INFO c.galileo.ops.common.utils.SqliteHelper LN:92 执行sql:CREATE TABLE NOTE (UUID TEXT NOT NULL,BIZ_NO INTEGER,CONTENT TEXT,CREATE_TIME TEXT,CONSTRAINT NOTE_PK PRIMARY KEY (UUID)); 2025-07-25 09:24:06.122 INFO c.galileo.ops.common.utils.SqliteHelper LN:228 执行sql:INSERT INTO NOTE ( BIZ_NO,CONTENT,CREATE_TIME,UUID) VALUES ( 1,'举个例子','2025-07-25 09:24:06','31006bd363574d3ba662198c61c89856'); 2025-07-25 09:24:06.129 INFO c.galileo.ops.common.utils.SqliteHelper LN:166 执行sql:select UUID as id,BIZ_NO as bizNo,CONTENT as content,CREATE_TIME as createTime from NOTE =====> 打印列表 <===== 31006bd363574d3ba662198c61c89856 1 举个例子 2025-07-25 09:24:06 2025-07-25 09:24:06.135 INFO c.galileo.ops.common.utils.SqliteHelper LN:92 执行sql:UPDATE NOTE SET CONTENT = '改个例子修改' WHERE UUID = '31006bd363574d3ba662198c61c89856' 2025-07-25 09:24:06.140 INFO c.galileo.ops.common.utils.SqliteHelper LN:187 执行sql:select UUID as id,BIZ_NO as bizNo,CONTENT as content,CREATE_TIME as createTime from NOTE WHERE UUID = '31006bd363574d3ba662198c61c89856' =====> 打印单条 <===== 31006bd363574d3ba662198c61c89856 1 改个例子修改 2025-07-25 09:24:06
Java小强
未曾清贫难成人,不经打击老天真。
自古英雄出炼狱,从来富贵入凡尘。
发表评论: