经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » SQLite » 查看文章
关于Java 项目封装sqlite连接池操作持久化数据的方法
来源:jb51  时间:2021/11/9 12:48:54  对本文有异议

Sqlite

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

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

在这里插入图片描述

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

封装Java的Sqlite连接池

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

  1. <dependency>
  2. <groupId>org.xerial</groupId>
  3. <artifactId>sqlite-jdbc</artifactId>
  4. <version>3.30.1</version>
  5. </dependency>

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

  1. <dependency>
  2. <groupId>org.springframework</groupId>
  3. <artifactId>spring-jdbc</artifactId>
  4. <version>5.3.12</version>
  5. </dependency>

先编写测试用例

  1. import org.junit.Test;
  2. import org.springframework.jdbc.core.RowMapper;
  3.  
  4. import java.sql.ResultSet;
  5. import java.sql.SQLException;
  6. import java.util.LinkedList;
  7. import java.util.List;
  8.  
  9. public class TestSqliteHelper {
  10.  
  11. @Test
  12. public void test() throws SQLException, ClassNotFoundException {
  13. SqliteHelper sqliteHelper = SqliteHelper.GetSqliteHelper("test.db");
  14.  
  15. String sql = "CREATE TABLE COMPANY " +
  16. "(ID INT PRIMARY KEY NOT NULL," +
  17. " NAME TEXT NOT NULL, " +
  18. " AGE INT NOT NULL, " +
  19. " ADDRESS CHAR(50), " +
  20. " SALARY REAL)";
  21. sqliteHelper.ExecuteUpdate(sql);
  22.  
  23. sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " +
  24. "VALUES (1, 'Paul', 32, 'California', 20000.00 );";
  25.  
  26. sqliteHelper.ExecuteUpdate(sql);
  27.  
  28. sql = "SELECT * FROM COMPANY;";
  29.  
  30. List<String> datas = new LinkedList<>();
  31. datas = sqliteHelper.ExecuteQuery(sql, new RowMapper<String>() {
  32. @Override
  33. public String mapRow(ResultSet rs, int index)
  34. throws SQLException {
  35. return rs.getString("NAME");
  36.  
  37. }
  38. }
  39. );
  40.  
  41. sqliteHelper.PutSqliteHelper();
  42. }
  43. }
  44.  
  45.  

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

  1. import org.springframework.jdbc.core.RowMapper;
  2.  
  3. import java.sql.*;
  4. import java.util.ArrayList;
  5. import java.util.HashMap;
  6. import java.util.LinkedList;
  7. import java.util.List;
  8. import java.util.concurrent.locks.ReentrantLock;
  9.  
  10. public class SqliteHelper {
  11.  
  12. /**
  13. * 磁盘文件名 即db
  14. */
  15. private String path = null;
  16.  
  17. /**
  18. * 操作链接
  19. */
  20. private Connection connection = null;
  21.  
  22. /**
  23. * 语法执行层
  24. */
  25. private Statement statement = null;
  26.  
  27. /**
  28. * 构建一次链接
  29. *
  30. * @param path
  31. * @throws SQLException
  32. * @throws ClassNotFoundException
  33. */
  34. SqliteHelper(String path) throws SQLException, ClassNotFoundException {
  35. this.path = path;
  36. this.connection = this.getConnect(path);
  37. }
  38.  
  39. /**
  40. * 读写锁,也可以使用ConcurrentHashMap
  41. */
  42. static ReentrantLock hashMapLock = new ReentrantLock();
  43.  
  44. /**
  45. * Sqlite的连接池
  46. */
  47. static HashMap<String, List<SqliteHelper>> sqlitePool = new HashMap<>();
  48.  
  49. /**
  50. * sqlite对磁盘文件的操作是在一次连接上执行
  51. *
  52. * @param path sqlite数据存储的磁盘文件
  53. * @return
  54. */
  55. public static SqliteHelper GetSqliteHelper(String path) throws SQLException, ClassNotFoundException {
  56. hashMapLock.lock();
  57. List<SqliteHelper> sqliteHelpers = sqlitePool.get(path);
  58. if (sqliteHelpers == null) {
  59. sqliteHelpers = new LinkedList<>();
  60. sqlitePool.put(path, sqliteHelpers);
  61. }
  62. SqliteHelper sqliteHelper = new SqliteHelper(path);
  63. sqliteHelpers.add(sqliteHelper);
  64. return sqliteHelper;
  65. }
  66.  
  67. public void PutSqliteHelper() throws SQLException {
  68. hashMapLock.lock();
  69. List<SqliteHelper> sqliteHelpers = sqlitePool.get(this.path);
  70. if (sqliteHelpers == null) {
  71. sqliteHelpers = new LinkedList<>();
  72. sqlitePool.put(path, sqliteHelpers);
  73. }
  74. if(sqliteHelpers.size() > 2){
  75. releaseConn();
  76. }else{
  77. sqliteHelpers.add(this);
  78. }
  79. }
  80. /**
  81. * 获取Sqlite操作链接
  82. *
  83. * @param path sqlite数据表,为磁盘文件名
  84. * @return
  85. */
  86. private Connection getConnect(String path) throws ClassNotFoundException, SQLException {
  87. Connection c = null;
  88. Class.forName("org.sqlite.JDBC");
  89. c = DriverManager.getConnection("jdbc:sqlite:" + path);
  90. return c;
  91. }
  92.  
  93. /**
  94. * @param sql 执行的sqlite 语句
  95. * @param row
  96. * @param <T> 映射的模板
  97. * @return
  98. */
  99. public <T> List<T> ExecuteQuery(String sql, RowMapper<T> row) throws SQLException {
  100. try {
  101. List<T> datas = new ArrayList<>();
  102. ResultSet resultSet = getStmt().executeQuery(sql);
  103. while (resultSet.next()) {
  104. datas.add(row.mapRow(resultSet, resultSet.getRow()));
  105. }
  106. resultSet.close();
  107. return datas;
  108. } finally {
  109. releaseConn();
  110. }
  111. }
  112.  
  113. public void ExecuteUpdate(String sql) throws SQLException {
  114. getStmt().executeUpdate(sql);
  115. }
  116.  
  117. private Statement getStmt() throws SQLException {
  118. if (this.statement == null) {
  119. this.statement = this.connection.createStatement();
  120. }
  121. return this.statement;
  122. }
  123.  
  124.  
  125. private void releaseConn() throws SQLException {
  126. if (this.connection != null) {
  127. this.connection.close();
  128. this.connection = null;
  129. }
  130.  
  131. if (this.statement != null) {
  132. this.statement.close();
  133. this.statement = null;
  134. }
  135. }
  136.  
  137. }
  138.  

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号