频道栏目
首页 > 资讯 > SQL Server > 正文

Sqlite3的安装及应用讲解

17-11-24        来源:[db:作者]  
收藏   我要投稿

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  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数据库供开发人员使用,它的易用性可以加快应用程序的开发,并使得复杂的数据存储变得轻松了许多。

连接数据库

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
相关TAG标签
上一篇:Shell中的重定向方法区别
下一篇:Oracle的常用SQL语句(建议收藏)
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站