Java中對SQLite數據庫操作 操作db文件


描述:

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

        
    }
    
    
    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM