Java và SQLite [đã đóng]


333

Tôi bị thu hút bởi sự gọn gàng mà một cơ sở dữ liệu tệp duy nhất cung cấp. Thư viện trình điều khiển / trình kết nối nào hiện có để kết nối và sử dụng SQLite với Java.

Tôi đã phát hiện ra một thư viện trình bao bọc, http://www.ch-werner.de/javasqlite , nhưng có các dự án nổi bật khác có sẵn không?


9
Tôi thích rằng một câu hỏi với hàng trăm câu hỏi và câu trả lời có hàng trăm câu hỏi, được đóng lại là "lạc đề". Thật là xấu hổ, lol
Andrew Koster

Câu trả lời:


196

Các wiki liệt kê một số wrappers hơn:

  • Trình bao bọc Java (xung quanh giao diện SWIG): http://tk-software.home.comcast.net/
  • Một hướng dẫn tốt để sử dụng trình điều khiển JDBC cho SQLite. (nó hoạt động ít nhất!) http://www.ci.uchicago.edu/wiki/bin/view/VDS/VDSDevelopment/UsingQueryite
  • Trình điều khiển JDBC đa nền tảng sử dụng các thư viện SQLite gốc được nhúng trên Windows, Linux, OS X và quay lại triển khai Java thuần túy trên các HĐH khác: https://github.com/xerial/sqlite-jdbc (trước đây là zentus )
  • Một trình bao bọc Java - SWIG khác. Nó chỉ hoạt động trên Win32. http://rodolfo_3.tripod.com/index.html
  • sqlite-java-shell: Cổng Java thuần 100% của trình vỏ dòng lệnh sqlite3 được xây dựng với NestedVM. (Đây không phải là trình điều khiển JDBC).
  • Trình điều khiển JDBC SQLite cho Mysaifu JVM: Trình điều khiển JDBC SQLite cho Thư viện Mysaifu JVM và SQLite JNI cho Windows (x86) và Linux (i386 / PowerPC).

7
Bổ sung của tôi vào danh sách này là sqlite4java - code.google.com/p/sqlite4java - đó là một trình bao bọc (không có JDBC); tiền biên dịch cho Windows, Mac, Linux. Thật đơn giản để sử dụng và nó thực thi một số hợp đồng để giúp nhà phát triển tránh lạm dụng SQLite.
sereda

7
sqlite4java có vẻ thú vị, nhưng họ cũng có một so sánh tuyệt vời về các trình bao bọc khác nhau ngoài đó: code.google.com/p/sqlite4java/wiki/ComparisonToOtherWrappers
Scott Bennett-McLeish

1
@kdt vấn đề tôi tìm thấy với trình điều khiển zentus là nó dường như không hỗ trợ BLOB chút nào
Martijn

12
@Martijn xerial.org/trac/Xerial/wiki/SQLiteJDBC là một nhánh của trình điều khiển của zentus và hỗ trợ BLOB (có một tut ngắn trên trang web của họ).
johnharris85


247

Tôi tìm thấy câu hỏi của bạn trong khi tìm kiếm thông tin với SQLite và Java. Chỉ cần nghĩ rằng tôi sẽ thêm câu trả lời của mình mà tôi cũng đã đăng trên blog của mình .

Tôi đã được mã hóa trong Java một thời gian. Tôi cũng đã biết về SQLite nhưng chưa bao giờ sử dụng nó. Tôi cũng đã sử dụng nó thông qua các ứng dụng khác nhưng chưa bao giờ trong một ứng dụng mà tôi đã mã hóa. Vì vậy, tôi cần nó cho một dự án trong tuần này và nó sử dụng rất đơn giản!

Tôi đã tìm thấy trình điều khiển JDBC Java cho SQLite. Chỉ cần thêm tệp JAR vào đường dẫn lớp của bạn và nhập java.sql. *

Ứng dụng thử nghiệm của anh ta sẽ tạo một tệp cơ sở dữ liệu, gửi một số lệnh SQL để tạo bảng, lưu trữ một số dữ liệu trong bảng và đọc lại và hiển thị trên bảng điều khiển. Nó sẽ tạo tệp test.db trong thư mục gốc của dự án. Bạn có thể chạy ví dụ này với java -cp .:sqlitejdbc-v056.jar Test.

package com.rungeek.sqlite;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

