关于Java 项目封装sqlite连接池操作持久化数据的方法

 更新时间:2021年11月09日 10:22:13   作者:BBinChina  
这篇文章主要介绍了Java 项目封装sqlite连接池操作持久化数据的方法,文中给大家介绍了sqlite的体系结构及封装java的sqlite连接池的详细过程,需要的朋友可以参考下

Sqlite

sqlite是C实现的一个开源SQL引擎,其api提供sql语法支持,通过sql解析后对存储层的磁盘文件进行操作,完整配置的sqlite库小于400kb,多用于移动端应用,小型项目中。

对Sqlite有兴趣的可以了解下其体系结构

在这里插入图片描述

之前自研SQL解析器的时候便是借鉴了SQLcompiler的源码,这里不展开介绍

封装Java的Sqlite连接池

首先maven项目引入依赖sqlite-jdbc,其主要是java版的sqliteapi,关于Sqlite api的操作,大家可以看菜鸟教程

<dependency>
        <groupId>org.xerial</groupId>
        <artifactId>sqlite-jdbc</artifactId>
        <version>3.30.1</version>
    </dependency>

同时引入spring jdbc方便解析数据

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.12</version>
        </dependency>

先编写测试用例

import org.junit.Test;
import org.springframework.jdbc.core.RowMapper;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;

public class TestSqliteHelper {

    @Test
    public void test() throws SQLException, ClassNotFoundException {
        SqliteHelper sqliteHelper = SqliteHelper.GetSqliteHelper("test.db");

        String sql = "CREATE TABLE COMPANY " +
                "(ID INT PRIMARY KEY     NOT NULL," +
                " NAME           TEXT    NOT NULL, " +
                " AGE            INT     NOT NULL, " +
                " ADDRESS        CHAR(50), " +
                " SALARY         REAL)";
        
        sqliteHelper.ExecuteUpdate(sql);

        sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " +
                "VALUES (1, 'Paul', 32, 'California', 20000.00 );";

        sqliteHelper.ExecuteUpdate(sql);

        sql = "SELECT * FROM COMPANY;";

        List<String> datas = new LinkedList<>();
        datas = sqliteHelper.ExecuteQuery(sql, new RowMapper<String>() {
                    @Override
                    public String mapRow(ResultSet rs, int index)
                            throws SQLException {
                        return rs.getString("NAME");

                    }
                }
        );

        sqliteHelper.PutSqliteHelper();
    }
}


再根据TDD实现ExecuteUpdate\GetSqliteHelper、ExecuteQuery、PutSqliteHelper等方法

import org.springframework.jdbc.core.RowMapper;

import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.locks.ReentrantLock;

public class SqliteHelper {

    /**
     * 磁盘文件名 即db
     */
    private String path = null;

    /**
     * 操作链接
     */
    private Connection connection = null;

    /**
     * 语法执行层
     */
    private Statement statement = null;

    /**
     * 构建一次链接
     *
     * @param path
     * @throws SQLException
     * @throws ClassNotFoundException
     */
    SqliteHelper(String path) throws SQLException, ClassNotFoundException {
        this.path = path;
        this.connection = this.getConnect(path);
    }

    /**
     * 读写锁,也可以使用ConcurrentHashMap
     */
    static ReentrantLock hashMapLock = new ReentrantLock();

    /**
     * Sqlite的连接池
     */
    static HashMap<String, List<SqliteHelper>> sqlitePool = new HashMap<>();

    /**
     * sqlite对磁盘文件的操作是在一次连接上执行
     *
     * @param path sqlite数据存储的磁盘文件
     * @return
     */
    public static SqliteHelper GetSqliteHelper(String path) throws SQLException, ClassNotFoundException {
        hashMapLock.lock();
        List<SqliteHelper> sqliteHelpers = sqlitePool.get(path);
        if (sqliteHelpers == null) {
            sqliteHelpers = new LinkedList<>();
            sqlitePool.put(path, sqliteHelpers);
        }
        SqliteHelper sqliteHelper = new SqliteHelper(path);
        sqliteHelpers.add(sqliteHelper);
        return sqliteHelper;
    }

