Java และ SQLite [ปิด]


333

ฉันดึงดูดความเรียบร้อยที่ฐานข้อมูลไฟล์เดียวให้ ไลบรารีไดรเวอร์ / ตัวเชื่อมต่อใดที่อยู่ข้างนอกเพื่อเชื่อมต่อและใช้ SQLite กับ Java

ฉันค้นพบไลบรารีแรปเปอร์แล้วhttp://www.ch-werner.de/javasqliteแต่มีโครงการเด่นอื่น ๆ อีกหรือไม่


10
ฉันชอบที่คำถามที่มี upvotes หลายร้อยและคำตอบที่มี upvotes หลายร้อยถูกปิดเป็น "นอกหัวข้อ" มันเป็นเรื่องที่น่าอายฮ่า ๆ ๆ
Andrew Koster

คำตอบ:


196

วิกิพีเดียบางรายการห่อเพิ่มเติมได้ที่:

  • Java wrapper (รอบ ๆ อินเตอร์เฟส SWIG): http://tk-software.home.comcast.net/
  • บทแนะนำที่ดีในการใช้ไดรเวอร์ JDBC สำหรับ SQLite (ทำงานได้อย่างน้อย!) http://www.ci.uchicago.edu/wiki/bin/view/VDS/VDSDevelopment/UsingSQLite
  • ไดรเวอร์ JDBC ข้ามแพลตฟอร์มซึ่งใช้ไลบรารี่ SQLite แบบฝังใน Windows, Linux, OS X และกลับไปสู่การใช้งานจาวาบริสุทธิ์บนระบบปฏิบัติการอื่น ๆ : https://github.com/xerial/sqlite-jdbc ( zentusเดิม)
  • Another Java - SWIG wrapper ใช้งานได้กับ Win32 เท่านั้น http://rodolfo_3.tripod.com/index.html
  • sqlite-java-shell: พอร์ต Java บริสุทธิ์ 100% ของเชลล์ commandline sqlite3 ที่สร้างขึ้นด้วย NestedVM (นี่ไม่ใช่ไดรเวอร์ JDBC)
  • ไดร์เวอร์ SQLite JDBC สำหรับ Mysaifu JVM: ไดร์เวอร์ SQLite JDBC สำหรับ Mysaifu JVM และ SQLite JNI Library สำหรับ Windows (x86) และ Linux (i386 / PowerPC)

7
นอกจากนี้ของฉันในรายการนี้คือ sqlite4java - code.google.com/p/sqlite4java - เป็น wrapper (ไม่มี JDBC) precompiled สำหรับ Windows, Mac, Linux ใช้งานง่ายและบังคับใช้สัญญาบางฉบับเพื่อช่วยผู้พัฒนาหลีกเลี่ยงการใช้ SQLite ในทางที่ผิด
sereda

7
sqlite4java ดูน่าสนใจ แต่พวกเขายังมีการเปรียบเทียบที่ดีของ wrappers ต่างๆออกมี: code.google.com/p/sqlite4java/wiki/ComparisonToOtherWrappers
Scott Bennett-McLeish

1
@kdt ปัญหาที่ผมพบกับคนขับรถ zentus คือว่ามันไม่ได้ดูเหมือนจะสนับสนุนหยดที่ทั้งหมด
Martijn

12
@Martijn xerial.org/trac/Xerial/wiki/SQLiteJDBCเป็นผู้ขับขี่ของ zentus และสนับสนุน BLOB (มี tut สั้น ๆ ในเว็บไซต์ของพวกเขา)
johnharris85


247

ฉันพบคำถามของคุณในขณะค้นหาข้อมูลด้วยSQLiteและ Java แค่คิดว่าฉันจะเพิ่มคำตอบที่ฉันโพสต์ในบล็อกของฉันด้วย

ฉันได้รับการเข้ารหัสใน Java มาระยะหนึ่งแล้ว ฉันเคยรู้จัก SQLite มาก่อน แต่ไม่เคยใช้ ... ฉันเคยใช้มันผ่านแอพพลิเคชั่นอื่นแต่ไม่เคยใช้แอพที่ฉันเขียนโปรแกรม ดังนั้นฉันจึงต้องการมันสำหรับโครงการในสัปดาห์นี้และมันใช้ง่ายมาก!

ฉันพบไดรเวอร์ Java JDBC สำหรับ SQLite เพียงเพิ่มไฟล์ JARใน classpath ของคุณและนำเข้า java.sql *

แอปทดสอบของเขาจะสร้างไฟล์ฐานข้อมูลส่งคำสั่ง SQL เพื่อสร้างตารางเก็บข้อมูลบางอย่างในตารางแล้วอ่านกลับและแสดงบนคอนโซล มันจะสร้างไฟล์test.dbในไดเรกทอรีรากของโครงการ 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
นี่คือเหตุผลที่ฉันคิดว่า Joel กำลังพูดถึงวัว (Google Tech Talk: youtube.com/watch?v=NWHfY_lvKIQ ) เมื่อพูดว่าการออกแบบของ stackoverflow.com นั้นดีกว่าเพราะโพสต์ "เก่า" ทั้งหมดแขวนอยู่บนอินเทอร์เน็ต มันเป็นเพียงรูปแบบใหม่
Nikolaos

