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小强
未曾清贫难成人,不经打击老天真。
自古英雄出炼狱,从来富贵入凡尘。
发表评论: