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

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

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

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

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

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

データベース

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

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

解決済

2回答

1333閲覧

データベースとの接続が上手くいきません

hirono_suke

総合スコア7

MySQL

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

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

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

データベース

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

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

0クリップ

投稿2021/09/28 13:21

編集2021/09/29 09:47

現在簡易的なログイン機能をサーブレットとjspを用いて実装しています。,
後述しているLoginServletのコメントアウトしている箇所を付け加えると
java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/14
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:702)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:228)
at dao.AccountDao.findByLogin(AccountDao.java:21)
at bo.LoginLogic.execute(LoginLogic.java:10)
at servlet.LoginServlet.doPost(LoginServlet.java:33)(以下省略)
というメッセージがコンソールに表示されてしまいます。
以下が実装したコードとなります。

package servlet; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import bo.LoginLogic; import entity.Login; @WebServlet("/LoginServlet") public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { RequestDispatcher dispatcher = request.getRequestDispatcher("/jsp/login.jsp"); dispatcher.forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // request.setCharacterEncoding("utf-8"); // // String userId = request.getParameter("userId"); // String pass = request.getParameter("pass"); // // Login login = new Login(userId, pass); // LoginLogic logic = new LoginLogic(); // boolean result = logic.execute(login); // // if(result) { // HttpSession session = request.getSession(); // session.setAttribute("userId", userId); RequestDispatcher dispatcher = request.getRequestDispatcher("/jsp/mypage.jsp"); dispatcher.forward(request, response); // }else { // response.sendRedirect("/14/LoginServlet"); // } } }
package dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import entity.Account; import entity.Login; public class AccountDao { private final String JDBC_URL = "jdbc:mysql://localhost/14"; private final String DB_USER = "root"; private final String DB_PASS = "*********";//セキュリティ上米印とさせていただきます。 public Account findByLogin(Login login) { Account account = null; try(Connection con = DriverManager.getConnection(JDBC_URL, DB_USER, DB_PASS)){ String sql = "SELECT USER_ID, PASS, MAIL, NAME, AGE FROM `14`.account WHERE USER_ID = ? AND PASS = ?"; PreparedStatement ptmt = con.prepareStatement(sql); ptmt.setString(1, login.getUserId()); ptmt.setString(2, login.getPass()); ResultSet rs = ptmt.executeQuery(); if(rs.next()) { String userId = rs.getString("USER_ID"); String pass = rs.getString("PASS"); String mail = rs.getString("MAIL"); String name = rs.getString("NAME"); int age = rs.getInt("AGE"); account = new Account(userId, pass, mail, name, age); } }catch(SQLException e) { e.printStackTrace(); return null; } return account; } }
package bo; import dao.AccountDao; import entity.Account; import entity.Login; public class LoginLogic{ public boolean execute(Login login) { AccountDao aDao = new AccountDao(); Account account = aDao.findByLogin(login); return account != null; } }
package entity; public class Account{ private String userId; private String pass; private String mail; private String name; private int age; public Account() {} public Account(String userId, String pass, String mail, String name, int age) { this.userId = userId; this.pass = pass; this.mail = mail; this.name = name; this.age = age; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } public String getMail() { return mail; } public void setMail(String mail) { this.mail = mail; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
package entity; public class Login{ private String userId; private String pass; public Login() {} public Login(String userId, String pass) { this.userId = userId; this.pass = pass; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } }
ログイン画面(login.jsp) <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>スッキリ商店</title> </head> <body> <form action="/14/LoginServlet" method="post"> ログインID:<input type="text" name="userId"><br/> パスワード:<input type="password" name="pass"><br/> <input type="submit" value="ログイン"> </form> </body> </html>

エラーメッセージからデータベースとの接続に問題があると考え、Junitでテストを行いました
以下のテストコードは正常に作動しています(DaoとLoginLogicのテストです)。
この時はデータベースの値を変更するとテスト結果も変わってくるため、接続はうまくいっていると思われます。

package test; import org.junit.jupiter.api.Test; import dao.AccountDao; import entity.Account; import entity.Login; public class AccountDaoTest { @Test public void testFindByLogin1() { Login login = new Login("minato","1234"); AccountDao aDao = new AccountDao(); Account result = aDao.findByLogin(login); if(result != null && result.getUserId().equals("minato") && result.getPass().equals("1234") && result.getMail().equals("minato@gmail.com") && result.getName().equals("湊雄介") && result.getAge() == 23) { System.out.println("testFindByLogin1:成功しました" ); }else { System.out.println("testFindByLogin1:失敗しました" ); } } @Test public void testFindByLogin2() { Login login = new Login("minato", "1235"); AccountDao aDao = new AccountDao(); Account result = aDao.findByLogin(login); if(result == null) { System.out.println("testFindByLogin2:成功しました" ); }else { System.out.println("testFindByLogin2:失敗しました" ); } } }
package test; import org.junit.jupiter.api.Test; import bo.LoginLogic; import entity.Login; public class LoginLogicTest { @Test public void loginLogicTest1() { Login login = new Login("minato", "1234"); LoginLogic logic = new LoginLogic(); boolean result = logic.execute(login); if(result) { System.out.println("LoginLogicTest1:成功しました"); }else { System.out.println("LoginLogicTest1:失敗しました"); } } @Test public void loginLogicTest2() { Login login = new Login("minato", "1235"); LoginLogic logic = new LoginLogic(); boolean result = logic.execute(login); if(!result) { System.out.println("LoginLogicTest2:成功しました"); }else { System.out.println("LoginLogicTest2:失敗しました"); } } }

なぜログイン画面から入力した場合はログインできないのでしょうか。ご教授いただけると幸いです。

開発環境

Eclipse IDE(version:2021-06 (4.20.0))
サーバ:Tomcat9_Java16
データベース:MySQL(8.0)

JDBCドライバの状態

イメージ説明
イメージ説明

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

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

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

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

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

guest

回答2

0

自己解決

.classpathにmysqlのドライバの登録がうまくいっていなかったのが原因だったようです。
libにおけていたら自動的に書き込まれているはずなのに……少し不思議です。
このようなところも気にしていく必要があることを学びました。回答していただいた方々もありがとうございました。今後ともよろしくお願いします。

投稿2021/10/02 13:01

hirono_suke

総合スコア7

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

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

0

java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/14

このエラーメッセージ自体は、DB ドライバが見つからなかった場合に表示されることが多いようです。

単体テストでは接続できて TomCat では接続できないということのようですので、TomCat 側のクラスパスに DB ドライバが無いのが原因ではないでしょうか?

下記に今回と同様のケースについて記載されていましたので、参考にしてみて下さい。

■ EclipseでNo suitable driver found for エラーが出た時の対処法
https://para-pore.com/error-no-suitable-driver-found-for/

投稿2021/09/28 16:37

cx20

総合スコア4633

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

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

hirono_suke

2021/09/29 09:49

ご回答ありがとうございます。 質問を更新しましたが、おっしゃっていただいた通りに行ってみましたがうまくいきませんでした。もし設置場所が間違ってるなどあればよろしくお願いします。
cx20

2021/09/29 16:50

ぱっと見は良さそうですが、良く分からないですね。。 試しに DriverManager.getConnection() の前に Class.forName("com.mysql.cj.jdbc.Driver"); を追加しても同様のエラーになるか試してもらえますか?(参考サイトで上記の指定をしているのを見かけたので) <参考> ■ eclipseのmysql8.018データ接続 https://teratail.com/questions/232663 ■ Eclipseを使ってTomcat+JSP+Servlet+MySQLでメモアプリ作成 https://qiita.com/zaki-lknr/items/32690b071abf202281d6
shiketa

2021/09/29 23:02

``` private final String JDBC_URL = "jdbc:mysql://localhost/14"; ... String sql = "SELECT USER_ID, PASS, MAIL, NAME, AGE FROM `14`.account WHERE USER_ID = ? AND PASS = ?"; ``` MySQLには詳しくありませんし、ぜんぜん関係ないとはおもいますが、MySQLでは、`14`という数字で始まるDBやテーブルを作れるんですね。
cx20

2021/09/29 23:52

> MySQLでは、`14`という数字で始まるDBやテーブルを作れるんですね。 少しに気になって試してみましたが、引用符で囲めば数値だけのDBやテーブルも作れなくはないようです。 <例> create database `14`;
shiketa

2021/09/30 01:00

わざわざすいません。勉強になります。 ま、No suitable driver found for だから、やっぱ関係ないですね。
dodox86

2021/09/30 01:13

> 引用符で囲めば数値だけのDBやテーブルも作れなくはないようです。 この件は私も知りませんでした。興味がありましたのでウラを取ってみました。 https://dev.mysql.com/doc/refman/8.0/ja/identifiers.html > 識別子は数字で始めることができますが、引用符で囲まれていないかぎり、数字のみで構成することはできません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問