26
โปรดสังเกตว่าโครงการ Crawshaw ดูเหมือนจะหายไป แต่ถูกแยกและอัปเดตที่นี่: xerial.org/trac/Xerial/wiki/SQLiteJDBC
lapo

8
zentus.com ดูเหมือนว่าหักพบกระจกอยู่ที่นี่ priede.bf.lu.lv/pub/DatuBazes/SQLite/SqliteJDBC/about.htm
Daniel Magnusson

3
ขอบคุณ @DanielMagnusson คุณเป็นผู้ช่วยชีวิต ในขณะที่อยู่ในหัวข้อทุกคนยังคงมองหาไดรเวอร์ sqliteJDBC สามารถไปpriede.bf.lu.lv/pub/DatuBazes/SQLite/SqliteJDBC/เนื่องจากลิงก์ลิงก์ about.htm ไปยังไม่ถูกต้อง
javatarz

2
การพึ่งพา maven: mvnrepository.com/artifact/org.xerial/sqlite-jdbc
Carl Bosch

30

ฉันเข้าใจว่าคุณถามเฉพาะเกี่ยวกับ SQLite แต่บางทีฐานข้อมูล HSQLอาจจะเหมาะสมกับ Java มากกว่า มันเขียนใน Java เองทำงานใน JVM สนับสนุนตารางในหน่วยความจำ ฯลฯ และคุณสมบัติทั้งหมดที่ทำให้มันใช้งานได้ค่อนข้างสำหรับต้นแบบและการทดสอบหน่วย


3
ใช่ HSQL เป็นตัวเลือกที่ดีมากและฉันใช้อย่างกว้างขวางในแอพไคลเอ็นต์สองตัวเพื่อให้ได้ผลที่ดี อย่างไรก็ตามในกรณีนี้ฉันต้องการใช้ SQLite แน่นอน
Scott Bennett-McLeish

18

โครงการ David Crawshaw (sqlitejdbc-v056.jar) ล้าสมัยและอัปเดตครั้งล่าสุดคือ 20 มิ.ย. 2009 แหล่งที่มาที่นี่

ฉันขอแนะนำXerials forkของ wrapper Crawshaw sqlite ฉันแทนที่ sqlitejdbc-v056.jar ด้วยไฟล์ Xerials sqlite-jdbc-3.7.2.jar โดยไม่มีปัญหาใด ๆ

ใช้ไวยากรณ์เดียวกับคำตอบของเบอร์นีและเร็วกว่ามากและมีไลบรารี sqlite ล่าสุด

อะไรคือสิ่งที่แตกต่างจาก Ziteus ของ SQLite JDBC

http://www.zentus.com/sqlitejdbc/ตัวเองของ Zentus นั้นเป็นยูทิลิตี้ที่ยอดเยี่ยมสำหรับการใช้ฐานข้อมูล SQLite จากภาษาจาวาและห้องสมุด SQLiteJDBC ของเราก็ขึ้นอยู่กับการใช้งาน อย่างไรก็ตามเวอร์ชัน pure-java ซึ่งแปลโค้ด c / c ++ ทั้งหมดของ SQLite เป็น Java นั้นช้าลงอย่างมากเมื่อเทียบกับรุ่นเนทีฟซึ่งใช้ไบนารี SQLite ที่คอมไพล์สำหรับแต่ละระบบปฏิบัติการ (win, mac, linux)

ในการใช้เวอร์ชันเนทีฟของ sqlite-jdbc ผู้ใช้ต้องตั้งค่าพา ธ ไปยังเนทีฟโค้ด (dll, jnilib ดังนั้นไฟล์ซึ่งเป็นโปรแกรม JNDI C) โดยใช้อาร์กิวเมนต์บรรทัดคำสั่งเช่น -Djava.library.path = (พา ธ ไปยัง dll, jnilib, ฯลฯ ) หรือ -Dorg.sqlite.lib.path เป็นต้นกระบวนการนี้ผิดพลาดง่ายและน่ารำคาญที่จะบอกผู้ใช้ทุกคนให้ตั้งค่าตัวแปรเหล่านี้ ห้องสมุด SQLiteJDBC ของเราสามารถขจัดความไม่สะดวกเหล่านี้ได้อย่างสมบูรณ์

