Java与本地数据库

11

TL DR; 需要一些Java帮助连接到真正的本地数据库(没有访问服务器技术),或者您可以编写代码,使其工作。它只需查询数据库(MS Access,但可以更改)并输出JSON字符串。有关更多详细信息,请参见EDIT2。

编辑:在任何人说JDBC之前; 我查看了教程(开始深入阅读),但大部分似乎都是针对服务器技术的,而我无法访问。

编辑2:到目前为止,似乎大多数答案都需要某种安装,而我不幸不能这样做(并且没有提到,所以我很抱歉)。然而,这就是目前正在使用的内容,并且我希望使用类似于Java的解决方案,使其更具跨浏览器兼容性,而不仅仅是HTA(链接: https://launchpad.net/accessdb

好吧,长话短说。我正在尝试利用本地数据库创建一个桌面风格应用程序,以供工作使用(并可能在其他项目中使用该知识)。我可以毫不费力地创建数据库(MS Access 2003,只需快速获取即可)。目前,我正在使用ActiveX脚本在HTML应用程序(* .HTA文件仅适用于Internet Explorer)中使用数据库,我真的很想使用JAVA访问数据库,然后将结果输出为JSON到本地变量JavaScript可以调用和利用。

实际上更希望是教程类型的信息,因为我想真正了解为什么这有效,以便稍后修改以适应我的需求。我已经安装了Eclipse和JDK,并且可以在Java中编写小型程序,因此并不完全脑残(但也不远:P)。我一直在使用JavaScript,因此我可以阅读相当多的Java代码(由于它们没有关系,所以不是相同的语法,但我所知道的一点Java可以毫不费力地转换回JS)。

无论如何,任何帮助都将不胜感激。我可以继续使用ActiveX进行开发(因为我知道它可以在该系统上工作,而且我 99% 确信他们将继续使用Internet Explorer,但是我想要一些灵活性)。

4个回答

18

我不确定我完全理解了您的需求,但我已经解析出一些关键点。我建议您使用一个单一包(例如JAR)来交付一个完整的工作应用程序,这个包不需要太多(如果有的话)服务器配置或管理

一些必需的技能:

  • Java编程语言
  • JDBC、SQL
  • JSP和Servlets(Web层)

我正在尝试利用本地数据库创建桌面风格应用程序[...] 我希望得到一些Java帮助,以连接到真正本地的数据库(无法访问服务器技术)

数据存储

JDBC可以与任何具有JDBC驱动程序的数据库一起使用,不一定是“网络模式”的数据库,也可以与嵌入式数据库一起使用。

这里有一个Derby在嵌入模式下的示例: alt text

当一个应用程序使用嵌入式Derby JDBC驱动程序访问Derby数据库时,Derby引擎不运行在一个单独的进程中,并且没有单独的数据库进程需要启动和关闭。相反,Derby数据库引擎在与应用程序相同的Java虚拟机(JVM)中运行。因此,Derby成为应用程序的一部分,就像应用程序使用的任何其他jar文件一样。图1描述了这种嵌入式架构。

这里是一些100% Java并可嵌入的数据库:

http://www.h2database.com/html/main.html

http://db.apache.org/derby/

http://hsqldb.org/

Web层

您也可以嵌入像Jetty这样的Web服务器。

Jetty有一个口号:"不要在Jetty中部署您的应用程序,而是在您的应用程序中部署Jetty"。这意味着与将应用程序捆绑为标准WAR文件以在Jetty中部署不同,Jetty被设计为可以在Java程序中实例化和使用的软件组件,就像任何POJO一样。

嵌入Jetty

请注意,还有其他可以使用此方式的Web服务器。


考虑到Akidi已经浏览了网络,并且他的Java Web应用程序知识可能有限,我认为他需要更加详细的指导。你的答案是正确的,可以运行,但是可能需要他花费数小时来解密Java Web应用程序开发的奥秘:) :) +1 - OscarRyz
我希望她/他能享受这次旅程,拥抱平台的卓越之处 :P - bakkal
1
实际上我很享受这次旅程(尽管有些颠簸,我应该带上安全头盔)。不过我本应该更加具体说明,因为到目前为止所有这些答案都需要在主机PC上进行安装,而我不幸不能这样做。我编辑了我的帖子以反映这一点,并举例说明了当前正在进行的事情,希望能够澄清情况。虽然有所收获,但我会研究这个解决方案,或许可以用于其他项目。 - Akidi

