java - 与基于文件的 hsql 的连接给出 null

标签 java database gradle jdbc hsqldb

我在通过 jdbc 连接到基于文件的 hsqldb 时遇到问题。 这是我的 Dao 类

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class EventDao {
    private static final String URL = "jdbc:hsqldb:file:C:/Applications/CreditTask/db";
    private static final String USER = "sa";
    private static final String PASS = "";
    private Connection connection;

public EventDao() {
    try {
        Class.forName("org.hsqldb.jdbc.JDBCDriver");
        connection = DriverManager.getConnection(URL, USER, PASS);
        dropAndCreateTable();
    } catch (SQLException | ClassNotFoundException e) {
        e.printStackTrace();
    }
}

private void dropAndCreateTable() throws SQLException {
    final String dropSql = "drop table event";
    PreparedStatement preparedStatement = connection.prepareStatement(dropSql);
    preparedStatement.execute();
    final String createSql = "create table event(\n" +
            "    id int not null,\n" +
            "    state varchar(10) not null,\n" +
            "    timestamp int not null,\n" +
            "    type varchar(15),\n" +
            "    host varchar(15),\n" +
            "    alert boolean\n" +
            ")";
    preparedStatement = connection.prepareStatement(createSql);
    preparedStatement.execute();
}

public void save(Event event) {
    final String sql = "insert into event(id,state,timestamp,type,host,alert) values (?,?,?,?,?,?)";
    try {
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setString(1, event.getId());
        preparedStatement.setString(2, event.getState());
        preparedStatement.setString(3, event.getTimestamp().toString());
        preparedStatement.setString(4, event.getType());
        preparedStatement.setString(5, event.getHost());
        preparedStatement.setString(6, event.getAlert().toString());
        preparedStatement.executeUpdate();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

public void close() {
    try {
        connection.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

}

这是我使用它的地方

public class EventParser {

private static final String FILE_NAME = "log.json";
private static final String STARTED = "STARTED";
private static final String FINISHED = "FINISHED";
private static final Long MAX_ALERT_RANGE = 4L;
private static final Logger logger
        = LoggerFactory.getLogger(EventParser.class);

public static void main(String[] args) {
    EventParser eventParser = new EventParser();
    eventParser.runApp();
}

public void runApp() {
    try {
        EventDao eventDao = new EventDao();
        logger.info("Reading events from file");
        Map<String, EventWrapper> eventsFromFile = readEventsFromFile();
        List<Event> eventsToSave = calculateEventTime(eventsFromFile);
        //2h in this state i didn't test saving to db using eventDao
        for (Event event : eventsToSave) {
            Runnable runnable = () -> eventDao.save(event);
            runnable.run();
        }
        eventDao.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
//rest of the class are methods that giving me arrays of events

问题是当我运行此应用程序时出现错误:

java.lang.ClassNotFoundException: org.hsqldb.jdbc.JDBCDriver
at 

java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:332)
at event.EventDao.<init>(EventDao.java:19)
at event.EventParser.runApp(EventParser.java:32)
at event.EventParser.main(EventParser.java:27)

我阅读了文档并检查是否已下载该库,但一切似乎都正常。您有任何想法为什么我在连接中变得空吗?此外,此应用程序还有任何改进,我不需要每次通过 dao 构造函数运行应用程序时都使用 drop 和 create table?

最佳答案

当调用 Class.forName("org.hsqldb.jdbc.JDBCDriver") 抛出异常时,这意味着 hsqldb.jar 未包含在您的执行 java ... 命令时的类路径。

关于java - 与基于文件的 hsql 的连接给出 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57193758/

相关文章:

java - SP 对于同一参数返回不同的结果集

gradle - 您无法更改配置 'providedRuntime',因为它已解决

java - gradle - "compileJava"因为 "UP-TO-DATE"而没有编译 Java?

java - 使用 openCSV 导出数据时是否可以删除分隔符?

java - 为什么对象对所有线程都可见,而读取线程可能无法及时看到另一个线程写入的值?

java - 如何在 Java 代码中设置 TCP_CORK 选项

mysql - 我想知道这个 MySQL 查询是否正确? (MySQL 加入乐趣!)

android - Android 应用程序的离线字典数据库

maven - 即使我没有在任何地方配置它,Android Gradle Build 也会尝试访问 JCenter

java - 当我定义接口(interface)方法的参数 final 时,我需要在实现中重复 final 吗?