欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于Java 項(xiàng)目封裝sqlite連接池操作持久化數(shù)據(jù)的方法

 更新時(shí)間:2021年11月09日 10:22:13   作者:BBinChina  
這篇文章主要介紹了Java 項(xiàng)目封裝sqlite連接池操作持久化數(shù)據(jù)的方法,文中給大家介紹了sqlite的體系結(jié)構(gòu)及封裝java的sqlite連接池的詳細(xì)過(guò)程,需要的朋友可以參考下

Sqlite

sqlite是C實(shí)現(xiàn)的一個(gè)開(kāi)源SQL引擎,其api提供sql語(yǔ)法支持,通過(guò)sql解析后對(duì)存儲(chǔ)層的磁盤(pán)文件進(jìn)行操作,完整配置的sqlite庫(kù)小于400kb,多用于移動(dòng)端應(yīng)用,小型項(xiàng)目中。

對(duì)Sqlite有興趣的可以了解下其體系結(jié)構(gòu)

在這里插入圖片描述

之前自研SQL解析器的時(shí)候便是借鑒了SQLcompiler的源碼,這里不展開(kāi)介紹

封裝Java的Sqlite連接池

首先maven項(xiàng)目引入依賴sqlite-jdbc,其主要是java版的sqliteapi,關(guān)于Sqlite api的操作,大家可以看菜鳥(niǎo)教程

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

同時(shí)引入spring jdbc方便解析數(shù)據(jù)

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

先編寫(xiě)測(cè)試用例

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();
    }
}


再根據(jù)TDD實(shí)現(xiàn)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 {

    /**
     * 磁盤(pán)文件名 即db
     */
    private String path = null;

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

    /**
     * 語(yǔ)法執(zhí)行層
     */
    private Statement statement = null;

    /**
     * 構(gòu)建一次鏈接
     *
     * @param path
     * @throws SQLException
     * @throws ClassNotFoundException
     */
    SqliteHelper(String path) throws SQLException, ClassNotFoundException {
        this.path = path;
        this.connection = this.getConnect(path);
    }

    /**
     * 讀寫(xiě)鎖,也可以使用ConcurrentHashMap
     */
    static ReentrantLock hashMapLock = new ReentrantLock();

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

    /**
     * sqlite對(duì)磁盤(pán)文件的操作是在一次連接上執(zhí)行
     *
     * @param path sqlite數(shù)據(jù)存儲(chǔ)的磁盤(pán)文件
     * @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數(shù)據(jù)表,為磁盤(pán)文件名
     * @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 執(zhí)行的sqlite 語(yǔ)句
     * @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;
        }
    }

}

到此這篇關(guān)于Java 項(xiàng)目封裝sqlite連接池操作持久化數(shù)據(jù)的文章就介紹到這了,更多相關(guān)java sqlite連接池操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot結(jié)合ehcache防止惡意刷新請(qǐng)求的實(shí)現(xiàn)

    springboot結(jié)合ehcache防止惡意刷新請(qǐng)求的實(shí)現(xiàn)

    這篇文章主要介紹了springboot結(jié)合ehcache防止惡意刷新請(qǐng)求的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Spring?Boot中獲取request的三種方式及請(qǐng)求過(guò)程

    Spring?Boot中獲取request的三種方式及請(qǐng)求過(guò)程

    這篇文章主要介紹了Spring?Boot當(dāng)中獲取request的三種方式,包括請(qǐng)求過(guò)程流程分析及response常用API,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • SpringBoot請(qǐng)求參數(shù)相關(guān)注解說(shuō)明小結(jié)

    SpringBoot請(qǐng)求參數(shù)相關(guān)注解說(shuō)明小結(jié)

    這篇文章主要介紹了SpringBoot請(qǐng)求參數(shù)相關(guān)注解說(shuō)明,主要包括@PathVariable,@RequestHeader、@CookieValue、@RequestBody和@RequestParam,本文結(jié)合實(shí)例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • SpringBoot項(xiàng)目速度提升之延遲初始化(Lazy Initialization)詳解

    SpringBoot項(xiàng)目速度提升之延遲初始化(Lazy Initialization)詳解

    延遲初始化(Lazy?Initialization)是一種在需要時(shí)才創(chuàng)建或加載對(duì)象的策略,以減少啟動(dòng)時(shí)間和資源消耗,本文就來(lái)講講延遲初始化的具體使用吧
    2023-05-05
  • idea創(chuàng)建包含多個(gè)springboot module的maven project的方法

    idea創(chuàng)建包含多個(gè)springboot module的maven project的方法

    這篇文章主要介紹了idea創(chuàng)建包含多個(gè)springboot module的maven project的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Springboot連接和操作mongoDB方式

    Springboot連接和操作mongoDB方式

    這篇文章主要介紹了Springboot連接和操作mongoDB方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • SpringBoot集成nacos動(dòng)態(tài)刷新數(shù)據(jù)源的實(shí)現(xiàn)示例

    SpringBoot集成nacos動(dòng)態(tài)刷新數(shù)據(jù)源的實(shí)現(xiàn)示例

    這篇文章主要介紹了SpringBoot集成nacos動(dòng)態(tài)刷新數(shù)據(jù)源的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Java實(shí)現(xiàn)浪漫流星表白的示例代碼

    Java實(shí)現(xiàn)浪漫流星表白的示例代碼

    本文將利用Java語(yǔ)言實(shí)現(xiàn)浪漫流星表白,可以實(shí)現(xiàn)這些功能:播放音樂(lè)、自定義流星數(shù)量、飛行速度、光暈大小、流星大小,自定義表白話語(yǔ),感興趣的可以學(xué)習(xí)一下
    2022-05-05
  • 一文詳解Java中的原子操作

    一文詳解Java中的原子操作

    在Java中,原子操作尤為重要,尤其是在多線程環(huán)境中,想象一下,如果小黑在操作一個(gè)共享變量時(shí),這個(gè)操作被其他線程打斷,那會(huì)發(fā)生什么?可能會(huì)導(dǎo)致數(shù)據(jù)不一致,或者更糟糕的情況,本文將給大家詳細(xì)介紹一下Java中的原子操作
    2024-01-01
  • Java的MyBatis+Spring框架中使用數(shù)據(jù)訪問(wèn)對(duì)象DAO模式的方法

    Java的MyBatis+Spring框架中使用數(shù)據(jù)訪問(wèn)對(duì)象DAO模式的方法

    Data Access Object數(shù)據(jù)訪問(wèn)對(duì)象模式在Java操作數(shù)據(jù)庫(kù)部分的程序設(shè)計(jì)中經(jīng)常被使用到,這里我們就來(lái)看一下Java的MyBatis+Spring框架中使用數(shù)據(jù)訪問(wèn)對(duì)象DAO模式的方法:
    2016-06-06

最新評(píng)論