質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

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

SQL

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

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

1673閲覧

java.sql.SQLSyntaxErrorException: Table 'dbName.tableName' doesn't exist を解決したいです。

Yakusugi

総合スコア123

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

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

SQL

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

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2021/11/10 00:51

編集2021/11/13 02:13

ローカル環境(Ubuntu 20.04)で簡素なCUIのJavaプログラムを作成しています。
目的は、VirtualBox上のゲストOS(Ubuntu Server 20.04)のMySQLデータベースにアクセスし、
SELECT文で対象のテーブルからデータを抽出することです。
サーバとDBへのアクセスは出来ている事確認済みなのですが、
プログラムを動かすと、下記エラーが表示されます。
※DB名、テーブル名は確認済みです。

java.sql.SQLSyntaxErrorException: Table 'budgettracker.data2020' doesn't exist

私の方でも検索はしてみたのですが、参考になる資料が見当たらず、ご助力頂けますと幸いです。
よろしくお願いいたします。

BudgetTrackerDto.java

package com.jdbc.budgettracker.core; import java.sql.Date; public class BudgetTrackerDto { private int id; private Date date; private String storeName; private String productName; private String productType; private int price; public BudgetTrackerDto() { } public BudgetTrackerDto(int id, Date date, String storeName, String productName, String productType, int price) { super(); this.id = id; this.date = date; this.storeName = storeName; this.productName = productName; this.productType = productType; this.price = price; } public int getId() { return id; } public void setId(int id) { this.id = id; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public String getStoreName() { return storeName; } public void setStoreName(String storeName) { this.storeName = storeName; } public String getProductName() { return productName; } public void setProductName(String productName) { this.productName = productName; } public String getProductType() { return productType; } public void setProductType(String productType) { this.productType = productType; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } }

BudgetTrackerDao.java

package com.jdbc.budgettracker.dao; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import java.util.Properties; import com.jdbc.budgettracker.core.BudgetTrackerDto; public class BudgetTrackerDao { BudgetTrackerDto btd; private Connection myConn; private static final String SQL = "select * from data2020;"; public List<BudgetTrackerDto> selectAll() throws FileNotFoundException, IOException { List<BudgetTrackerDto> budgetList = new ArrayList<>(); // get db properties Properties props = new Properties(); props.load(new FileInputStream("/home/yosuke/BudgertTrackerGui/BudgetTrackerAppGui/sql/config.properties")); String user = props.getProperty("user"); String password = props.getProperty("password"); String dburl = props.getProperty("dburl"); try (Connection conn = DriverManager.getConnection(dburl, user, password); PreparedStatement ps = conn.prepareStatement(SQL)) { try (ResultSet rs = ps.executeQuery()) { while (rs.next()) { btd = new BudgetTrackerDto(); btd.setDate(rs.getDate("Date")); btd.setStoreName(rs.getString("StoreName")); btd.setProductName(rs.getString("ProductName")); btd.setProductType(rs.getString("Type")); btd.setPrice(rs.getInt("Price")); budgetList.add(btd); } } } catch (SQLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { } return budgetList; } }

BudgetTrackerMain.java

package com.jdbc.budgettracker.main; import java.io.FileNotFoundException; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import com.jdbc.budgettracker.dao.BudgetTrackerDao; import com.jdbc.budgettracker.core.BudgetTrackerDto; import java.util.Scanner; public class BudgetTrackerMain { public static void main(String[] args) throws FileNotFoundException, IOException { // TODO Auto-generated method stub BudgetTrackerDao budgetTrackerDao; Map<Integer, String> initialSwitchMap = new HashMap<>(); initialSwitchMap.put(1, "Select"); initialSwitchMap.put(2, "Insert"); initialSwitchMap.put(3, "Update"); initialSwitchMap.put(4, "Delete"); Scanner initialSwitchScanner = new Scanner(System.in); int initialNumInt = 0; do { // String[] initialList = new String[] {initialSwitchMap.get(1), // initialSwitchMap.get(2), initialSwitchMap.get(3), initialSwitchMap.get(4)}; for (Map.Entry<Integer, String> list : initialSwitchMap.entrySet()) { System.out.println(list.getKey() + ":" + list.getValue()); } System.out.print("Select a number: "); String initialNumStr = initialSwitchScanner.next(); initialNumInt = Integer.parseInt(initialNumStr); } while (initialNumInt >= 5 || initialNumInt <= 0); switch (initialNumInt) { case 1: // Select System.out.println("You chose " + initialSwitchMap.get(1)); budgetTrackerDao = new BudgetTrackerDao(); Map<Integer, String> selectSwitchMap = new HashMap<>(); selectSwitchMap.put(1, "Select All"); selectSwitchMap.put(2, "Select by Date"); selectSwitchMap.put(3, "Select by Store"); selectSwitchMap.put(4, "Select by Product"); selectSwitchMap.put(5, "Select by Type"); selectSwitchMap.put(6, "Select by Price"); Scanner selectScanner = new Scanner(System.in); int selectScannerNumInt = 0; do { // String[] selectScanList = new String[] {selectSwitchMap.get(1), // selectSwitchMap.get(2), selectSwitchMap.get(3), selectSwitchMap.get(4), // selectSwitchMap.get(5)}; for (Map.Entry<Integer, String> selectScanlist : selectSwitchMap.entrySet()) { System.out.println(selectScanlist.getKey() + ":" + selectScanlist.getValue()); } System.out.print("Select a number: "); String selectScannerNumStr = selectScanner.next(); selectScannerNumInt = Integer.parseInt(selectScannerNumStr); } while (selectScannerNumInt > 7 || selectScannerNumInt <= 0); do { if (selectScannerNumInt == 1) { System.out.println("Select All----------"); List<BudgetTrackerDto> btd = budgetTrackerDao.selectAll(); for (BudgetTrackerDto b : btd) { System.out.println(b.getDate() + ", " + b.getStoreName() + ", " + b.getProductName() + ", " + b.getProductType() + ", " + b.getPrice()); } } } while (selectScannerNumInt > 7 || selectScannerNumInt <= 0); break; } } }

config.properties

user=user_name password=password dburl=jdbc:mysql://192.168.0.44:3306/budgettracker?allowPublicKeyRetrieval=true&useSSL=false

イメージ説明

select * from information_schema.tables where table_schema='budgettracker' and table_name='data2020';
イメージ説明

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

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

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

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

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

dodox86

2021/11/10 01:04 編集

> Table 'budgettracker.data2020' doesn't exist そのまま、このメッセージで示される状況だと思います。「※DB名、テーブル名は確認済みです。」とのことですが、どのように確認されたのでしょう。 > DriverManager.getConnection(dburl, user,password); でのdburl, user, password と同じ接続情報で当該Javaプログラムを実行した環境でmysqlと接続でき、"select * from data2020;"のSQLは実行できていたのでしょうか。なんとなくですが、テーブルが属しているスキーマ(データベース)が実は違うのではないかな、と思います。
Yakusugi

2021/11/10 01:34

ご回答ありがとうございます。 「※DB名、テーブル名は確認済みです。」に関しては語弊がありました。 確認はJava側ではなく、DBeaver(DBクライアント)で接続を確認した形です。 データベース名に関しては、再度確認してみたのですが、budgettrackerで正しいようです。 一応、DBeaverで確認した際のDB名、テーブル名はスクショを撮って添付しておきます。 ご確認頂けますと幸いです。
dodox86

2021/11/10 01:39

> 「※DB名、テーブル名は確認済みです。」に関しては語弊がありました。 > 確認はJava側ではなく、DBeaver(DBクライアント)で接続を確認した形です。 あ、いえ、確認としてはまずはそのやり方でOKだと思います。要は、同じ接続の様式と想定できるmysqlクライアントでmysqlサーバーと接続し、同等のSQLを実行できていたか、ということを問いたかったのです。
Yakusugi

2021/11/10 05:07

ご回答ありがとうございます。 mysqlクライアントでmysqlサーバーと接続し、SELECT文で同等のSQLは発行できていること確認済みです。
退会済みユーザー

退会済みユーザー

2021/11/11 10:39

DBeaverから、以下を実行した結果はどうなりますか? select * from information_schema.tables where table_schema='budgettracker' and table_name='data2020';
Yakusugi

2021/11/12 05:21

@dameoさん 上記SQLを実行した所、下記エラーが表示されました。 org.jkiss.dbeaver.model.sql.DBSQLException: SQL Error [1064] [42000]: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'and table_name='data2020'' at line 1 at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCStatementImpl.executeStatement(JDBCStatementImpl.java:133) at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.executeStatement(SQLQueryJob.java:510) at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.lambda$0(SQLQueryJob.java:441) at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:169) at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.executeSingleQuery(SQLQueryJob.java:428) at org.jkiss.dbeaver.ui.editors.sql.execute.SQLQueryJob.extractData(SQLQueryJob.java:813) at org.jkiss.dbeaver.ui.editors.sql.SQLEditor$QueryResultsContainer.readData(SQLEditor.java:3273) at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.lambda$0(ResultSetJobDataRead.java:118) at org.jkiss.dbeaver.model.exec.DBExecUtils.tryExecuteRecover(DBExecUtils.java:169) at org.jkiss.dbeaver.ui.controls.resultset.ResultSetJobDataRead.run(ResultSetJobDataRead.java:116) at org.jkiss.dbeaver.ui.controls.resultset.ResultSetViewer$ResultSetDataPumpJob.run(ResultSetViewer.java:4577) at org.jkiss.dbeaver.model.runtime.AbstractJob.run(AbstractJob.java:105) at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63) Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'and table_name='data2020'' at line 1 at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) at com.mysql.cj.jdbc.StatementImpl.executeInternal(StatementImpl.java:764) at com.mysql.cj.jdbc.StatementImpl.execute(StatementImpl.java:648) at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCStatementImpl.execute(JDBCStatementImpl.java:330) at org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCStatementImpl.executeStatement(JDBCStatementImpl.java:130) ... 12 more
退会済みユーザー

退会済みユーザー

2021/11/12 05:26

全角空白入ってただけですね。以下で試してみてください。 select * from information_schema.tables where table_schema='budgettracker' and table_name='data2020';
Yakusugi

2021/11/13 02:13

@dameoさん ご教示頂きありがとうございます。 一部ではありますが、上記SQL実行結果をキャプチャして、添付しておきました。 ご確認下さい。
退会済みユーザー

退会済みユーザー

2021/11/13 03:53 編集

Textタブの内容を貼って頂けないでしょうか?
Yakusugi

2021/11/13 04:02

承知しました。 下記、Textタブの内容になります。 Name |Value | ---------------+-------------------+ TABLE_CATALOG |def | TABLE_SCHEMA |budgettracker | TABLE_NAME |data2020 | TABLE_TYPE |BASE TABLE | ENGINE |InnoDB | VERSION |10 | ROW_FORMAT |Dynamic | TABLE_ROWS |0 | AVG_ROW_LENGTH |0 | DATA_LENGTH |16384 | MAX_DATA_LENGTH|0 | INDEX_LENGTH |16384 | DATA_FREE |0 | AUTO_INCREMENT | | CREATE_TIME |2021-11-09 01:16:24| UPDATE_TIME | | CHECK_TIME | | TABLE_COLLATION|utf8mb4_0900_ai_ci | CHECKSUM | | CREATE_OPTIONS | | TABLE_COMMENT | |
退会済みユーザー

退会済みユーザー

2021/11/13 04:24

問題ないようですね。 とりあえず長いのでソースを以下に縮めました。 package com.jdbc.budgettracker.main; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Properties; public class BudgetTrackerMain { public static void main(String[] args) throws FileNotFoundException, IOException { final String SQL = "select * from data2020;"; Properties props = new Properties(); final String prop_path = "config.properties"; props.load(new FileInputStream(prop_path)); String user = props.getProperty("user"); String password = props.getProperty("password"); String dburl = props.getProperty("dburl"); try (Connection conn = DriverManager.getConnection(dburl, user, password); PreparedStatement ps = conn.prepareStatement(SQL)) { try (ResultSet rs = ps.executeQuery()) { while (rs.next()) { System.out.println(rs.getDate("Date")); System.out.println(rs.getString("StoreName")); System.out.println(rs.getString("ProductName")); System.out.println(rs.getString("Type")); System.out.println(rs.getInt("Price")); } } } catch (SQLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { } } } このプログラムでDB接続中にデバッガで途中で止めて、その状態で、rootでmariadbに接続して SELECT * FROM information_schema.PROCESSLIST; を見て頂けないでしょうか? mysql> SELECT * FROM information_schema.PROCESSLIST; +----+-----------------+--------------------+-----------+---------+------+------------------------+----------------------------------------------+ | ID | USER | HOST | DB | COMMAND | TIME | STATE | INFO | +----+-----------------+--------------------+-----------+---------+------+------------------------+----------------------------------------------+ | 8 | homestead | 192.168.16.3:60340 | homestead | Sleep | 32 | | NULL | | 9 | root | localhost | NULL | Query | 0 | executing | SELECT * FROM information_schema.PROCESSLIST | | 5 | event_scheduler | localhost | NULL | Daemon | 156 | Waiting on empty queue | NULL | +----+-----------------+--------------------+-----------+---------+------+------------------------+----------------------------------------------+ 3 rows in set (0.01 sec) mysql> こんな感じに見えると思うのですが、それを貼ってください。
Yakusugi

2021/11/13 06:01

BudgetTrackerMainを上記に張替え、コードを実行した所、問題なくDBにアクセスでき、テーブルの内容が表示されました。 ありがとうございます。 何故、今まではDBにアクセスが出来なかったんでしょうか。。。 一応、mysql> SELECT * FROM information_schema.PROCESSLIST;の内容を下記に貼っておきます。 ID|USER |HOST |DB |COMMAND|TIME|STATE |INFO | --+---------+------------------+-------------+-------+----+---------+--------------------------------------------------------------------------------------------------------------------------+ 11|host_user|192.168.0.32:50370|budgettracker|Sleep | 72| | | 12|host_user|192.168.0.32:50372|budgettracker|Sleep | 102| | | 13|host_user|192.168.0.32:50374|budgettracker|Sleep | 102| | | 14|host_user|192.168.0.32:50376|budgettracker|Sleep | 72| | | 15|host_user|192.168.0.32:50378|budgettracker|Query | 0|executing|/* ApplicationName=DBeaver 21.0.5 - SQLEditor <Script-29.sql> */ SELECT * FROM information_schema.PROCESSLIST¶LIMIT 0, 200|
退会済みユーザー

退会済みユーザー

2021/11/13 06:05

私の環境では元のコードでも動いてましたよ。 ただ入力操作があって再現コードとしてはかなりアレだったので短くしただけです。
退会済みユーザー

退会済みユーザー

2021/11/13 06:08

ちなみに頼んだ操作は接続先が思った場所と違うケースを想定した検証です。 接続先が違えば出ないので。
Yakusugi

2021/11/13 06:16

ありがとうございます。 前のコードに戻して、DAOパターンでDBにアクセスする方式に戻した所、問題なくアクセス出来ていました。 今回はご協力頂きありがとうございました。 本件はこれにて、解決とさせて頂きます。
guest

回答1

0

自己解決

サーバを再起動したら、アクセス出来るようになっていました。
ご協力頂いた皆さん、ありがとうございました。

投稿2021/11/13 06:17

Yakusugi

総合スコア123

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問