java - 连接到基于文件的 hsql 给出 null
问题描述
我在通过 jdbc 连接到基于文件的 hsqldb 时遇到问题。这是我的道课
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 - 如何在windows上下载安装IBM AS/400数据库?
- ruby-on-rails - 将erb标签添加到rails中的link_to类
- jquery - 无法选中好选择多个下拉列表的复选框?
- c# - 将参数分配给 List
- excel - 如何选择一系列单元格直到特定值
- authentication - 微服务的去中心化身份验证
- python - 如何在 Gurobi 中线性化约束
- python-3.x - Atom 脚本在 Mac 上找不到 Python 3 的路径
- reactjs - 什么时候使用没有依赖的 useEffect?
- .net - TransactionScope 需要在 C# MVC 中启用 DTC