Java小强个人技术博客站点    手机版
当前位置: 首页 >> DB >> SQLite工具类

SQLite工具类

340 DB | 2025-7-25

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

88cc1b3edeb60b051584e4ab1dcd17e9.jpeg

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	


推荐您阅读更多有关于“ sql 数据库 工具类 SQLite ”的文章

下一篇:CentOS7配置远程桌面访问

猜你喜欢

发表评论: