• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Sqlite3的安裝及應用

    標簽: sqlite3  jdbc  Java api

            SQLite,是一款輕型的數據庫,是遵守ACID的關系型數據庫管理系統,它包含在一個相對小的C庫中。SQLite是D.Richard Hipp用C語言編寫的開源嵌入式數據庫引擎,它支持大多數的SQL92標準。它的設計目標是嵌入式的,而且目前已經在很多嵌入式產品中使用了它,它占用資源非常的低,在嵌入式設備中,可能只需要幾百K的內存就夠了。它能夠Windows/Linux/Unix等等主流的操作系統,同時能夠跟很多程序語言相結合,比如 Tcl、C#、PHP、Java等,還有ODBC接口,同樣比起Mysql、PostgreSQL這兩款開源的世界著名數據庫管理系統來講,它的處理速度比他們都快。SQLite第一個Alpha版本誕生于2000年5月。至2015年已經有15個年頭,SQLite也迎來了一個版本SQLite 3已經發布。
            主流的sqlite3,占用內存小,處理時速度快,跨平臺,并且可以在所有主要的操作系統上運行。
            SQLite由以下幾個部分組成:SQL編譯器、內核、后端以及附件。SQLite通過利用虛擬機和虛擬數據庫引擎(VDBE),是調試、修改和擴展SQLite的內核變得更加方便。所有SQL語句都被編譯成易讀的、可以在SQLite虛擬機中執行的程序集。
            值得一提的是,袖珍型的SQLite竟然可以支持高達2TB大小的數據庫,每個數據庫都是以單個文件的形式存在,這些數據都是以B-Tree的數據結構形式存儲在磁盤上。
    在事務處理方面,SQLite通過數據庫級上的獨占性和共享鎖來實現獨立事務處理。這意味著多個進程可以在同一時間從同一數據庫讀取數據,但只有一個可以寫入數據。在某個進程或線程想數據庫執行寫操作之前,必須獲得獨占鎖。在獲得獨占鎖之后,其他的讀或寫操作將不會再發生。
            SQLite采用動態數據類型,當某個值插入到數據庫時,SQLite將會檢查它的類型,如果該類型與關聯的列不匹配,SQLite則會嘗試將該值轉換成該列的類型,如果不能轉換,則該值將作為本身的類型存儲,SQLite稱這為“弱類型”。但有一個特例,如果是INTEGER PRIMARY KEY,則其他類型不會被轉換,會報一個“datatype missmatch”的錯誤。

    概括來講,SQLite支持NULL、INTEGER、REAL、TEXT和BLOB數據類型,分別代表空值、整型值、浮點值、字符串文本、二進制對象。


    一、安裝
    1.Linux

    下載地址:http://download.csdn.net/download/sueiyuan_401/2357378
    [hadoop@h153 ~]$ tar -zxvf sqlite-3.3.7.tar.gz
    注意:因為需要編譯,所以在安裝之前你的Linux編譯工具已安裝,我這里一開始并沒有,于是在root用戶下執行yum -y install gcc*


    編譯:
    [hadoop@h153 ~]$ cd sqlite-3.3.7/
    [hadoop@h153 sqlite-3.3.7]$ ./configure
    [hadoop@h153 sqlite-3.3.7]$ make && make install
    注意:在安裝到hadoop用戶下的時候在這一步最后報錯/bin/install: cannot create regular file '/usr/local/lib/libsqlite3.so.0.8.6': Permission denied,所以應該在root用戶下執行
    [root@h153 sqlite-3.3.7]# su root
    [root@h153 sqlite-3.3.7]# make clean
    [root@h153 sqlite-3.3.7]# make && make install

    [root@h153 sqlite-3.3.7]# sqlite3 test.db	#創建數據庫
    SQLite version 3.3.7
    Enter ".help" for instructions
    sqlite> .output hehe.txt	#導出數據庫到SQL文件,CSV格式則寫成.output hehe.csv
    sqlite > .dump
    [root@h153 sqlite-3.3.7]# cat hehe.txt 
    BEGIN TRANSACTION;
    CREATE TABLE user(username text primary key, password text);
    INSERT INTO "user" VALUES('tianyou121', '123');
    CREATE TABLE mytable(id integer primary key, value text);
    INSERT INTO "mytable" VALUES(1, 'Micheal');
    CREATE VIEW nameview as select * from mytable;
    CREATE INDEX test_idx on mytable(value);
    COMMIT;
    sqlite > .read hehe.txt	#從SQL文件導入數據庫
    
    sqlite> create view nameview as select * from mytable;	#創建視圖
    sqlite> create index test_idx on mytable(value);	#創建索引
    sqlite> .indices mytable	#獲取指定表的索引列表
    test_idx
    最后,我們可以使用“.quit”或“.exit”退出SQLite。


    2.Windows 10
    官方的下載頁面是http://sqlite.org/download.html,選擇如圖所示下載


    將所下zip解壓后得到這三個文件


    將zip解壓到D盤上


    在D:\sqlite-tools-win32-x86-3210000中啟動cmd
    創建數據庫:

    D:\sqlite-tools-win32-x86-3210000>sqlite3 test.db
    SQLite version 3.21.0 2017-10-24 18:55:49
    Enter ".help" for usage hints.
    sqlite> .databases
    main: D:\sqlite-tools-win32-x86-3210000\test.db
    我們執行了sqlite3命令,參數就是數據庫的名稱,如果該數據庫已存在,則使用,如果不存在,則新建一個,這里我們簡單的在當前位置創建了test.db,你也可以在任何存在的并且可寫的目錄下創建自己的數據庫。(如果對于SQLite的命令不太熟悉,可以執行“.help”命令列出所有的命令清單進行查看)。
    sqlite> .help	#幫助信息
    .databases             List names and files of attached databases
    .dump ?TABLE? ...      Dump the database in an SQL text format
    .echo ON|OFF           Turn command echo on or off
    .exit                  Exit this program
    .explain ON|OFF        Turn output mode suitable for EXPLAIN on or off.
    .header(s) ON|OFF      Turn display of headers on or off
    .help                  Show this message
    .import FILE TABLE     Import data from FILE into TABLE
    .indices TABLE         Show names of all indices on TABLE
    .load FILE ?ENTRY?     Load an extension library
    .mode MODE ?TABLE?     Set output mode where MODE is one of:
                             csv      Comma-separated values
                             column   Left-aligned columns.  (See .width)
                             html     HTML <table> code
                             insert   SQL insert statements for TABLE
                             line     One value per line
                             list     Values delimited by .separator string
                             tabs     Tab-separated values
                             tcl      TCL list elements
    .nullvalue STRING      Print STRING in place of NULL values
    .output FILENAME       Send output to FILENAME
    .output stdout         Send output to the screen
    .prompt MAIN CONTINUE  Replace the standard prompts
    .quit                  Exit this program
    .read FILENAME         Execute SQL in FILENAME
    .schema ?TABLE?        Show the CREATE statements
    .separator STRING      Change separator used by output mode and .import
    .show                  Show the current values for various settings
    .tables ?PATTERN?      List names of tables matching a LIKE pattern
    .timeout MS            Try opening locked tables for MS milliseconds
    .width NUM NUM ...     Set column widths for "column" mode
    創建表:
    sqlite> CREATE TABLE person (id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(20), age SMALLINT);
    sqlite> .tables
    person
    sqlite> .schema person
    CREATE TABLE person (id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(20), age SMALLINT);
    在我們創建表之后,可以用“.tables”命令去查看已有的表,用“.schema”命令去查看表的結構,如果后面沒有表名做參數,則將會輸出所有表的建表語句。


    插入數據:
    sqlite> INSERT INTO person VALUES (NULL, 'john', 30);
    sqlite> SELECT * FROM person;
    1|john|30


    分析數據庫使用狀態:

    D:\sqlite-tools-win32-x86-3210000>sqlite3_analyzer test.db
    /** Disk-Space Utilization Report For test.db
    
    Page size in bytes................................ 4096
    Pages in the whole file (measured)................ 3
    Pages in the whole file (calculated).............. 3
    Pages that store data............................. 3          100.0%
    Pages on the freelist (per header)................ 0            0.0%
    Pages on the freelist (calculated)................ 0            0.0%
    Pages of auto-vacuum overhead..................... 0            0.0%
    Number of tables in the database.................. 3
    Number of indices................................. 0
    Number of defined indices......................... 0
    Number of implied indices......................... 0
    Size of the file in bytes......................... 12288
    Bytes of user payload stored...................... 18           0.15%
    
    *** Page counts for all tables with their indices *****************************
    。。。。。。(太多省略)
    二、管理工具:
    現在網絡上的SQLite管理工具很多,我向大家推薦一款好用的工具:SQLite Expert。
    打開D:\sqlite-tools-win32-x86-3210000\test.db

    三、在Java中使用SQLite:
    我們要想在Java中使用SQLite,需要下載SQLite相關驅動,推薦大家
    到http://www.xerial.org/trac/Xerial/wiki/SQLiteJDBC頁面去下載最新的驅動包,我下的版本是sqlite-jdbc-3.7.2.jar,體積有點大,因為它包含了Linux、Mac、Windows的本地類庫,如圖:

    下載了驅動之后,我們新建一個項目,名為sqlite:


    在上圖中,我們引入sqlite驅動包到類路徑下,然后建立一個db的文件夾,用于放置數據庫文件。最后我們看一下Test.java代碼:

    import java.sql.Connection;  
    import java.sql.DriverManager;  
    import java.sql.ResultSet;  
    import java.sql.Statement;  
      
    public class Test {  
        public static void main(String[] args) throws Exception {  
            Class.forName("org.sqlite.JDBC");
    //下面注釋掉的這行和連mysql的思想還有點不一樣,如果在D盤的sqlite-tools-win32-x86-3210000文件夾下不存在test.db,它則自動創建,如果有則就使用這個文件
    //        Connection conn = DriverManager.getConnection("jdbc:sqlite:D:/sqlite-tools-win32-x86-3210000/test.db");
            Connection conn = DriverManager.getConnection("jdbc:sqlite:db/test.db");
            Statement stmt = conn.createStatement();  
      
            stmt.executeUpdate("DROP TABLE IF EXISTS person");  
            stmt.executeUpdate("CREATE TABLE person(id INTEGER, name STRING)");  
            stmt.executeUpdate("INSERT INTO person VALUES(1, 'john')");  
            stmt.executeUpdate("INSERT INTO person VALUES(2, 'david')");  
            stmt.executeUpdate("INSERT INTO person VALUES(3, 'henry')");  
            ResultSet rs = stmt.executeQuery("SELECT * FROM person");  
            while (rs.next()) {  
                System.out.println("id=>" + rs.getInt("id") + ", name=>" + rs.getString("name"));  
            }  
            stmt.close();  
            conn.close();  
        }  
    }
    執行Test.java文件,結果如下:

    這個時候,在我們的db目錄下,就生成了一個test.db的文件:

    注:這樣的話就和mysql有很大的不同了啊,甚至都不需要安裝sqlite,直接把jar包導入就可以了。到這里明白“每個數據庫都是以單個文件的形式存在”的意思了,這樣感覺非常方便


    SQLite使用須知:
    目前沒有可用于 SQLite 的網絡服務器。從應用程序運行位于其他計算機上的 SQLite 的惟一方法是從網絡共享運行。這樣會導致一些問題,像 UNIX? 和 Windows? 網絡共享都存在文件鎖定問題。還有由于與訪問網絡共享相關的延遲而帶來的性能下降問題。
    SQLite 只提供數據庫級的鎖定。
    SQLite 沒有用戶帳戶概念,而是根據文件系統確定所有數據庫的權限。


    結束語:
    由于資源占用少、性能良好和零管理成本,嵌入式數據庫有了它的用武之地,像Android、iPhone都有內置的SQLite數據庫供開發人員使用,它的易用性可以加快應用程序的開發,并使得復雜的數據存儲變得輕松了許多。


    參考:
    http://blog.csdn.net/liuhe688/article/details/6712782


    以下代碼來自:http://www.runoob.com/sqlite/sqlite-java.html

    連接數據庫

    import java.sql.*;
    
    public class SQLiteJDBC
    {
      public static void main( String args[] )
      {
        Connection c = null;
        try {
          Class.forName("org.sqlite.JDBC");
          c = DriverManager.getConnection("jdbc:sqlite:db/test.db");
        } catch ( Exception e ) {
          System.err.println( e.getClass().getName() + ": " + e.getMessage() );
          System.exit(0);
        }
        System.out.println("Opened database successfully");
      }
    }
    創建表

    import java.sql.*;
    
    public class SQLiteJDBC
    {
      public static void main( String args[] )
      {
        Connection c = null;
        Statement stmt = null;
        try {
          Class.forName("org.sqlite.JDBC");
          c = DriverManager.getConnection("jdbc:sqlite:db/test.db");
          System.out.println("Opened database successfully");
    
          stmt = c.createStatement();
          String sql = "CREATE TABLE COMPANY " +
                       "(ID INT PRIMARY KEY     NOT NULL," +
                       " NAME           TEXT    NOT NULL, " + 
                       " AGE            INT     NOT NULL, " + 
                       " ADDRESS        CHAR(50), " + 
                       " SALARY         REAL)"; 
          stmt.executeUpdate(sql);
          stmt.close();
          c.close();
        } catch ( Exception e ) {
          System.err.println( e.getClass().getName() + ": " + e.getMessage() );
          System.exit(0);
        }
        System.out.println("Table created successfully");
      }
    }
    INSERT 操作
    import java.sql.*;
    
    public class SQLiteJDBC
    {
      public static void main( String args[] )
      {
        Connection c = null;
        Statement stmt = null;
        try {
          Class.forName("org.sqlite.JDBC");
          c = DriverManager.getConnection("jdbc:sqlite:db/test.db");
          c.setAutoCommit(false);
          System.out.println("Opened database successfully");
    
          stmt = c.createStatement();
          String sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " +
                       "VALUES (1, 'Paul', 32, 'California', 20000.00 );"; 
          stmt.executeUpdate(sql);
    
          sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " +
                "VALUES (2, 'Allen', 25, 'Texas', 15000.00 );"; 
          stmt.executeUpdate(sql);
    
          sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " +
                "VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );"; 
          stmt.executeUpdate(sql);
    
          sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " +
                "VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );"; 
          stmt.executeUpdate(sql);
    
          stmt.close();
          c.commit();
          c.close();
        } catch ( Exception e ) {
          System.err.println( e.getClass().getName() + ": " + e.getMessage() );
          System.exit(0);
        }
        System.out.println("Records created successfully");
      }
    }
    SELECT 操作
    import java.sql.*;
    
    public class SQLiteJDBC
    {
      public static void main( String args[] )
      {
        Connection c = null;
        Statement stmt = null;
        try {
          Class.forName("org.sqlite.JDBC");
          c = DriverManager.getConnection("jdbc:sqlite:db/test.db");
          c.setAutoCommit(false);
          System.out.println("Opened database successfully");
    
          stmt = c.createStatement();
          ResultSet rs = stmt.executeQuery( "SELECT * FROM COMPANY;" );
          while ( rs.next() ) {
             int id = rs.getInt("id");
             String  name = rs.getString("name");
             int age  = rs.getInt("age");
             String  address = rs.getString("address");
             float salary = rs.getFloat("salary");
             System.out.println( "ID = " + id );
             System.out.println( "NAME = " + name );
             System.out.println( "AGE = " + age );
             System.out.println( "ADDRESS = " + address );
             System.out.println( "SALARY = " + salary );
             System.out.println();
          }
          rs.close();
          stmt.close();
          c.close();
        } catch ( Exception e ) {
          System.err.println( e.getClass().getName() + ": " + e.getMessage() );
          System.exit(0);
        }
        System.out.println("Operation done successfully");
      }
    }
    運行結果:
    Opened database successfully
    ID = 1
    NAME = Paul
    AGE = 32
    ADDRESS = California
    SALARY = 20000.0
    
    ID = 2
    NAME = Allen
    AGE = 25
    ADDRESS = Texas
    SALARY = 15000.0
    
    ID = 3
    NAME = Teddy
    AGE = 23
    ADDRESS = Norway
    SALARY = 20000.0
    
    ID = 4
    NAME = Mark
    AGE = 25
    ADDRESS = Rich-Mond 
    SALARY = 65000.0
    
    Operation done successfully
    UPDATE 操作
    import java.sql.*;
    
    public class SQLiteJDBC
    {
      public static void main( String args[] )
      {
        Connection c = null;
        Statement stmt = null;
        try {
          Class.forName("org.sqlite.JDBC");
          c = DriverManager.getConnection("jdbc:sqlite:db/test.db");
          c.setAutoCommit(false);
          System.out.println("Opened database successfully");
    
          stmt = c.createStatement();
          String sql = "UPDATE COMPANY set SALARY = 25000.00 where ID=1;";
          stmt.executeUpdate(sql);
          c.commit();
    
          ResultSet rs = stmt.executeQuery( "SELECT * FROM COMPANY;" );
          while ( rs.next() ) {
             int id = rs.getInt("id");
             String  name = rs.getString("name");
             int age  = rs.getInt("age");
             String  address = rs.getString("address");
             float salary = rs.getFloat("salary");
             System.out.println( "ID = " + id );
             System.out.println( "NAME = " + name );
             System.out.println( "AGE = " + age );
             System.out.println( "ADDRESS = " + address );
             System.out.println( "SALARY = " + salary );
             System.out.println();
          }
          rs.close();
          stmt.close();
          c.close();
        } catch ( Exception e ) {
          System.err.println( e.getClass().getName() + ": " + e.getMessage() );
          System.exit(0);
        }
        System.out.println("Operation done successfully");
      }
    }
    運行結果:
    Opened database successfully
    ID = 1
    NAME = Paul
    AGE = 32
    ADDRESS = California
    SALARY = 25000.0
    
    ID = 2
    NAME = Allen
    AGE = 25
    ADDRESS = Texas
    SALARY = 15000.0
    
    ID = 3
    NAME = Teddy
    AGE = 23
    ADDRESS = Norway
    SALARY = 20000.0
    
    ID = 4
    NAME = Mark
    AGE = 25
    ADDRESS = Rich-Mond 
    SALARY = 65000.0
    
    Operation done successfully
    DELETE 操作
    import java.sql.*;
    
    public class SQLiteJDBC
    {
      public static void main( String args[] )
      {
        Connection c = null;
        Statement stmt = null;
        try {
          Class.forName("org.sqlite.JDBC");
          c = DriverManager.getConnection("jdbc:sqlite:db/test.db");
          c.setAutoCommit(false);
          System.out.println("Opened database successfully");
    
          stmt = c.createStatement();
          String sql = "DELETE from COMPANY where ID=2;";
          stmt.executeUpdate(sql);
          c.commit();
    
          ResultSet rs = stmt.executeQuery( "SELECT * FROM COMPANY;" );
          while ( rs.next() ) {
             int id = rs.getInt("id");
             String  name = rs.getString("name");
             int age  = rs.getInt("age");
             String  address = rs.getString("address");
             float salary = rs.getFloat("salary");
             System.out.println( "ID = " + id );
             System.out.println( "NAME = " + name );
             System.out.println( "AGE = " + age );
             System.out.println( "ADDRESS = " + address );
             System.out.println( "SALARY = " + salary );
             System.out.println();
          }
          rs.close();
          stmt.close();
          c.close();
        } catch ( Exception e ) {
          System.err.println( e.getClass().getName() + ": " + e.getMessage() );
          System.exit(0);
        }
        System.out.println("Operation done successfully");
      }
    }
    運行結果:
    Opened database successfully
    ID = 1
    NAME = Paul
    AGE = 32
    ADDRESS = California
    SALARY = 25000.0
    
    ID = 3
    NAME = Teddy
    AGE = 23
    ADDRESS = Norway
    SALARY = 20000.0
    
    ID = 4
    NAME = Mark
    AGE = 25
    ADDRESS = Rich-Mond 
    SALARY = 65000.0
    
    Operation done successfully
    補充:我已將本文章所需的安裝包、jdbc包什么的上傳http://download.csdn.net/download/m0_37739193/10130520


    版權聲明:本文為m0_37739193原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/m0_37739193/article/details/78618420

    智能推薦

    sqlite3 使用

      sqlite3 usage     1. 以系統聯系人為例 介紹如何使用之     [步驟] 1. 進入 <sdk>/tools  我的命令如下:     2. 列出emulator 所以可用application 列表      3. 進入聯系人ContentProvid...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    猜你喜歡

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    統計學習方法 - 樸素貝葉斯

    引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...

    styled-components —— React 中的 CSS 最佳實踐

    https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...

    基于TCP/IP的網絡聊天室用Java來實現

    基于TCP/IP的網絡聊天室實現 開發工具:eclipse 開發環境:jdk1.8 發送端 接收端 工具類 運行截圖...

    精品国产乱码久久久久久蜜桃不卡