[Sqlite] Java使用jdbc連線Sqlite資料庫進行各種資料操作的詳細過程

mchdba發表於2014-08-29
前言:
      SQLite是遵守ACID 的關係型資料庫管理系統,它包含在一個相對小的C庫中。它是D.RichardHipp建立的公有領域專案。
       不像常見的客戶-伺服器範例,SQLite引擎不是個程式與之通訊的獨立程式,而是連線到程式中成為它的一個主要部分。所以主要的通訊協議是在程式語言內的直接API呼叫。這在消耗總量、延遲時間和整體簡單性上有積極的作用。整個資料庫(定義、表、索引和資料本身)都在宿主主機上儲存在一個單一的檔案中。它的簡單的設計是透過在開始一個事務的時候鎖定整個資料檔案而完成的。


一,準備sqlite資料來源
由於sqlite是記憶體資料庫,還會有一個資料檔案,本質上是去訪問一個檔案,所以可以把linux下的sqlite的庫檔案copy出來到自己筆記本本地,然後在呼叫java程式訪問操作sqlite庫。

(1),安裝sqlite
下載地址: Wget
開始安裝:
tar xvfz sqlite-autoconf-3080403.tar.gz
cd sqlite-autoconf-3080403
./configure --prefix=/usr/local
make
make install

(2),準備資料來源
[root@localhost sqlite-autoconf-3080403]# sqlite3 tim.db
SQLite version 3.8.4.3 2014-04-03 16:53:12
Enter ".help" for usage hints.
sqlite> .table
sqlite> create table t1(id int);
sqlite> insert into t1 select 1;
sqlite> .exit
[root@localhost sqlite-autoconf-3080403]# ll tim.db
-rw-r--r-- 1 root root 2048 Aug 29 09:34 tim.db
[root@localhost sqlite-autoconf-3080403]# 

(3),透過SecureFX工具把tim.db資料檔案copy到本地磁碟E盤根目錄下面,如下圖所示:




二,開始準備Eclipse環境
載入jdbc的jar包,jdbc的jar包 sqlitejdbc-v033-nested.jar,下載地址為:

並且將其新增到classpath系統環境變數中:點選java工程右鍵,選擇最後一個選項Properties,再選擇Java Build Path,再選擇Libraries,再選擇Add External JARs...,然後載入本地的sqlitejdbc-v033-nested.jar包載入路徑過程如下圖所示:



三,編寫java程式碼連線sqlite資料庫操作
(1),建立java程式碼測試類
  1. package foo;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.ResultSet;
  5. import java.sql.Statement;

  6. /**
  7.  * @author Tim
  8.  */
  9. public class JavaSqlite {

  10.     public static void main(String[] args) {
  11.         // TODO Auto-generated method stub
  12.         try {
  13.             // 0 連線SQLite的JDBC
  14.             String sql=\"jdbc:sqlite://e:/tim.db\";
  15.             Class.forName(\"org.sqlite.JDBC\");

  16.             // 1 建立一個資料庫名zieckey.db的連線,如果不存在就在當前目錄下建立之
  17.             Connection conn = DriverManager.getConnection(sql);
  18.             Statement stat = conn.createStatement();
  19.             
  20.             // 2 建立一個表tbl1,錄入資料
  21.             stat.executeUpdate(\"drop table if exists tbl1;\");
  22.             stat.executeUpdate(\"create table if not exists tbl1(name varchar(20), salary int);\");// 建立一個表,兩列
  23.             stat.executeUpdate(\"insert into tbl1 values(\'ZhangSan\',8000);\"); // 插入資料
  24.             stat.executeUpdate(\"insert into tbl1 values(\'LiSi\',7800);\");
  25.             stat.executeUpdate(\"insert into tbl1 values(\'WangWu\',5800);\");
  26.             stat.executeUpdate(\"insert into tbl1 values(\'ZhaoLiu\',9100);\");
  27.             ResultSet rs = stat.executeQuery(\"select * from tbl1;\"); // 查詢資料
  28.             System.out.println(\"建立表結構錄入資料操作演示:\");
  29.             while (rs.next()) { // 將查詢到的資料列印出來
  30.                 System.out.print(\"name = \" + rs.getString(\"name\") + \", \"); // 列屬性一
  31.                 System.out.println(\"salary = \" + rs.getString(\"salary\")); // 列屬性二
  32.             }
  33.             rs.close();
  34.             
  35.             
  36.             // 3 修改表結構,新增欄位 address varchar(20) default \'changsha\';
  37.             stat.executeUpdate(\"alter table tbl1 add column address varchar(20) not null default \'changsha\'; \");// 建立一個表,兩列
  38.             stat.executeUpdate(\"insert into tbl1 values(\'HongQi\',9000,\'tianjing\');\"); // 插入資料
  39.             stat.executeUpdate(\"insert into tbl1(name,salary) values(\'HongQi\',9000);\"); // 插入資料
  40.             rs = stat.executeQuery(\"select * from tbl1;\"); // 查詢資料
  41.             System.out.println(\"表結構變更操作演示:\");
  42.             while (rs.next()) { // 將查詢到的資料列印出來
  43.                 System.out.print(\"name = \" + rs.getString(\"name\") + \", \"); // 列屬性一
  44.                 System.out.print(\"name = \" + rs.getString(\"name\") + \", \"); // 列屬性二
  45.                 System.out.println(\"address = \" + rs.getString(\"address\")); // 列屬性三
  46.             }
  47.             rs.close();
  48.             
  49.             conn.close(); // 結束資料庫的連線
  50.             
  51.         } catch (Exception e) {
  52.             e.printStackTrace();
  53.         }

  54.     }

  55. }

四,除錯執行:

(1),第一次除錯報錯如下:
Exception in thread "main" java.lang.ClassNotFoundException: org.sqlite.JDBC
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)

解決方法:首先需要將sqlitejdbc-v056.jar包加入到工程中:
右鍵你的工程->Build Path->configure Build Path->Libraries->Add External JARs->
找到sqlitejdbc-v033-nested.jar包就可以了。

(2),再執行報錯如下:
jdbc:sqlite://E:/u/sqllite/db/powerlong_208.db
java.sql.SQLException: out of memory
at org.sqlite.DB.throwex(DB.java:252)
at org.sqlite.NestedDB.open(NestedDB.java:47)
at org.sqlite.Conn.(Conn.java:36)
at org.sqlite.JDBC.connect(JDBC.java:38)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at foo.Main.main(Main.java:41)

問題解決:是資料來源的路徑有問題,java不識別大寫的E:盤,String sql="jdbc:sqlite://E:/tim.db";中的E:換成e:就可以除錯透過了。


五,執行結果,程式碼類裡面右鍵選擇Run As,再選擇Java Application,執行結果如下所示:
建立表結構錄入資料操作演示:
name = ZhangSan, salary = 8000
name = LiSi, salary = 7800
name = WangWu, salary = 5800
name = ZhaoLiu, salary = 9100
表結構變更操作演示:
name = ZhangSan, name = ZhangSan, address = changsha
name = LiSi, name = LiSi, address = changsha
name = WangWu, name = WangWu, address = changsha
name = ZhaoLiu, name = ZhaoLiu, address = changsha
name = HongQi, name = HongQi, address = tianjing
name = HongQi, name = HongQi, address = changsha

操作介面如下所示:




六,後續繼續研究:
(1)windows下研究sqlite安裝使用
(2)java程式碼如何直接遠端連線linux上面的sqlite庫






來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26230597/viewspace-1259992/,如需轉載,請註明出處,否則將追究法律責任。

相關文章