在独立 Java 应用程序中设置嵌入式 Derby 数据库
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4393385/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Setting up an embedded Derby database in a standalone Java application
提问by Clark Minor
I'm trying to setup an embedded Derby database for a standalone Java application, but after pouring through all sorts of documentation, I just can't seem to find any simple explanations or examples. I'm using Eclipse with the Derby plugin and have enabled Derby nature for my project.
我正在尝试为独立的 Java 应用程序设置嵌入式 Derby 数据库,但是在查阅了各种文档之后,我似乎找不到任何简单的解释或示例。我将 Eclipse 与 Derby 插件一起使用,并为我的项目启用了 Derby 性质。
I found an example of using an embedded Derby database in a standalone address bookas well as an overview of using Derby in Eclipse (that doesn't seem to cover the embedded deployment), but I still feel like I'm missing something fundamental.
我找到了一个在独立地址簿中使用嵌入式 Derby 数据库的示例以及在 Eclipse 中使用 Derby 的概述(似乎没有涵盖嵌入式部署),但我仍然觉得我缺少一些基本的东西。
This is my first time attempting to use a database with Java, and I'm a little confused, so here are my basic questions:
这是我第一次尝试在 Java 中使用数据库,我有点困惑,所以这里是我的基本问题:
- What's the basic philosophy (or model) for how Java interacts with a Derby database (in an embedded deployment)? Are their important design patterns to be followed?
- Do I need to create some type of database constructor (that includes table structure, etc.) in a class, or is that all done with some other tool?
- One the database is created and saved, how do I "start" it up? And where is the actual database saved?
- Java 如何与 Derby 数据库(在嵌入式部署中)交互的基本原理(或模型)是什么?是否要遵循他们的重要设计模式?
- 我是否需要在类中创建某种类型的数据库构造函数(包括表结构等),还是全部使用其他工具完成?
- 创建并保存数据库后,如何“启动”它?实际的数据库保存在哪里?
Snippets of code would be very helpful!
代码片段将非常有帮助!
回答by simgineer
If you're ok with switching to the netbeans IDE here are two useful tutorials which I was able to get working in the ide (i'm having some minor issues with the installer). It uses JPA which is an abstraction that simplifies a lot of database interaction.
如果您可以切换到 netbeans IDE,这里有两个有用的教程,我可以在 IDE 中使用它们(我在安装程序方面遇到了一些小问题)。它使用 JPA,这是一种抽象,可以简化很多数据库交互。
https://blogs.oracle.com/geertjan/entry/embedded_database_for_netbeans_platform
https://blogs.oracle.com/geertjan/entry/embedded_database_for_netbeans_platform
http://platform.netbeans.org/tutorials/nbm-crud.html
http://platform.netbeans.org/tutorials/nbm-crud.html
To address some of your inquiries:
为了解决您的一些疑问:
- If you're using java and relation dbs i would highly recommend JPA. Otherwise you are using JDBC to interact with your database and using SQL.
- Traditionally you use a utility or run a script to create the table schema however since you are going for embedded you might be interested (as i am) in having the db and schema create it self dynamically so you don't have to run this script every time you install your application. This is doable with derby's embedded JPA configuration which the tutorial covers.
- if you are running an embedded derby database there is no separate thread or socket that you start up. you app will use the jpa or derby api which will use file locking to access the derby files. In my definition an embedded database does not have a separate thread or process listening on a socket handling multiple request.
- 如果您使用的是 java 和关系数据库,我强烈推荐 JPA。否则,您将使用 JDBC 与数据库进行交互并使用 SQL。
- 传统上,您使用实用程序或运行脚本来创建表模式,但是由于您要嵌入,您可能有兴趣(就像我一样)让数据库和模式动态创建它,因此您不必运行此脚本每次安装应用程序时。这可以通过本教程涵盖的 derby 的嵌入式 JPA 配置来实现。
- 如果您正在运行嵌入式 derby 数据库,则无需启动单独的线程或套接字。您的应用程序将使用 jpa 或 derby api,它们将使用文件锁定来访问 derby 文件。在我的定义中,嵌入式数据库没有单独的线程或进程侦听处理多个请求的套接字。
Hope this helps and Good luck!
希望这会有所帮助,祝你好运!
回答by danes
Those blogs n url are very wonderful but I will suggest the OP switch over to NetBeans even though I used d ClientDriver
version of Java Derby drivers and I create a class or method to start up the database automatically at start up time so that I don't encounter any SQLException
at run time and it has been working. Though I do use NetworkServerControl
class to start up my database at run time going like diz
那些博客 n url 非常棒,但我会建议 OP 切换到 NetBeans,即使我使用ClientDriver
了 Java Derby 驱动程序的d版本,并且我创建了一个类或方法来在启动时自动启动数据库,这样我就不会SQLException
在运行时遇到 any并且它一直在工作。虽然我确实使用NetworkServerControl
类在运行时启动我的数据库,就像 diz
NetworkServerControl server=new NetworkServerControl(InetAddress.getLocalHost(),1527);
server.start (null);
//Class.forName n DriverManager.getConnection() declarations goes here.
回答by Mario
I suggest that you use a class named ConnectionDerby, where put all the logic and the parameters to Select, insert, update, Delete, and as a embedded database i comprobate if a database already exists, if not exists i created then, i hope this code help you, sorry or my english and i am newbie using this database in java, but i hope this help you to understand....
我建议您使用一个名为 ConnectionDerby 的类,其中将所有逻辑和参数都放在 Select、insert、update、Delete 中,并且作为嵌入式数据库,如果数据库已经存在,我会考虑,如果不存在,我创建了,我希望这个代码可以帮助你,对不起,或者我的英语,我是在 Java 中使用这个数据库的新手,但我希望这能帮助你理解....
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.JOptionPane;
public class ConnectionDerby {
private Connection conn = null;
private Statement sttm = null;
public Connection CrearBD(String query) {
try {
//Obtenemos el Driver de Derby
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
conn = DriverManager.getConnection("jdbc:derby:.\BD\nombrebasededatos.db;create=true");
if (conn != null) {
//JOptionPane.showMessageDialog(null, "Base de Datos Lista");
try {
PreparedStatement pstm = conn.prepareStatement(query);
pstm.execute();
pstm.close();
//JOptionPane.showMessageDialog(null, "Base de Datos Creada Correctamente");
System.out.println("SENTENCIA SQL EFECTUADA CORRECTAMENTE");
} catch (SQLException ex) {
//JOptionPane.showMessageDialog(null, ex.getLocalizedMessage());
System.out.println(ex.getMessage());
JOptionPane.showMessageDialog(null, "NO SE PUDO EFECTUAR LA SENTENCIA SQL", "Error", JOptionPane.ERROR_MESSAGE);
//JOptionPane.showMessageDialog(null, "NO SE PUDO EFECTUAR LA SENTENCIA SQL");
}
}
} catch (SQLException e) {
System.out.println(e.getMessage());
JOptionPane.showMessageDialog(null, "NO SE PUDO EFECTUAR LA SENTENCIA SQL", "Error", JOptionPane.ERROR_MESSAGE);
//JOptionPane.showMessageDialog(null, "TRONO LA APLICACION EN EJECUTAR LAS SENTENCIAS SQL parte 2");
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
JOptionPane.showMessageDialog(null, "NO SE PUDO EFECTUAR LA SENTENCIA SQL", "Error", JOptionPane.ERROR_MESSAGE);
//JOptionPane.showMessageDialog(null, "TRONO LA APLICACION EN EJECUTAR LAS SENTENCIAS SQL parte 3");
}
return conn;
}
public Connection AccederBD() {
try {
//Obtenemos el Driver de Derby
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
//Obtenemos la Conexión
conn = DriverManager.getConnection("jdbc:derby:.\BD\nombrebasededatos.db");
if (conn != null) {
System.out.println("Base de Datos Ya Leida Correctamente");
//JOptionPane.showMessageDialog(null, "Base de Datos Ya Leida Correctamente");
}
} catch (SQLException e) {
System.out.println(e.getMessage());
System.out.println("Sistema Creado por Mario José Echeverría");
System.out.println("NO SE ENCONTRO LA BASE DE DATOS");
System.out.println("CREANDO BASE DE DATOS EN DERBY DATABASE");
String createTableProyecto = "Sentence to create first table";
String createTablePrimer = "Sentence to create second table";
String createTableTopCoat = "Sentence to create third table";
String createTableCotizacion = "Sentence to create fourth table";
CrearBD(createTableProyecto);
CrearBD(createTablePrimer);
CrearBD(createTableTopCoat);
CrearBD(createTableCotizacion);
//*************PRUEBAS*****************
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
System.out.println("ERROR DE TIPO ClassNotFoundException");
//JOptionPane.showMessageDialog(null, "TRONO LA APLICACION EN ACCEDER A LA BASE DE DATOS parte 2");
}
return conn;
}
public void UID(String sqlcad) {
try {
//Obtenemos el Driver de Derby
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
conn = DriverManager.getConnection("jdbc:derby:.\BD\nombrebasededatos.db");
sttm = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
sttm.executeUpdate(sqlcad);
System.out.println("Conexión Exitosa a la Base de Datos");
//JOptionPane.showMessageDialog(null, "Conexión exitosa");
sttm.close();
conn.close();
if (conn != null) {
System.out.println("Consulta Realizada Correctamente");
//JOptionPane.showMessageDialog(null, "Base de Datos Ya Leida Correctamente");
}
} catch (SQLException e) {
System.out.println("Error= " + e.getMessage());
} catch (ClassNotFoundException e) {
System.out.println("Error= " + e.getMessage());
}
}
public ResultSet getvalores(String sqlcad) {
ResultSet rs = null;
try {
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
conn = DriverManager.getConnection("jdbc:derby:.\BD\nombrebasededatos.db");
sttm = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
//String sqlcad = "Select nombre, m2xgal, pregal, precub, descripcion from primer";
rs = sttm.executeQuery(sqlcad);
return rs;
} catch (Exception e) {
System.out.println("Error= " + e.getMessage());
return rs;
}
}
}
回答by Vit Bernatik
I never did derby (although did once mysql) and got all going from this simple example. Actually I did not even read the talk - I just did scroll to the middle where self-explanatory example is.
我从来没有做过德比(虽然做过一次 mysql)并且从这个简单的例子中得到了一切。实际上,我什至没有阅读演讲——我只是滚动到不言自明的例子所在的中间。
回答by Jan Bodnar
To use Derby in Java in embedded mode, we need to do the following steps:
要在 Java 中以嵌入模式使用 Derby,我们需要执行以下步骤:
- Use the
org.apache.derby.jdbc.EmbeddedDriver
driver, located in thederbyclient
Maven dependency - Use the connection string for embedded mode:
jdbc:derby:dbname
- Set up the Derby system home:
System.setProperty("derby.system.home", "/home/janbodnar/.derby");
- Shut down Derby programatically at the end:
DriverManager.getConnection("jdbc:derby:;shutdown=true");
- Handle XJ015 error, which is triggered at successfull shutdown
- 使用
org.apache.derby.jdbc.EmbeddedDriver
位于derbyclient
Maven 依赖项中的驱动程序 - 使用嵌入模式的连接字符串:
jdbc:derby:dbname
- 设置 Derby 系统主页:
System.setProperty("derby.system.home", "/home/janbodnar/.derby");
- 最后以编程方式关闭 Derby:
DriverManager.getConnection("jdbc:derby:;shutdown=true");
- 处理成功关闭时触发的 XJ015 错误
Full working examples can be found at my Java JDBC Derby programming tutorial.
完整的工作示例可以在我的Java JDBC Derby 编程教程中找到。