ข้อแตกต่างอีกประการหนึ่งคือเรากำลังรักษา SQLiteJDBC libray ให้เป็นรุ่นล่าสุดของเอ็นจิน SQLite อยู่เสมอเพราะเราเป็นหนึ่งในผู้ใช้ที่ร้อนแรงที่สุดของห้องสมุดนี้ ตัวอย่างเช่น SQLite JDBC เป็นส่วนประกอบหลักของชุดเครื่องมือ UTGB (มหาวิทยาลัยโตเกียวจีโนมเบราว์เซอร์) ซึ่งเป็นยูทิลิตี้ของเราในการสร้างเบราว์เซอร์จีโนมส่วนบุคคล

แก้ไข : ตามปกติเมื่อคุณอัปเดตบางสิ่งบางอย่างจะมีปัญหาในบางสถานที่คลุมเครือในรหัสของคุณ (เกิดขึ้นกับฉัน) ทดสอบทดสอบทดสอบ =)


1
sqlite-jdbcโครงการเป็นสิ่งที่ดี แต่ทราบว่ามันเป็นอาปาเช่ได้รับใบอนุญาต ดังนั้นคุณต้องระบุที่มาหากคุณใช้ไม่ว่ารหัสของคุณจะเป็น FOSS หรือเป็นกรรมสิทธิ์
dotancohen

16

มีโครงการใหม่SQLJetที่เป็นการใช้งานจาวาบริสุทธิ์ของ SQLite ยังไม่รองรับฟีเจอร์ SQLite ทั้งหมด แต่อาจเป็นตัวเลือกที่ดีมากสำหรับบางโครงการ Java ที่ทำงานกับฐานข้อมูล SQLite


4
ดูเหมือนว่าจะมีแนวโน้ม แต่ดูเหมือนว่าไม่ได้มีความสามารถในการสืบค้น SQL แต่ก็เป็นตัวแบ่งข้อตกลงสำหรับฉัน
Scott Bennett-McLeish

ยังไม่รองรับการสืบค้น SQL แต่เป็น API ระดับที่ต่ำกว่า
Basel Shishani

ยังมีประโยชน์มากสำหรับแอปพลิเคชันที่คุณต้องการสร้างไฟล์ SQLite เท่านั้นเช่นไม่จำเป็นต้องใช้ SQL เพื่อสืบค้นข้อมูล
นักเล่นแร่แปรธาตุ

5

โพสต์ของเบอร์นีมีประโยชน์มาก ไม่สามารถลงคะแนนได้ (มีชื่อเสียงไม่มากพอ :() แต่มันช่วยได้มากแค่ย้ำ!

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

ที่นี่คุณสามารถค้นหา jar ล่าสุดของ SQLite JDBC เพียงเพิ่มเหยือกใน classpath ของคุณและคุณทำเสร็จแล้ว! :) คุณสามารถเรียกใช้โค้ดตัวอย่างของเบอร์นีเพื่อทดสอบว่าทุกอย่างเรียบร้อยดีหรือไม่

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

ที่นี่คุณสามารถค้นหาความช่วยเหลือเกี่ยวกับไวยากรณ์ SQL สำหรับ SQLite เชียร์กับ SQLite :)


3

เมื่อคุณรวบรวมและเรียกใช้รหัสคุณควรตั้งค่าตัวเลือก classpath เหมือนดังต่อไปนี้:

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

java -classpath .;sqlitejdbc-v056.jar Text

โปรดใส่ใจกับ "." และ sparate ";" (ชนะ linux คือ ":")


3

รหัส sqlitejdbc สามารถดาวน์โหลดได้โดยใช้คอมไพล์จากhttps://github.com/crawshaw/sqlitejdbc

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

หมายเหตุ: Makefile ต้องการ curl binary เพื่อดาวน์โหลด sqlite libraries / deps


2

โค้ดตัวอย่างนำไปสู่การรั่วไหลของหน่วยความจำใน Tomcat (หลังจากยกเลิกการปรับใช้ webapp แล้ว classloader ยังคงอยู่ในหน่วยความจำ) ซึ่งจะทำให้เกิดขึ้นoutofmemoryในที่สุด วิธีการที่จะแก้ปัญหาได้คือการใช้SQLite-JDBC-3.7.8.jar ; มันเป็นสแน๊ปช็อตดังนั้นมันจึงยังไม่ปรากฏให้เห็นใน maven


0

สะกดผิด: java -cp .:sqlitejdbc-v056.jar Test

ควรจะเป็น: java -cp .:sqlitejdbc-v056.jar; Test

สังเกตุอัฒภาคหลังจาก ".jar" ฉันหวังว่าจะช่วยให้ผู้คนสามารถทำให้เกิดความยุ่งยากมาก


สนใจที่จะทำอย่างละเอียด? บน * ระวัง; จะแยก java ออกจากคำสั่งทดสอบ (และสร้างข้อผิดพลาด) บน Windows: จะไม่ทำงานเป็น cp seperator ดังนั้นทั้งหมด.:xxx.jar;ไม่สมเหตุสมผล และคุณต้องระบุชื่อแพ็คเกจสำหรับคลาส Test
eckes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.