SQLite 带你入门

  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 的存储类型

  学习一个新的数据库,大致从几个方面来了解它——存储结构、操做语言以及支持存储的数据类型。既然SQLite是一种关系型数据库,那么就支持通用的SQL语言,因此你大可将你深厚的SQL功力运用到SQLite身上愉快的进行你的CRUD操做(固然,一些内置函数和SQL语法仍是有所不一样)。SQLite比较特殊的其实在于它粗放式的数据存储类型,并且并不强制的进行类型约束,这点和其余关系型数据库有很大的不一样。如此的结果就是,虽然建立表的时候你指定了某一列应该用什么数据类型,但实际上你是能够胡来的,好比向整型列中插入文本数据,向字符型中插入日期等等(有个特殊状况就是建表时主键设置若为INTEGER PRIMARY KEY【原文:except an INTEGER PRIMARY KEY column】就只能插入整数,插入其余数据类型会报错)。至于缘由,SQLite官网数据类型页面中Datatypes In SQLite段讲得很清楚,博主转述过来就是说:传统的关系型数据库采用的是静态数据类型系统,一个字段值的数据类型由存储其值的列容器决定,而SQLite采用更通用的动态数据类型系统,一个字段的数据类型只与其值自己有关,而与存储它的容器无关。函数

  按照官网描述,SQLite支持的数据类型分为如下 5 个存储类型:高并发

  •  NULL     空值
  •  INTEGER  带符号整型,根据其大小存储在1, 2, 3, 4, 6,或 8 字节中
  •  REAL   浮点型,存储为一个 8 字节的IEEE 浮点数
  •  TEXT   文本类型 (UTF-8, UTF-16BE 或 UTF-16LE编码格式)
  •  BLOB     全型(布衣博主本身给的称谓),存什么就是什么

  别看只有基本的 5 种存储类型支持,但因为SQLite采用的是动态数据类型系统,并且存储类较之普通的数据类型是更加笼统的包含关系,所以能彻底兼容其它静态数据类型系统的关系型数据库。可是这种太自由化的存储仍是有些问题的,好比一个数据列我同时存了一个 400 整型值和 '500' 的文本类型值,这两个值数据类型不同,我这么比较?因此,根据SQLite官网的说法,为了最大限度与其余关系型数据库兼容,SQLite对数据类型进行了很精巧的设计,就是让数据列具备类型亲和性的特性(其实博主更喜欢某些人翻译的 类型近似 这种叫法)。当咱们建立表作字段类型声明的时候,实际上只是代表了该列具备的近似类型,在正式插入数据的时候,SQLite引擎才会基于该列的近似类型优先推荐使用 5 种存储类型中的哪种来存储你的数据——注意是推荐,并不强制,也就是说只要你想要乱搞,SQLite也并不会限制你,SQLite是列自由的。因此,建表时字段类型声明的限制在SQLite中是被弱化了的。最新的SQLite版本中,数据库的每一列都被定义为如下 5 种近似类型的一种,其定义和规则官网/Determination Of Column Affinity段中有作出解释:工具

  •  INTEGER  整型,若是声明的字段类型包含字符串“INT”(注意,SQLite大多数状况都不区分大小写,下同),那么该字段类型被分配为INTEGER 近似类型
  •  TEXT     文本,若是为字段声明的类型中包含了'CHAR'、'CLOB'或'TEXT',该字段被分配为TEXT亲和性。好比'VARCHAR'包含了'CHAR',因此被分配为TEXT 近似类型
  •  BLOB     无类型,若是为字段声明的类型中包含了'BLOB',或者没有为该字段声明类型,该字段被分配为BLOB 近似类型
  •  REAL     浮点型,若是为字段声明的类型中包含了'REAL'、'FLOA'或'DOUB',则该字段被分配为REAL 近似类型
  •  NUMERIC  数值型,除以上状况外的类型,则被分配为NUMERIC 近似类型

  官网上/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

相关文章
相关标签/搜索