6

好的,所以您需要从本地数据库提供JSON,对吗?

您不需要服务器,可以直接从本地机器提供网页(只需指向localhost即可)

因此,基本上(我知道这不完整,但我希望它是一个好的开始)

您必须:

  • 安装Servlet容器(Tomcat或Jetty),它们非常易于使用。
  • 创建Servlet或JSP页面以显示数据(JSP也很容易)
  • 使用JDBC连接到本地数据库,例如Derby
  • 使用库将数据转换为JSON

安装Tomcat

(我将描述UNIX,但对于Windows也是一样的)

从这里下载然后将文件解压缩到您喜欢的某个目录中(例如/home/you/或C:\ Users \ you \)

打开终端并进入tomcat的bin目录,然后输入catalina.sh run,这将启动tomcat,您需要在系统上安装Java。

在浏览器中打开http://localhost:8080

它应该看起来像这样:

tomcat running

创建一个JSP文件

接下来,进入tomcat的webapps目录,它应该包含以下文件夹:

ROOT/
docs/
examples/
host-manager/
manager/

创建一个新的文件夹,例如your或其他名称,并在其中创建一个名为Hello.jsp的文件,内容如下:

Hello.jsp
----------
Hello, world

然后在浏览器中打开:http://localhost:8080/your/Hello.jsp

应该看起来像:

hello, world

创建一个JDBC程序

接下来,在您的web应用程序 your 中创建目录:WEB-INF/lib,并将derby JDBC驱动程序保存在其中,您可以从这里获取它。

修改您的Hello.jsp文件,创建一个如下所示的示例表:

<%@page import="java.sql.*, java.util.*"%>
<%!
     public String getData() {
         List list = new ArrayList();
         try {
             Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
             Connection connection = DriverManager.getConnection("jdbc:derby:yourdb;create=true");
             // The first time:
             PreparedStatement pstmt = connection.prepareStatement(
                 "CREATE TABLE PEOPLE\n"+
                 "(PERSON_ID INT NOT NULL GENERATED ALWAYS AS IDENTITY\n"+
                 "    CONSTRAINT PEOPLE_PK PRIMARY KEY, PERSON VARCHAR(26))");
            pstmt.executeUpdate();
            pstmt = connection.prepareStatement("INSERT INTO PEOPLE(PERSON) VALUES('OSCAR')");
            pstmt.executeUpdate();
         } catch( Exception e ) { 
             throw new RuntimeException( e );
         }
         return "";
     }
%>
:)
<%
    getData();
%>

请通过访问 localhost:8080/your/Hello.jsp 再次执行您的jsp。

如果您执行两次,系统将告诉您该表已经存在:

Execute it twice

没问题,我们已经创建了表。

使用库来输出JSON

关闭Tomcat,按下Ctrl-C。

下载并复制json-simple jar到您的WEB-INF/lib目录中。您可以从这里获取它。

重新启动Tomcat。

在JSP中注释创建代码,并将其替换为类似于此的SQL查询:

<%@page import="java.sql.*, java.util.*, org.json.simple.JSONValue"%>

<%!
     public String getData() {
         List list = new ArrayList();
         Connection connection = null;
         try {
             Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
              connection = DriverManager.getConnection("jdbc:derby:yourdb;create=true");
             // The first time:
             //PreparedStatement pstmt = connection.prepareStatement(
             //    "CREATE TABLE PEOPLE\n"+
             //    "(PERSON_ID INT NOT NULL GENERATED ALWAYS AS IDENTITY\n"+
             //    "    CONSTRAINT PEOPLE_PK PRIMARY KEY, PERSON VARCHAR(26))");
            //pstmt.executeUpdate();
            //pstmt = connection.prepareStatement("INSERT INTO PEOPLE(PERSON) VALUES('OSCAR')");
            //pstmt.executeUpdate();
            // execute select the second time
            PreparedStatement psmt = connection.prepareStatement("SELECT person FROM PEOPLE");
            ResultSet rs = psmt.executeQuery();
            while( rs.next() ){
                list.add( rs.getString("person"));
            }
         } catch( Exception e ) { 
             throw new RuntimeException( e );
         } finally {
             if( connection != null ) try {
                 connection.close();
             } catch( Exception e ){}
         }
         return JSONValue.toJSONString(list);
     }
%>
:)
<script>
 var list = <%=
    getData()
