描述:
SQLite,是一款輕型的數據庫,是遵守ACID的關系型數據庫管理系統,它包含在一個相對小的C庫中。
它是D.RichardHipp建立的公有領域項目。它的設計目標是嵌入式的,而且已經在很多嵌入式產品中使用了它,它占用資源非常的低,在嵌入式設備中,
可能只需要幾百K的內存就夠了。它能夠支持Windows/Linux/Unix等等主流的操作系統,同時能夠跟很多程序語言相結合,比如 Tcl、C#、PHP、Java等,還有ODBC接口,
同樣比起Mysql、PostgreSQL這兩款開源的世界著名數據庫管理系統來講,它的處理速度比他們都快。SQLite第一個Alpha版本誕生於2000年5月。 至2019年已經有19個年頭,SQLite也迎來了一個版本 SQLite 3已經發布
工作原理
不像常見的客戶-服務器范例,SQLite
引擎不是個
程序與之通信的獨立進程,而是連接到程序中成為它的一個主要部分。所以主要的通信協議是在
編程語言內的直接API調用。這在消耗總量、延遲時間和整體簡單性上有積極的作用。整個數據庫(定義、表、索引和數據本身)都在宿主主機上存儲在一個單一的文件中。它的簡單的設計是通過在開始一個事務的時候鎖定整個
數據文件而完成的。
功能特性
1. ACID事務
2. 零配置 – 無需安裝和管理配置
5.
支持數據庫大小至2TB
6. 足夠小, 大致13萬行C代碼, 4.43M
7. 比一些流行的數據庫在大部分普通數據庫操作要快
8. 簡單, 輕松的API
9. 包含TCL綁定, 同時通過Wrapper支持其他語言的綁定
10. 良好注釋的
源代碼, 並且有着90%以上的測試覆蓋率
11. 獨立: 沒有額外依賴
12. 源碼完全的開源, 你可以用於任何用途, 包括出售它
13. 支持多種開發語言,C, C++, PHP, Perl, Java, C#,Python, Ruby等
sqlite數據庫就是一個DB文件。 程序上的每次操作也是直接操作 DB文件。
程序每操作一次數據庫都要IO一次 .DB 文件 。 這個文件就是這個SQLite數據庫。
對大數據量以及復雜的關聯關系 支持明顯不足。
工具類:
package com.hotent.code.util.eayun; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; /** * 對sqlite操作 * 所需支持依賴 sqlite-jdbc-3.8.11.1.jar * @author sunzhenyang on 2019-04-18 * * * 注:以下所有方法不能拋異常只能捕獲 不然會報錯 */ public class SqliteJDBCUtil { private static String dbFilePath=""; public static String getDbFilePath() { return dbFilePath; } /** * 生成一個DB文件 (創建連接) * @param filePath 生成文件夾的路徑 如:F:/fileTest/aabb.db * @return 當前DB文件的連接通道 */ public static Connection createRssDBFile(String filePath) { SqliteJDBCUtil.dbFilePath = filePath; Connection con=null; try { Class.forName("org.sqlite.JDBC"); //創建了一個sqlite的 .db文件 con = DriverManager.getConnection("jdbc:sqlite:"+filePath); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return con; } /** * 創建表 * @param con 某一個DB文件的連接 * @param createTableSql 創建表的語句 * @param tableName 表名 建表時判斷表是否存在 存在即刪除表 (可以不傳) * @throws SQLException */ public static void createTable(Connection con,String createTableSql,String tableName){ try { Statement stat = con.createStatement(); if(tableName != null && !"".equals(tableName)){ stat.executeUpdate("drop table if exists "+tableName+";"); } //創建表 stat.executeUpdate(createTableSql); } catch (SQLException e) { e.printStackTrace(); } } /** * 執行SQL 外部調用是直接設置SQL語句 以及參數 傳入后直接執行 * @throws SQLException */ public static void editSql(PreparedStatement prep,Connection con){ //執行處理 try { prep.addBatch(); } catch (SQLException e) { e.printStackTrace(); } } /** * 執行SQL * @throws SQLException */ public static PreparedStatement editSql(Connection con){ PreparedStatement prep=null; //向rssType表中插入數據 try { prep = con.prepareStatement("insert into tableTest values (?, ?, ?, ?);"); prep.setInt(1,1); prep.setString(2,"qqq"); prep.setInt(3,2); prep.setString(4,"11123"); prep.addBatch(); } catch (SQLException e) { e.printStackTrace(); } return prep; } /** * 提交SQL語句 * @param con * @param prep * @throws SQLException */ public static void submitSql(Connection con,PreparedStatement prep){ /** * 默認的話為自動提交, 每執行一個update ,delete或者insert的時候都會自動提交到數據庫,無法回滾事務。 * 設置connection.setautocommit(false); * 只有程序調用connection.commit()的時候才會將先前執行的語句一起提交到數據庫,這樣就實現了數據庫的事務。 * 還有一點是因為sqllite數據庫是一個 .db的文件 沒執行一次語句都要打開一次文件 所以加入事務將全部SQL放於緩存中一次性執行 只需要打開一次文件 */ try { con.setAutoCommit(false); prep.executeBatch(); //批量執行 con.setAutoCommit(true); } catch (SQLException e) { e.printStackTrace(); } } /** * 使用完一定要關閉連接 ***** 務必 切記 ***** * @param prep * @param con */ public static void close(PreparedStatement prep,Connection con){ try { if(prep!=null) prep.close(); if(con!=null) con.close(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) throws Exception { Connection con = SqliteJDBCUtil.createRssDBFile("F:/fileTest/demo.db"); //1,創建一個DB文件 StringBuffer createTableSql=new StringBuffer("create table tableTest ("); createTableSql.append("id INTEGER, name NTEXT,"); createTableSql.append("typeId INTEGER, logoUrl text"); createTableSql.append(");"); SqliteJDBCUtil.createTable(con, createTableSql.toString(), "tableTest"); //2,創建一個表 PreparedStatement prep = SqliteJDBCUtil.editSql(con); //3, 向表中插入SQL SqliteJDBCUtil.submitSql(con, prep); //提交 SqliteJDBCUtil.close(prep, con); } }