実現したいこと
H2DATABASEにあるテーブルの中身をEclipse上で取り出したい
発生している問題・分からないこと
すっきりわかるサーブレットJSPの13章にて、ウェブ付録にあるH2DATABASEにデータベースを作成しようとしたところ
(https://sukkiri.jp/books/sukkiri_servlet4/sukkiri_servlet4_appendix/h2-database%e3%81%ab%e3%83%87%e3%83%bc%e3%82%bf%e3%83%99%e3%83%bc%e3%82%b9%e3%82%92%e4%bd%9c%e6%88%90.html?section=13.1.1)
Generic H2(Embedded)を選択し、本書では「jdbc:h2:tcp://localhost/~/example」を指定した場合、
C:¥dataフォルダにあるデータベースexample」作成されます。」とあるのですがこれを実行しても作成されなかったので
Cドライブ直下にDATAフォルダを作成し、jdbc:h2:file:c:/data/exampleとしてパスワード1234を設定するとファイルを作ることができました
そしてこのデータベースに
CREATE TABLE EMPLOYEES (
ID CHAR (6) PRIMARY KEY,
NAME VARCHAR (100) NOT NULL,
AGE INT NOT NULL
);
INSERT INTO EMPLOYEES (ID, NAME, AGE) VALUES ('EMP001', '湊 雄輔', 23);
INSERT INTO EMPLOYEES (ID, NAME, AGE) VALUES ('EMP002', '綾部 めぐみ', 22);
とテーブルを作成、実行すると正しくテーブルが作成されているのを確認できました
その後H2DATABASEのJDBCドライバをダウンロード、webapp/WEB-INF/libフォルダにこのドライバをコピーして配置しました
そしてこれを実行するためにエクリプスで動的webプロジェクトでexampleを作成しました(以下コード)がエラー(おそらく例外?)が発生してしまいました
後に「jdbc:h2:~/example」としてもH2DATABASEに接続することはできましたがこれをエクリプス上で入力したも結局同じようにエラーになってしましました
エラーメッセージ
error
1<eclpse> 2 3Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory 4 at org.apache.tomcat.util.compat.Jre16Compat.<clinit>(Jre16Compat.java:33) 5 at org.apache.tomcat.util.compat.JreCompat.<clinit>(JreCompat.java:60) 6 at org.apache.catalina.startup.Tomcat.<clinit>(Tomcat.java:1193) 7Caused by: java.lang.ClassNotFoundException: org.apache.juli.logging.LogFactory 8 at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) 9 at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) 10 at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526) 11 ... 3 more 12 13 14<Java Virtul Machine Launcher> 15 16A Java Exception has occured
該当のソースコード
<ECLIPSE> 動的webプロジェクト"example" package example; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class SelectEmployees { public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ try { Class.forName("org.h2.Driver"); } catch (ClassNotFoundException e) { throw new IllegalStateException( "JDCドライバを読み込めませんでした"); } try (Connection conn = DriverManager.getConnection( "jdbc:h2:file:c:/data/example", "sa", "1234")) { String sql = "SELECT ID,NAME,AGE FROM EMPLOYEES"; PreparedStatement pSmt = conn.prepareStatement(sql); ResultSet rs=pSmt.executeQuery(); while (rs.next()) { String id=rs.getString("ID"); String name=rs.getString("NAME"); int age=rs.getInt("AGE"); System.out.println("ID"+id); System.out.println("ID"+age); System.out.println("ID"+name); } }catch(SQLException e) { e.printStackTrace(); } } } <H2DATABASE> ”EMPLOYEES” DROP TABLE IF EXISTS TEST; CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR(255)); INSERT INTO TEST VALUES(1, 'Hello'); INSERT INTO TEST VALUES(2, 'World'); SELECT * FROM TEST ORDER BY ID; UPDATE TEST SET NAME='Hi' WHERE ID=1; DELETE FROM TEST WHERE ID=2;
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
もともと本書では「【13章 13.1.1】で使用するexampleデータベースを作成するには、JDBC URLはjdbc:h2:~/example
を指定してください
※ データベースがH2コンソールを操作したユーザのホームディレクトリに作成されます。」とあったのですがこjdbc:h2:~/example
を入力しても
Database ~/example
not found, either pre-create it or allow remote database creation (not recommended in secure environments) [90149-200] 90149/90149 (ヘルプ)
(細かいエラーまでは忘れました、この後エラーが出なくなったので)
と表示されていたがこの後上記のように、jdbc:h2:file:c:/data/example
を作成、そしてサーバに項目を変える?)とjdbc:h2:~/example
と入力してもエラーにはならなくなりました
補足
<環境>
エクリプス
Version: 2024-12 (4.34.0)
Build id: 20241128-0757
openjdk version "12.0.2" 2019-07-16
OpenJDK Runtime Environment (build 12.0.2+10)
OpenJDK 64-Bit Server VM (build 12.0.2+10, mixed mode, sharing)
TomCat10 java21
