SQLite數據庫相較於咱們經常使用的Mysql,Oracle而言,實在是輕量得不行(最低只佔幾百K的內存)。平時開發或生產環境中使用各類類型的數據庫,可能都須要先安裝數據庫服務(server),而後才能經過代碼、命令行或者客戶端工具來操做數據庫,可是SQLite卻有點別具一格,它是一個文件型的關係數據庫,徹底不用你安裝,也不須要任何的配置或依賴,去官網下載編譯好的二進制文件解壓就可使用——第一次使用時,同事直接拷給我一個文件,說這就是SQLite了,我擦嘞還驚了一下,居然直接對着文件就能執行CRUD命令,這徹底刷新了我對數據庫的認知。而它的官網/When to use SQLite也說得特別明確:SQLite is not directly comparable to client/server SQL database engines such as MySQL, Oracle, or SQL Server since SQLite is trying to solve a different problem。是的,它的出現並非爲了和 Mysql,Oracle等數據庫競爭,而是爲了解決不一樣的問題;那麼哪些場景適合使用SQLite,哪些場景又適合client/server型數據庫呢?博主原本也想問度孃的,可是發現官網中就有最最合適的解釋:Client/server SQL database engines strive to implement a shared repository of enterprise data; SQLite strives to provide local data storage for individual applications and devices。意譯過來就是說,client/server型的數據庫適合於共享數據的存儲—— 一個server端存儲數據,N個客戶端均可以對數據進行CRUD的操做;而SQLite就徹底是一種本地化的文件存儲,加之其很是的輕量,特別適合我的應用和設備,因此,你會發現SQLite在嵌入式設備開發好比移動開發中應用得很是普遍。博主雖然不是作嵌入式開發的,可是用了一下SQLite發現特別小巧好用,建議你們若是應用程序是併發量不是特別高本地應用,徹底能夠嘗試使用SQLite這種輕量的數據庫來代替,也省去了安裝繁重的數據庫服務對系統資源的佔用。好了,如今正式切入正題,跟着布衣博主一塊兒來嘗試使用SQLite的一些簡單招式——html
要使用SQLite數據庫,若是沒有好同事拷貝給你,就本身去官網下吧。點擊官網下載頁就能夠下載最新的SQLite版本(SQLite3),頁面也給出了針對不一樣平臺的下載版本——java
對於Windows 64位操做系統,網上的一些教程都是說要把圖中的 1 、2 一塊兒下載解壓在同一個文件,可是博主不太喜歡盲從,喜歡琢磨緣由,一番嘗試後發現,其實只須要下載工具壓縮包 2 就能夠進行正常的數據庫操做了,而對於 1 中動態連接庫文件的做用,博主也始終沒搞明白,在此還望經常使用Sqlite的高人能指點一二,博主感激涕零!!!sql
上圖中 1 下載的壓縮包解壓後會有三個文件可執行文件 sqldiff.exe、sqlite3.exe和sqlite3_analyzer.exe,開啓cmd切換到解壓目錄,就能夠直接經過sqlite3執行SQL命令來操做數據庫。這裏要注意,若是直接雙擊sqlite3打開命令行執行後續命令每每是沒有效果的,博主一番嘗試也無解;有效的方式是切換到該目錄後以 sqlite3 + 數據庫名 的方式開始令行,若是數據庫存在就會直接使用,不存在就會建立一個新的數據庫:數據庫
須要說明的是,博主嘗試後發現建立的數據庫名能夠是任意的名字,並不必定是.db 結尾,只不過出於規範化的考量,最好仍是加上後綴,這樣一看便知是數據庫文件。SQLite的命令都是點命令,也就是說都是用 . 開頭,而且不以 ; 結尾,使用過程當中多熟悉一下就習慣了。這裏博主也只是簡單演示,具體命令行能夠 .help 查看或者經過百度、官網渠道查詢,博主不贅述。併發
百度一下,你會發現SQLite有一些專門針對性的可視化鏈接工具,應該都比較好用,博主沒有去嘗試過,不過使用通用版的Navicat也能夠鏈接SQLite,本着工具歸一的原則,也就沒有必要單獨去下載其餘鏈接工具了。創建數據庫鏈接也很簡單,不一樣於其餘數據庫須要IP、端口以及用戶名、密碼,SQLite只須要找到咱們的建立的數據庫文件掛載,就至關於鏈接到相應的數據庫了;而新建也很簡單,在建庫目錄下定義好庫文件名字就就能夠了,下圖中1 、2 分別顯示瞭如何鏈接現有的庫文件和建立新的數據庫——app
看似簡單,原本無需多言的,可是愛折騰的布衣博主卻有個匪夷所思的發現:使用 Navicat Premium 本進行SQLite的連庫和建立新庫的過程當中,根本不須要依賴本身下載解壓的那兩個壓縮包——新建鏈接的時候我甚至能夠掛載一個txt文件併成功創建起鏈接,並且能進行正常的數據庫SQL操做;建立庫的時候我也能夠在任意位置建立任意名字、後綴名的數據庫,一樣能正常SQL操做。這樣就有點意思了,也就是說電腦上的一切非目錄文件只要你心情好均可以創建鏈接當成數據庫來使用,太膩(bian)害(tai)了吧?博主換了不一樣的計算機,包括使用Linux系統,嘗試事後都是如此,惟一合理的解釋就是 Navicat Premium 這廝自己就內置了SQLite數據庫引擎,因此才能直接鏈接以及建立數據庫。(其實不論是Windows系統仍是Linux系統你均可以在系統用戶目錄發現Navicat的鏈接對象文件)ide
學習一個新的數據庫,大致從幾個方面來了解它——存儲結構、操做語言以及支持存儲的數據類型。既然SQLite是一種關係型數據庫,那麼就支持通用的SQL語言,因此你大可將你深厚的SQL功力運用到SQLite身上愉快的進行你的CRUD操做(固然,一些內置函數和SQL語法仍是有所不一樣)。SQLite比較特殊的其實在於它粗放式的數據存儲類型,並且並不強制的進行類型約束,這點和其餘關係型數據庫有很大的不一樣。如此的結果就是,雖然建立表的時候你指定了某一列應該用什麼數據類型,但實際上你是能夠胡來的,好比向整型列中插入文本數據,向字符型中插入日期等等(有個特殊狀況就是建表時主鍵設置若爲INTEGER PRIMARY KEY【原文:except an INTEGER PRIMARY KEY column】就只能插入整數,插入其餘數據類型會報錯)。至於緣由,SQLite官網數據類型頁面中Datatypes In SQLite段講得很清楚,博主轉述過來就是說:傳統的關係型數據庫採用的是靜態數據類型系統,一個字段值的數據類型由存儲其值的列容器決定,而SQLite採用更通用的動態數據類型系統,一個字段的數據類型只與其值自己有關,而與存儲它的容器無關。函數
按照官網描述,SQLite支持的數據類型分爲如下 5 個存儲類型:高併發
別看只有基本的 5 種存儲類型支持,但因爲SQLite採用的是動態數據類型系統,並且存儲類較之普通的數據類型是更加籠統的包含關係,所以能徹底兼容其它靜態數據類型系統的關係型數據庫。可是這種太自由化的存儲仍是有些問題的,好比一個數據列我同時存了一個 400 整型值和 '500' 的文本類型值,這兩個值數據類型不同,我這麼比較?因此,根據SQLite官網的說法,爲了最大限度與其餘關係型數據庫兼容,SQLite對數據類型進行了很精巧的設計,就是讓數據列具備類型親和性的特性(其實博主更喜歡某些人翻譯的 類型近似 這種叫法)。當咱們建立表作字段類型聲明的時候,實際上只是代表了該列具備的近似類型,在正式插入數據的時候,SQLite引擎纔會基於該列的近似類型優先推薦使用 5 種存儲類型中的哪種來存儲你的數據——注意是推薦,並不強制,也就是說只要你想要亂搞,SQLite也並不會限制你,SQLite是列自由的。因此,建表時字段類型聲明的限制在SQLite中是被弱化了的。在最新的SQLite版本中,數據庫的每一列都被定義爲如下 5 種近似類型的一種,其定義和規則官網/Determination Of Column Affinity段中有作出解釋:工具
官網上/Affinity Name Examples段落中有一份表格羅列了傳統數據類型做爲子集與上述 5 種近似類型如何對應的關係。基於上述近似類型的列敘,能夠看出SQLite是從聲明類型的字符串中去匹配列的近似類型來決定數據的存儲類的,所以SQLite頗有意思的是建立表時類型聲明能夠很隨意,好比我能夠聲明一個不存在類型的字符串」chenbenbuyi」,但SQLite會根據規則自動識別爲NUMERIC的近似類型,並據此近似類型存儲個人數據——
可能有些人對於上面的數據存儲類仍是有些疑惑——根據列的近似類型是如何推斷數據存入後的最終類型呢?按博主的理解,SQLite在基於類型近似作數據存儲轉換的時候是有個推薦優先級的。好比上面的聲明中,並不存在name聲明的數據類型,因此數據庫會自動匹配爲NUMERIC的近似類型。當文本數據('23')被插入到該列時,若是轉換操做不會致使數據信息丟失以及徹底可逆,那麼SQLite就會將該文本數據優先轉換爲INTEGER或REAL類型的數據(NULL或BLOB類型數據不作轉換),轉換不成功纔會按照文本數據存儲——這裏能轉換INTEGER成功;若是存儲列的近似類型爲TEXT,那麼天然數據存儲的優先存儲類是TEXT,因此哪怕你存儲的是整型數字,結果存的依然是TEXT。這就是類型近似在數據存儲中的應用。
代碼鏈接比較基礎簡單,博主簡單操做一盤,權當複習,雖然實際項目中不多用得這麼基礎。基本上呢,代碼操做數據庫的步驟能夠歸納爲:加載驅動、獲取鏈接、建立預編譯對象、執行SQL、釋放資源,順口溜一句就是「賈璉欲執釋」。按照這個步驟,首先是要下載SQLite的驅動程序包,將包添加到IDE中並Build Path,而後愉快的擼碼操做——
1 import java.sql.*; 2 3 public class SQLiteTest { 4 public static void main(String[] args) { 5 String driver = "org.sqlite.JDBC"; 6 String url = "jdbc:sqlite:E:\\test.db"; 7 String sql = "select * from chenbenbuyi"; 8 Connection conn = null; 9 Statement stmt = null; 10 ResultSet rs = null; 11 try { 12 //加載驅動 13 Class.forName(driver); 14 //獲取鏈接 15 conn = DriverManager.getConnection(url); //sqlite不須要密碼 16 //建立預編譯對象 17 stmt = conn.createStatement(); 18 //執行sql 19 rs = stmt.executeQuery(sql); 20 while (rs.next()) { 21 String s = rs.getString("x") +":"+rs.getString("y")+":"+rs.getString("z"); 22 System.out.println(s); 23 } 24 } catch (Exception e) { 25 e.printStackTrace(); 26 } finally { 27 //釋放資源:必定要在finally中確保資源被釋放 28 if (null != rs) { 29 try { 30 rs.close(); 31 } catch (SQLException e) { 32 e.printStackTrace(); 33 } 34 } 35 if (null != stmt) { 36 try { 37 stmt.close(); 38 } catch (SQLException e) { 39 e.printStackTrace(); 40 } 41 } 42 if (null != conn) { 43 try { 44 conn.close(); 45 } catch (SQLException e) { 46 e.printStackTrace(); 47 } 48 } 49 } 50 51 } 52 }
①Sqlite沒有單獨的布爾存儲類型,它使用INTEGER做爲存儲類型,0爲false,1爲true;
②Sqlite沒有單獨的日期和時間存儲類,內置的sqlite日期和時間函數可以將日期和時間以TEXT,REAL或INTEGER形式存放;
③基於輕量的設計取捨,SQLite的鎖粗粒比較粗,當一個寫鏈接要寫數據庫,全部其它的鏈接被鎖住,直到寫鏈接結束了它的事務,因此多個進程能夠同時對SQLIte進行SELECT操做,但在任一時刻,只能有一個進程對數據庫進行更改。SQLite由於不適合於高併發的場景。
好了,做爲入門,不可能對SQLite講述得太全面,但帶你入門徹底夠了,因此本博暫時先止於此。鑑於布衣博主的博客被copy盜取太多,百度一搜甚是氣憤,在此鄭重申明:轉載請得到博主容許並註明出處以及給出原文連接,不然。。。中國這版權行情博主一屌絲也不能把你怎樣,但你的良心就真的不會痛耶?。
結尾涕泣,不知所云。
個人博客即將搬運同步至騰訊雲+社區,邀請你們一同入駐:https://cloud.tencent.com/developer/support-plan