%>
</script>

注意我们使用了throw import,最后,我们改变了方法的调用方式,将结果放入javascript变量list中。
当运行时,JSP页面会看起来像这样(您需要右键单击以查看HTML源代码以查看<script>标签):

result

我希望您会发现这很有用。我试图让它变得非常简单易懂。 重要上面的示例充满了不良实践,请不要像那样编码(例如,直接在tomcat webapps文件夹中创建Web应用程序,或直接从JSP页面执行SQL(更不用说不关闭资源等)。
主要想法是给您足够的信息来开始使用。
有方法将其与eclipse集成,并使用SQL查看器(如SquirrelSQL客户端)来操作数据。
这应该足够简单,我实际上在写这篇答案时下载了文件并创建了测试,所以它应该可以工作。

3
作为 Oscar 的后续,这里有一个简单的“输入 SQL”JSP页面,使用 JSTL(Java 标准标记库)标记。
你只需要加入 derby.jar 库即可使其工作。
从 Apache 下载 Tomcat。
从 Apache 下载 Derby。
cd $TOMCAT_HOME/webapps
mkdir yourapp cd yourapp 将以下内容复制到 index.jsp 中:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>SQL Fun</title>
    </head>
    <body>
        <h1>Welcome to Derby SQL</h1>
        <!-- Form to prompt for SQL -->
        <form action="index.jsp" method="POST">
            <label for="sql">SQL Text:</label>
            <textarea cols="40" rows="10" name="sql"></textarea>
            <br/>
            <!-- click Execute query to execute a SELECT statement -->
            <input type="submit" name="doquery" value="Execute Query"/>
            <!-- click Execute DDL to execute a CREATE, UPDATE, DROP or DELETE statement -->
            <input type="submit" name="doddl" value="Execute DDL"/>
        </form>
        <c:if test="${!empty param.sql}">
            <!-- param is the default variable with the request parameters -->
            Executing: ${param.sql}
            <br/>
            <!-- This sets up the DB Connection to derby -->
            <sql:setDataSource driver="org.apache.derby.jdbc.EmbeddedDriver"
                url="jdbc:derby:derbyDB;create=true" scope="request"/>

            <c:choose>
                <c:when test="${!empty param.doddl}">
                    <sql:update var="result">
                    ${param.sql}
                    </sql:update>
                    Result = ${result}
                </c:when>
                <c:otherwise>
                    <sql:query var="result">
                    ${param.sql}
                    </sql:query>

                    <table border="1">
                        <!-- column headers -->
                        <tr>
                            <c:forEach var="columnName" items="${result.columnNames}">
                                <th><c:out value="${columnName}"/></th>
                            </c:forEach>
                        </tr>
                        <!-- column data -->
                        <c:forEach var="row" items="${result.rowsByIndex}">
                            <tr>
                                <c:forEach var="column" items="${row}">
                                    <td><c:out value="${column}"/></td>
                                </c:forEach>
                            </tr>
                        </c:forEach>
                    </table>
                </c:otherwise>
            </c:choose>
        </c:if>
    </body>
</html>

创建 WEB-INF 目录

将以下内容添加到 web.xml 文件中

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

mkdir WEB-INF/lib

derby.jar复制到WEB-INF/lib中。

现在你应该有3个文件:

$TOMCAT_HOME/webapps/yourapp/index.jsp $TOMCAT_HOME/webapps/yourapp/WEB-INF/web.xml $TOMCAT_HOME/webapps/yourapp/WEB-INF/lib/derby.jar

现在启动Tomcat,然后在浏览器中输入http://localhost:8080/yourapp

你将会得到一个小框,可以在其中输入SQL语句。

Derby会自动为您创建数据库。

使用JSTL和SQL标签,您可以从纯JSP中做任何想做的事情。

在JSP中做所有事情是"最佳实践"吗?不是。

它能工作吗?是的。

它实用吗?是的。

您随时可以稍后更改它。


+1 你可能会注意到,我很久以前就学过JSP了,:P 我一直试图避免学习那些“花哨”的高级JSTL标签 :P :P - OscarRyz
你应该再看一眼。JSP 2.0与集成的JSTL和EL(表达式语言)非常不错。而且JSP 2.0标签文件也很棒。 - Will Hartung

0
你可能想要看一下Apache Derby。最近的JDK将其包含为JavaDB。在Windows上,你可以在ProgramFiles/Sun中找到它。

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