描述:

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. 零配置 – 无需安装和管理配置

3.储存在单一磁盘文件中的一个完整的数据库

4.数据库文件可以在不同字节顺序的机器间自由的共享

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);

        
    }
    
    
    
}