    public void PutSqliteHelper() throws SQLException {
        hashMapLock.lock();
        List<SqliteHelper> sqliteHelpers = sqlitePool.get(this.path);
        if (sqliteHelpers == null) {
            sqliteHelpers = new LinkedList<>();
            sqlitePool.put(path, sqliteHelpers);
        }
        if(sqliteHelpers.size() > 2){
            releaseConn();
        }else{
            sqliteHelpers.add(this);
        }
    }
    /**
     * 获取Sqlite操作链接
     *
     * @param path sqlite数据表,为磁盘文件名
     * @return
     */
    private Connection getConnect(String path) throws ClassNotFoundException, SQLException {
        Connection c = null;
        Class.forName("org.sqlite.JDBC");
        c = DriverManager.getConnection("jdbc:sqlite:" + path);
        return c;
    }

    /**
     * @param sql 执行的sqlite 语句
     * @param row
     * @param <T> 映射的模板
     * @return
     */
    public <T> List<T> ExecuteQuery(String sql, RowMapper<T> row) throws SQLException {
        try {
            List<T> datas = new ArrayList<>();
            ResultSet resultSet = getStmt().executeQuery(sql);
            while (resultSet.next()) {
                datas.add(row.mapRow(resultSet, resultSet.getRow()));
            }
            resultSet.close();
            return datas;
        } finally {
            releaseConn();
        }
    }

    public void ExecuteUpdate(String sql) throws SQLException {
        getStmt().executeUpdate(sql);
    }

    private Statement getStmt() throws SQLException {
        if (this.statement == null) {
            this.statement = this.connection.createStatement();
        }
        return this.statement;
    }


    private void releaseConn() throws SQLException {
        if (this.connection != null) {
            this.connection.close();
            this.connection = null;
        }

        if (this.statement != null) {
            this.statement.close();
            this.statement = null;
        }
    }

}

到此这篇关于Java 项目封装sqlite连接池操作持久化数据的文章就介绍到这了,更多相关java sqlite连接池操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot结合ehcache防止恶意刷新请求的实现

    springboot结合ehcache防止恶意刷新请求的实现

    这篇文章主要介绍了springboot结合ehcache防止恶意刷新请求的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Spring Boot中获取request的三种方式及请求过程

    Spring Boot中获取request的三种方式及请求过程

    这篇文章主要介绍了Spring Boot当中获取request的三种方式,包括请求过程流程分析及response常用API,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • SpringBoot请求参数相关注解说明小结

    SpringBoot请求参数相关注解说明小结

    这篇文章主要介绍了SpringBoot请求参数相关注解说明,主要包括@PathVariable,@RequestHeader、@CookieValue、@RequestBody和@RequestParam,本文结合实例代码给大家讲解的非常详细,需要的朋友可以参考下
    2022-05-05
  • SpringBoot项目速度提升之延迟初始化(Lazy Initialization)详解

    SpringBoot项目速度提升之延迟初始化(Lazy Initialization)详解

    延迟初始化(Lazy Initialization)是一种在需要时才创建或加载对象的策略,以减少启动时间和资源消耗,本文就来讲讲延迟初始化的具体使用吧
    2023-05-05
  • idea创建包含多个springboot module的maven project的方法

    idea创建包含多个springboot module的maven project的方法

    这篇文章主要介绍了idea创建包含多个springboot module的maven project的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Springboot连接和操作mongoDB方式

    Springboot连接和操作mongoDB方式

    这篇文章主要介绍了Springboot连接和操作mongoDB方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • SpringBoot集成nacos动态刷新数据源的实现示例

    SpringBoot集成nacos动态刷新数据源的实现示例

    这篇文章主要介绍了SpringBoot集成nacos动态刷新数据源的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Java实现浪漫流星表白的示例代码

    Java实现浪漫流星表白的示例代码

    本文将利用Java语言实现浪漫流星表白,可以实现这些功能:播放音乐、自定义流星数量、飞行速度、光晕大小、流星大小,自定义表白话语,感兴趣的可以学习一下
    2022-05-05
  • 一文详解Java中的原子操作

    一文详解Java中的原子操作

    在Java中,原子操作尤为重要,尤其是在多线程环境中,想象一下,如果小黑在操作一个共享变量时,这个操作被其他线程打断,那会发生什么?可能会导致数据不一致,或者更糟糕的情况,本文将给大家详细介绍一下Java中的原子操作
    2024-01-01
  • Java的MyBatis+Spring框架中使用数据访问对象DAO模式的方法

    Java的MyBatis+Spring框架中使用数据访问对象DAO模式的方法

    Data Access Object数据访问对象模式在Java操作数据库部分的程序设计中经常被使用到,这里我们就来看一下Java的MyBatis+Spring框架中使用数据访问对象DAO模式的方法:
    2016-06-06

最新评论