public class Test {
    public static void main(String[] args) throws Exception {
        Class.forName("org.sqlite.JDBC");
        Connection conn = DriverManager.getConnection("jdbc:sqlite:test.db");
        Statement stat = conn.createStatement();
        stat.executeUpdate("drop table if exists people;");
        stat.executeUpdate("create table people (name, occupation);");
        PreparedStatement prep = conn.prepareStatement(
            "insert into people values (?, ?);");

        prep.setString(1, "Gandhi");
        prep.setString(2, "politics");
        prep.addBatch();
        prep.setString(1, "Turing");
        prep.setString(2, "computers");
        prep.addBatch();
        prep.setString(1, "Wittgenstein");
        prep.setString(2, "smartypants");
        prep.addBatch();

        conn.setAutoCommit(false);
        prep.executeBatch();
        conn.setAutoCommit(true);

        ResultSet rs = stat.executeQuery("select * from people;");
        while (rs.next()) {
            System.out.println("name = " + rs.getString("name"));
            System.out.println("job = " + rs.getString("occupation"));
        }
        rs.close();
        conn.close();
    }
  }

1
Đây là lý do tại sao tôi nghĩ rằng Joel đang nói con bò (Google nghệ nói: youtube.com/watch?v=NWHfY_lvKIQ ) khi nói rằng thiết kế stackoverflow.com là tốt hơn bởi vì tất cả các bài viết "cũ" treo xung quanh trên internet. Nó chỉ là một buổi tập lại.
Nikolaos

26
Cũng lưu ý rằng dự án Crawshaw dường như bị gián đoạn, nhưng đã được rẽ nhánh và cập nhật tại đây: xerial.org/trac/Xerial/wiki/QueryiteJDBC
lapo

8
zentus.com dường như bị hỏng, tìm thấy gương ở đây; Priede.bf.lu.lv/pub/DatuBazes/SQLite/SqliteJDBC/about.htmlm
Daniel Magnusson

3
Cảm ơn @DanielMagnusson, bạn là người cứu rỗi. Trong khi về chủ đề này, bất kỳ ai vẫn đang tìm kiếm trình điều khiển sqliteJDBC đều có thể truy cập prede.bf.lu.lv/pub/DatuBazes/Queryite/SqliteJDBC/ .
javatarz


30

Tôi hiểu bạn đã hỏi cụ thể về SQLite, nhưng có lẽ cơ sở dữ liệu HSQL sẽ phù hợp hơn với Java. Nó được viết bằng chính Java, chạy trong JVM, hỗ trợ các bảng trong bộ nhớ, v.v. và tất cả các tính năng đó làm cho nó hoàn toàn có thể sử dụng để tạo mẫu và kiểm tra đơn vị.


3
Có HSQL là một lựa chọn rất tốt và tôi đã sử dụng nó khá nhiều trong một vài ứng dụng khách để có hiệu quả tốt. Trong trường hợp này, tuy nhiên, tôi thực sự muốn sử dụng SQLite.
Scott Bennett-McLeish

18

Dự án David Crawshaw (sqlitejdbc-v056.jar) dường như đã hết hạn và bản cập nhật cuối cùng là ngày 20 tháng 6 năm 2009, nguồn tại đây

Tôi sẽ giới thiệu ngã ba Xerials của trình bao bọc Crawlaw sqlite. Tôi đã thay thế tệp sqlitejdbc-v056.jar bằng tệp Xerials sqlite-jdbc-3.7.2.jar mà không gặp vấn đề gì.

Sử dụng cú pháp giống như trong câu trả lời của Bernie và nhanh hơn nhiều và với thư viện sqlite mới nhất.

Có gì khác với JDBC SQLite của Zentus?

Trình điều khiển JDBC SQLite ban đầu của Zentus http://www.zentus.com/sqlitejdbc/ là một tiện ích tuyệt vời để sử dụng cơ sở dữ liệu SQLite từ ngôn ngữ Java và thư viện SQLiteJDBC của chúng tôi cũng phụ thuộc vào việc triển khai. Tuy nhiên, phiên bản java thuần của nó, dịch hoàn toàn mã c / c ++ của SQLite sang Java, chậm hơn đáng kể so với phiên bản gốc của nó, sử dụng các nhị phân SQLite được biên dịch cho mỗi HĐH (win, mac, linux).

Để sử dụng phiên bản gốc của sqlite-jdbc, người dùng phải đặt đường dẫn đến mã gốc (dll, jnilib, vì vậy các tệp, là các chương trình JNDI C) bằng cách sử dụng các đối số dòng lệnh, ví dụ: -Djava.l Library.path = (đường dẫn đến dll, jnilib, v.v.) hoặc -Dorg.sqlite.lib.path, v.v. Quá trình này dễ bị lỗi và gây khó chịu khi nói với mọi người dùng để đặt các biến này. Thư viện SQLiteJDBC của chúng tôi hoàn toàn loại bỏ những bất tiện này.

