使用Java创建新的本地数据库

3
我的目标是创建一个本地数据库,可以使用Java进行读写操作。我有一些使用Python操纵本地sqlite数据库以及通过VB.Net与Microsoft Azure上的现有网络数据库交互的经验,但是创建数据库的Java公式却让我无从下手。
大多数来源(例如JDBC文档)似乎都假定您是通过网络协议或在本地主机上托管的数据库来访问数据库。我想要实现的是创建并存储数据库文件(或文件集),以便可以在本地存储和访问,而无需网络连接(可能通过“file:”协议)。 JDBC教程看起来将在我启动后非常有用,但目前超出了我的范围,因为我甚至还没有现有的数据库。
Many sources have suggested solutions like H2, MySQL, Derby, or Hypersonic DB. However, I'm loath to install extensions (if that's the right term) for a number of reasons:
  • This project is initially intended to help me learn my way around Java - widening the scope of the project will dilute my experience with the "base" language and, probably, increase the temptation to engage in "cargo cult programming"
  • If this project does ever get distributed to other users (admittedly unlikely, but still!), I don't want to force them into installing more than the core of Java.
  • I simply don't know how to install extensions (add-ons? modules?) in Java - one baby-step at a time!
For similar reasons, installing Microsoft SQL Server would not be productive.
This answer looks close to what I'm aiming for; however, it gives the error:
java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/?user=root&password=rootpassword

“jdbc:file://targetFile.sql”也尝试了,但出现了类似的错误。我见过术语“嵌入式”数据库,它是“本地数据库”的一个子集(即本地数据库存储在同一个系统上——嵌入式数据库是仅由单个应用程序使用的本地数据库)。如果我的定义有误,请随时纠正我!

H2非常强大,它是一个简单的jar包。 - Aubin
“安装扩展”是什么意思?如果不是数据库,你具体想要什么?核心Java中没有数据库;核心Java只是核心Java。当你分发项目时,你可以随意携带任何东西--包括像H2或Derby这样的纯Java数据库,而且用户无需做任何操作。你确实需要一个嵌入式数据库,尽管我建议给用户提供使用任意数据库的机会,这就是JDBC允许你做的事情。 - Dave Newton
我会推荐使用像H2这样的内存数据库,当JVM退出时能够缓存到磁盘上。你可以在这个链接中了解更多信息:https://dev59.com/K0rSa4cB1Zd3GeqPaOme - djangofan
@DaveNewton - 我所指的“安装扩展”(我承认这可能是错误的术语)是指我不希望其他人在使用系统时需要下载或安装任何其他东西。我没意识到可以随自己的代码一起分发附加代码,谢谢你的提醒! - scubbo
4个回答

6
很可能你遇到的错误是因为在建立连接等操作之前,没有使用反射注册驱动程序。你需要做的事情大概是使用Class.forName("driver")进行类加载,然后必要时进行类型转换,并在调用getConnection()方法之前在DriverManager中注册它。
这是一个非常有用的链接,可以帮助你解决问题:http://www.kfu.com/~nsayer/Java/dyn-jdbc.html 但是,如果你真的想使用本地数据库/文件,你可能需要看一下SQLite。虽然我建议采用MySQL方法,因为它更容易配置并且学习如何使用JDBC。
如果你仍然考虑使用SQLite,请查看以下链接:Java and SQLite 我看到你需要一些指导来将外部.jar文件导入到你的代码中(例如用于JDBC驱动程序的第三方库)。你是使用IDE(例如Eclipse、Netbeans等)还是手动编写代码并手动编译呢?

我正在使用Eclipse - 目前为止,我已经下载了H2文件,并按照快速入门指南进行设置。 - scubbo
我已将h2-1.3.170.jar添加到CLASSPATH环境变量中,并从教程中复制粘贴了以下代码:try { Class.forName("org.h2.Driver"); Connection conn = DriverManager. getConnection("jdbc:h2:~/test", "sa", ""); // 在这里添加应用程序代码 conn.close(); } catch (Exception e) { e.printStackTrace(); }它给出了错误java.lang.ClassNotFoundException: org.h2.Driver - scubbo
嗯,好的。错误是在包含Class.forName("org.h2.Driver")的那一行吗?试试清理并重新构建(有时候Eclipse会变得混乱,并且搞乱构建路径)。我不确定在Eclipse中类路径环境变量实际上是如何工作的,但我会这样做:下载.jar文件,选择项目->属性->Java构建路径->库,然后添加外部jar文件,这样就能正确地将其添加到你的类路径中。 - Roveris
1
太棒了,成功了!谢谢!我把.jar文件添加到了Windows环境变量中,而不是Eclipse的。非常感谢! - scubbo
酷!是的,这也是一种方法,哈哈! - Roveris

3
最近出现了许多嵌入式纯Java数据库,它们有一个非常简单的接口,通常只是java.util.Map,不涉及使用JDBC或其他SQL工件,并将它们的数据存储在单个文件或目录中: 主要缺点是大多数此类数据库仅提供最简单的键值模型。

0

这个答案中比问题中已经存在的还有什么? - Aubin

0
Java的JDK不包含任何数据库的实现或用于访问数据库的驱动程序。它只提供JDBC作为连接到“数据库”的抽象层。您需要在代码中包含所有所需的库。
如果您想要一个自包含的代码,您可以简单地将可嵌入数据库的.jar文件包含在类路径中。这样,您就可以在代码中创建数据库实例并最小化外部依赖。
您可以在这里找到一份java可嵌入数据库的列表。
您可以在这里找到如何在代码中嵌入HSQLDB的示例。

链接已经失效 :-( - Mario S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接