🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

1回答

7577閲覧

JavaのDB接続時に発生するエラーを解決したい

KTG

総合スコア1

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2021/02/04 08:18

##前提
私は、会社に提出するためにJavaで統計解析を行うアプリケーションの設計と開発を行なっています。
このアプリケーションの中で、現在「ログイン機能」の開発を行なっています。

このログイン機能のサーバーサイドの開発で「H2Database」を利用しており、JDBCを利用してJavaでDBに接続してユーザー情報を検索する過程でエラーが発生しており、困っています。

具体的には、
DBの接続をテストしている段階で、DBに接続できないというエラーが発生しております。

こちらが、DB接続をテストするプログラムです。

Java

1package test; 2 3import dao.AccountDAO; 4import model.Account; 5import model.Login; 6 7public class AccountDAOTest { 8 public static void main(String[] args) { 9 testFindByLogin1(); //ユーザーが見つかる場合のテスト 10 testFindByLogin2(); //見つからない場合のテスト 11 } 12 13 public static void testFindByLogin1() { 14 Login login = new Login("minato", "1234"); 15 AccountDAO dao = new AccountDAO(); 16 Account result = dao.findByLogin(login); 17 if (result != null && 18 result.getUserId().equals("minato") && 19 result.getPass().equals("1234") && 20 result.getMail().equals("minato@gmail.com") && 21 result.getName().equals("湊 雄介") && 22 result.getAge() == 23) { 23 System.out.println("1:成功"); 24 } else { 25 System.out.println("1:失敗"); 26 } 27 } 28 29 public static void testFindByLogin2() { 30 Login login = new Login("minato", "12345"); 31 AccountDAO dao = new AccountDAO(); 32 Account result = dao.findByLogin(login); 33 if (result == null) { 34 System.out.println("2:成功"); 35 } else { 36 System.out.println("2:失敗"); 37 } 38 } 39}

次にこちらがJDBCを利用してDBに接続するプログラムです。

Java

1package dao; 2 3import java.sql.Connection; 4import java.sql.DriverManager; 5import java.sql.PreparedStatement; 6import java.sql.ResultSet; 7import java.sql.SQLException; 8 9import model.Account; 10import model.Login; 11 12public class AccountDAO { 13 //DB接続に使用する情報 14 private final String JDBC_URL = "jdbc:h2:tcp://localhost/~/Acount"; 15 //private final String JDBC_URL = "jdbc:h2:~/Account"; 16 private final String DB_USER = "sa"; 17 private final String DB_PASS = ""; 18 19 public Account findByLogin(Login login) { 20 Account account = null; 21 22 //DBに接続 23 try (Connection conn = DriverManager.getConnection(JDBC_URL, DB_USER, DB_PASS)) { 24 //SELECT文を準備 25 String sql = "SELECT USER_ID, PASS, MAIL, NAME, AGE FROM ACCOUNT WHERE USER_ID = ? AND PASS = ?"; 26 PreparedStatement pStmt = conn.prepareStatement(sql); 27 //他のファイルからloginに格納されたuserIdとpassで、ユーザーを検索する 28 pStmt.setString(1, login.getUserId()); 29 pStmt.setString(2, login.getPass()); 30 31 //実行し、結果を取得 32 ResultSet rs = pStmt.executeQuery(); 33 34 //一致したユーザーが存在した場合、Accountインスタンスを作成 35 if (rs.next()) { 36 String userId = rs.getString("USER_ID"); 37 String pass = rs.getString("PASS"); 38 String mail = rs.getString("MAIL"); 39 String name = rs.getString("NAME"); 40 int age = rs.getInt("AGE"); 41 //Account.javaに、ユーザーの情報を渡す 42 account = new Account(userId, pass, mail, name, age); 43 } 44 } catch (SQLException e) { 45 System.out.println(e); 46 return null; 47 } 48 //nullは、ユーザーが見つかっている場合は変更される 49 return null; 50 } 51}

※LoginとAccountは、フィールドを定義しているgetterのみがあるファイルです。

上記のJDBCプログラムをDB接続テストファイルを通して実行すると、

error

1org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database "/Users/nishidayuki/Acount" not found, either pre-create it or allow remote database creation (not recommended in secure environments) [90149-200] 2 at org.h2.message.DbException.getJdbcSQLException(DbException.java:622) 3 at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) 4 at org.h2.message.DbException.get(DbException.java:205) 5 at org.h2.message.DbException.get(DbException.java:181) 6 at org.h2.engine.Engine.openSession(Engine.java:71) 7 at org.h2.engine.Engine.openSession(Engine.java:192) 8 at org.h2.engine.Engine.createSessionAndValidate(Engine.java:171) 9 at org.h2.engine.Engine.createSession(Engine.java:166) 10 at org.h2.server.TcpServerThread.run(TcpServerThread.java:168) 11 at java.base/java.lang.Thread.run(Thread.java:832) 12 131:失敗 14org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database "/Users/nishidayuki/Acount" not found, either pre-create it or allow remote database creation (not recommended in secure environments) [90149-200] 15 at org.h2.message.DbException.getJdbcSQLException(DbException.java:622) 16 at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) 17 at org.h2.message.DbException.get(DbException.java:205) 18 at org.h2.message.DbException.get(DbException.java:181) 19 at org.h2.engine.Engine.openSession(Engine.java:71) 20 at org.h2.engine.Engine.openSession(Engine.java:192) 21 at org.h2.engine.Engine.createSessionAndValidate(Engine.java:171) 22 at org.h2.engine.Engine.createSession(Engine.java:166) 23 at org.h2.server.TcpServerThread.run(TcpServerThread.java:168) 24 at java.base/java.lang.Thread.run(Thread.java:832) 25 262:成功

SQLExceptionに行って上記のようなエラーが出てしまいます。

##自分が試したこと
・JDBCコネクタはトムキャットのlib中の規定の位置に配置している

・DBは起動している

・H2DatabaseのコンソールのJDBCURLはサーバーモードで
jdbc:h2:tcp://localhost/~/Account
であり、
JavaのDAO内にも同じJDBCURLを記述しているが、データベースが見つからないというエラーが出る。

##教えていただきたいこと
DBに接続できていない原因は何なのかを、教えていただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/02/04 08:27

個人情報と思われる記載がありますが、問題ないですか? (Database "/Users/のあと) 問題があれば、この質問を削除申請して、見られたくない部分を伏せた状態で再度投稿してください。
xebme

2021/02/06 00:59

組み込みモードで、~/Accountの~はユーザーのホームディレクトリを表します。組み込みモードでデータベースがなければ新規作成すると思います。サーバーモードで接続する時、~はどのユーザーのホームディレクトリを意味するのでしょうか?tomcatの起動ユーザーですか、サーバーの起動ユーザーですか?~は本当に必要ですか?
guest

回答1

0

データベースファイルが存在しないとエラー文に記載されているので、データベースファイルが作成されていないのが原因だと思います。
対象のディレクトリにH2データベースのインジケータからデータベースファイルは作成しましたでしょうか?

投稿2021/02/05 14:46

favoriteigo

総合スコア66

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KTG

2021/02/06 06:11

/Users/******(ユーザー名)/Account.mv.db というファイルがしっかりありました。 しかしファイルが存在しないと書かれているので、パスの指定の仕方に問題があるのでしょうか?
favoriteigo

2021/02/06 07:06 編集

dbファイルを作り直したほうが早いと思います。 コードとローカル配置はあっていると思いますので。 それかエラーの通りにディレクトリを合わせてためしてみてはいかがでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問