Một điểm khác biệt nữa là chúng tôi luôn cập nhật phiên bản SQLiteJDBC này cho phiên bản mới nhất của công cụ SQLite, bởi vì chúng tôi là một trong những người dùng nóng nhất của thư viện này. Ví dụ, SQLite JDBC là thành phần cốt lõi của Bộ công cụ UTGB (Trình duyệt bộ gen của Đại học Tokyo), đây là tiện ích của chúng tôi để tạo các trình duyệt bộ gen được cá nhân hóa.

EDIT : Như thường lệ khi bạn cập nhật một cái gì đó, sẽ có một số vấn đề ở một nơi tối nghĩa trong mã của bạn (đã xảy ra với tôi). Kiểm tra thử nghiệm kiểm tra =)


1
Các sqlite-jdbcdự án là rất tốt, nhưng lưu ý rằng nó là Apache được cấp phép . Do đó, bạn phải ghi công nếu bạn sử dụng nó, cho dù mã của bạn là FOSS hay độc quyền.
dotancohen

16

Có một dự án SQLJet mới là triển khai SQLite thuần túy của SQLite. Nó chưa hỗ trợ tất cả các tính năng SQLite, nhưng có thể là một tùy chọn rất tốt cho một số dự án Java hoạt động với cơ sở dữ liệu SQLite.


4
Có vẻ đầy hứa hẹn nhưng có vẻ như nó chưa cung cấp khả năng truy vấn SQL, loại công cụ giải quyết cho tôi.
Scott Bennett-McLeish

Vẫn không hỗ trợ các truy vấn SQL, thay vào đó, API cấp thấp hơn.
Basel Shishani

Vẫn rất hữu ích cho các ứng dụng mà bạn chỉ cần tạo tệp SQLite, nghĩa là không cần SQL để truy vấn dữ liệu.
Nhà giả kim

5

Bài viết của Bernie rất hữu ích. Không thể bỏ phiếu (không có đủ danh tiếng :(). Nhưng nó đã giúp rất nhiều. Chỉ cần nhắc lại!

http://www.zentus.com/sqlitejdbc/

Ở đây bạn có thể tìm thấy jar JDBC SQLite mới nhất. Chỉ cần thêm jar vào classpath của bạn và bạn đã hoàn tất! :) Bạn có thể chạy mã mẫu của Bernie để kiểm tra xem mọi thứ có ổn không.

http://souptonuts.sourceforge.net/readme_sqlite_tutorial.html http://www.sqlite.org/lang.html

Ở đây bạn có thể tìm thấy một số trợ giúp về cú pháp SQL cho SQLite. Chúc mừng SQLite :)


3

Khi bạn biên dịch và chạy mã, bạn nên đặt giá trị tùy chọn đường dẫn. Cũng giống như sau:

javac -classpath .;sqlitejdbc-v056.jar Text.java

java -classpath .;sqlitejdbc-v056.jar Text

Hãy chú ý đến "." và sparate ";" (thắng, linux là ":")


3

Mã sqlitejdbc có thể được tải xuống bằng git từ https://github.com/crawshaw/sqlitejdbc .

# git clone https://github.com/crawshaw/sqlitejdbc.git sqlitejdbc
...
# cd sqlitejdbc
# make

Lưu ý: Makefile yêu cầu curl binary để tải xuống thư viện / deps sqlite.


2

Mã ví dụ dẫn đến rò rỉ bộ nhớ trong Tomcat (sau khi không triển khai ứng dụng web, trình nạp lớp vẫn còn trong bộ nhớ) sẽ gây ra lỗi outofmemorycuối cùng. Cách để giải quyết là sử dụng sqlite-jdbc-3.7.8.jar ; đó là ảnh chụp nhanh, vì vậy nó chưa xuất hiện cho maven.


0

Typo: java -cp .:sqlitejdbc-v056.jar Test

nên là: java -cp .:sqlitejdbc-v056.jar; Test

chú ý dấu chấm phẩy sau ".jar" tôi hy vọng nó giúp được mọi người, có thể gây ra nhiều rắc rối


Quan tâm đến công phu? Trên * nix các; sẽ tách java khỏi lệnh Test (và do đó tạo ra lỗi). Trên Windows, không hoạt động như một bộ tách cp. Vì vậy, tất cả trong tất cả .:xxx.jar;không có ý nghĩa. Và bạn cũng cần xác định tên gói cho lớp Test.
eckes
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.