我在通过 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/