JavaをMySQLデータベースに接続する


322

JavaでMySQLデータベースにどのように接続しますか?

やってみると

java.sql.SQLException: No suitable driver found for jdbc:mysql://database/table
    at java.sql.DriverManager.getConnection(DriverManager.java:689)
    at java.sql.DriverManager.getConnection(DriverManager.java:247)

または

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

または

java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver

これは、JavaからMySQLを使用する方法を示す短い3分間のビデオチュートリアルです。こちらをご覧ください:クイックチュートリアル:Javaを使用してMySQLデータベースに接続する
drorw

回答:


208

DriverManagerかなり古い方法です。より良い方法はDataSource、アプリケーションサーバーコンテナーが既に構成されていることを調べて、を取得することです。

Context context = new InitialContext();
DataSource dataSource = (DataSource) context.lookup("java:comp/env/jdbc/myDB");

または、データベースドライバーから直接インスタンス化して構成します。

MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUser("scott");
dataSource.setPassword("tiger");
dataSource.setServerName("myDBHost.example.org");

上記と同じように、そこから接続を取得します。

Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT ID FROM USERS");
...
rs.close();
stmt.close();
conn.close();

1
他の例はcom.mysql.jdbc.Driverどうして使うのですか?この方法は優れていますか?
ジェイソンS

7
これは、古いスタイルのドライバーメカニズムで動作する古いスタイルのDriverクラスだと思います。新しいメカニズムであるをMysqlDataSource実装javax.sql.DataSourceします。
Sean Owen、

1
こんにちは@SeanOwen Iの不思議ことを、なぜ我々は近いんrsstmt?なぜconnですか?
KamuranSönecek16年

3
たぶん、dataSource.setDatabaseName( "database")を追加する必要があります。
Myoch

1
それはより多くのコードですが、物事を明示的にclose()することは良い習慣です。適切な実装では、接続が閉じたときにリソースを閉じる必要があります。ただし、ステートメントまたは接続を再利用する他のコンテキストを検討してください。Javaの7のトライで-リソースで、あなたは自由のために、とにかくこの動作を得る:
ショーン・オーウェン

476

MySQLとJDBCのインストール方法とその使用方法について、順を追って説明します。

  1. MySQLサーバーをダウンロードしてインストールします。いつものようにしてください。ポート番号を変更したときはいつでも覚えておいてください。デフォルトはです3306

  2. JDBCドライバーをダウンロードしてclasspath入れ、ZIPファイルを抽出して、それを含むJARファイルをクラスパスに入れます。ベンダー固有のJDBCドライバーは、 JDBC APIの具体的な実装です(チュートリアルはこちら)。

    あなたはEclipseやNetbeansのようなIDEを使用している場合は、としてJARファイルを追加することにより、クラスパスに追加することができライブラリビルド・パスプロジェクトのプロパティインチ

    コマンドコンソールで "プレーンバニラ"で実行している場合は、Javaアプリケーションを実行するときに、-cpまたは-classpath引数でJARファイルへのパスを指定する必要があります。

    java -cp。; / path / to / mysql-connector.jar com.example.YourClass

    .追加するだけであり、現在のクラスパスにディレクトリを同様にそれを見つけることができそうということcom.example.YourClass;、それがWindowsであるとしてクラスパスの区切りです。Unixではクローン:を使用する必要があります。

  3. MySQLでデータベースを作成します。データベースを作成しましょうjavabase。もちろん、世界制覇を望んでいるので、UTF-8も使用しましょう。

    CREATE DATABASE javabase DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
  4. Java のユーザー作成し、アクセスを許可します。単に使用することrootが悪い習慣だからです。

    CREATE USER 'java'@'localhost' IDENTIFIED BY 'password';
    GRANT ALL ON javabase.* TO 'java'@'localhost' IDENTIFIED BY 'password';
    

    はい、ここでjavaユーザー名とpasswordパスワードです。

  5. JDBC URLを決定します。Javaを使用してMySQLデータベースに接続するには、次の構文のJDBC URLが必要です。

    jdbc:mysql:// hostname:port / databasename
    • hostname:MySQLサーバーがインストールされているホスト名。Javaコードを実行する同じマシンにインストールされている場合は、を使用できますlocalhost。のようなIPアドレスにすることもできます127.0.0.1。接続の問題が発生し、それを解決する127.0.0.1代わりに使用localhostする場合は、ネットワーク/ DNS /ホスト構成に問題があります。

    • port:MySQLサーバーがリッスンするTCP / IPポート。これはデフォルトです3306

    • databasename:接続するデータベースの名前。それjavabaseです。

    したがって、最終的なURLは次のようになります。

    jdbc:mysql:// localhost:3306 / javabase
  6. Javaを使用してMySQLへの接続テストしますmain()接続をテストするメソッドを使用して単純なJavaクラスを作成します。

    String url = "jdbc:mysql://localhost:3306/javabase";
    String username = "java";
    String password = "password";
    
    System.out.println("Connecting database...");
    
    try (Connection connection = DriverManager.getConnection(url, username, password)) {
        System.out.println("Database connected!");
    } catch (SQLException e) {
        throw new IllegalStateException("Cannot connect the database!", e);
    }
    

    を取得した場合はSQLException: No suitable driver、JDBCドライバがまったく自動ロードされなかったか、JDBC URLが間違っている(つまり、ロードされたどのドライバでも認識されなかった)ことを意味します。通常、JDBC 4.0ドライバーは、ランタイムクラスパスにドロップするだけでオートロードされます。どちらか一方を除外するには、次のようにして常に手動でロードできます。

    System.out.println("Loading driver...");
    
    try {
        Class.forName("com.mysql.jdbc.Driver");
        System.out.println("Driver loaded!");
    } catch (ClassNotFoundException e) {
        throw new IllegalStateException("Cannot find the driver in the classpath!", e);
    }
    

    ここではnewInstance()呼び出しは必要ありません。古いバグを修正するためだけorg.gjt.mm.mysql.Driverです。説明はこちら。この行がスローする場合ClassNotFoundException、JDBCドライバークラスを含むJARファイルはクラスパスに配置されていません。

    接続する前に毎回 ドライバーをロードする必要がないことに注意してください。アプリケーションの起動時に一度だけで十分です。

    あなたが取得する場合SQLException: Connection refusedConnection timed out、またはMySQLの特定をCommunicationsException: Communications link failure、それはDBがすべてでは到達できないことを意味します。これには、以下の1つ以上の原因が考えられます。

    1. JDBC URLのIPアドレスまたはホスト名が間違っています。
    2. JDBC URLのホスト名がローカルDNSサーバーで認識されません。
    3. JDBC URLにポート番号がないか間違っています。
    4. DBサーバーがダウンしています。
    5. DBサーバーはTCP / IP接続を受け入れません。
    6. DBサーバーの接続が不足しています。
    7. ファイアウォールやプロキシなど、JavaとDBの間の何かが接続をブロックしています。

    どちらかを解決するには、次のアドバイスに従います。

    1. で確認してテストしますping
    2. DNSを更新するか、代わりにJDBC URLでIPアドレスを使用してください。
    3. my.cnfMySQL DBに基づいて確認します。
    4. DBを起動します。
    5. mysqldがなしで起動されているかどうかを確認し--skip-networking optionます。
    6. DBを再起動し、それに応じてコードを修正して、で接続を閉じますfinally
    7. ファイアウォールを無効にするか、ファイアウォール/プロキシを構成してポートを許可/転送します。

    を閉じることConnection非常に重要です。接続を閉じず、短時間で多くの接続を取得し続けると、データベースの接続が不足し、アプリケーションが破損する可能性があります。必ず取得Connectionしてtry-with-resources声明。または、Java 7をまだ使用していない場合finallyは、try-finallyブロック内で明示的に閉じます。クローズするのfinallyは、例外が発生した場合にもクローズされるようにするためです。これはStatementPreparedStatementおよびにも適用されResultSetます。

接続性に関する限り、これで終わりです。ここでは、基本的なDAOクラスを使用して、価値のあるJavaモデルオブジェクトをデータベースにロードおよび格納する方法のより高度なチュートリアルを見つけることができます。


DB接続にシングルトンパターンを使用するのは悪いアプローチです。他の質問をご覧くださいhttp : //stackoverflow.com/q/9428573/。これは#1の初心者の間違いです。


39

データベース定数を初期化する

定数プロパティデータベースのユーザー名、パスワード、URLとドライバー、ポーリング制限などを作成します。

// init database constants
// com.mysql.jdbc.Driver
private static final String DATABASE_DRIVER = "com.mysql.cj.jdbc.Driver";
private static final String DATABASE_URL = "jdbc:mysql://localhost:3306/database_name";
private static final String USERNAME = "root";
private static final String PASSWORD = "";
private static final String MAX_POOL = "250"; // set your own limit

接続とプロパティの初期化

接続が確立されたら、再利用のために保存することをお勧めします。

// init connection object
private Connection connection;
// init properties object
private Properties properties;

プロパティを作成する

プロパティオブジェクトは接続情報を保持しています。すでに設定されているかどうかを確認してください。

// create properties
private Properties getProperties() {
    if (properties == null) {
        properties = new Properties();
        properties.setProperty("user", USERNAME);
        properties.setProperty("password", PASSWORD);
        properties.setProperty("MaxPooledStatements", MAX_POOL);
    }
    return properties;
}

データベースを接続する

初期化された定数とプロパティを使用してデータベースに接続します。

// connect database
public Connection connect() {
    if (connection == null) {
        try {
            Class.forName(DATABASE_DRIVER);
            connection = DriverManager.getConnection(DATABASE_URL, getProperties());
        } catch (ClassNotFoundException | SQLException e) {
            // Java 7+
            e.printStackTrace();
        }
    }
    return connection;
}

データベースを切断する

データベース操作が完了したら、接続を閉じます。

// disconnect database
public void disconnect() {
    if (connection != null) {
        try {
            connection.close();
            connection = null;
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

すべて一緒に

MysqlConnectdatabase_name、username、passwordなどを変更した直後にこのクラスを使用します。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class MysqlConnect {
    // init database constants
    private static final String DATABASE_DRIVER = "com.mysql.cj.jdbc.Driver";
    private static final String DATABASE_URL = "jdbc:mysql://localhost:3306/database_name";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "";
    private static final String MAX_POOL = "250";

    // init connection object
    private Connection connection;
    // init properties object
    private Properties properties;

    // create properties
    private Properties getProperties() {
        if (properties == null) {
            properties = new Properties();
            properties.setProperty("user", USERNAME);
            properties.setProperty("password", PASSWORD);
            properties.setProperty("MaxPooledStatements", MAX_POOL);
        }
        return properties;
    }

    // connect database
    public Connection connect() {
        if (connection == null) {
            try {
                Class.forName(DATABASE_DRIVER);
                connection = DriverManager.getConnection(DATABASE_URL, getProperties());
            } catch (ClassNotFoundException | SQLException e) {
                e.printStackTrace();
            }
        }
        return connection;
    }

    // disconnect database
    public void disconnect() {
        if (connection != null) {
            try {
                connection.close();
                connection = null;
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

使い方?

データベースクラスを初期化します。

// !_ note _! this is just init
// it will not create a connection
MysqlConnect mysqlConnect = new MysqlConnect();

コードの他の場所...

String sql = "SELECT * FROM `stackoverflow`";
try {
    PreparedStatement statement = mysqlConnect.connect().prepareStatement(sql);
    ... go on ...
    ... go on ...
    ... DONE ....
} catch (SQLException e) {
    e.printStackTrace();
} finally {
    mysqlConnect.disconnect();
}

これがすべてです:)改善すべきことがあれば編集してください!これがお役に立てば幸いです。


マーク、各クラスは、それ自身の個別のMysqlConnectインスタンスを常に開いたままにしておく必要がありますか-データと対話する必要があると想定していますか?この設定がクラス間でどのように機能するのか疑問に思っています。
Michael Sims

前者は非推奨であるため、com.mysql.jdbc.Driverこれの代わりにjdbc:mysql://localhost:3306/stocks使用する必要があります。
Chaudhry Waqas 2018年

アカウント名、パスワード、データベース名などを固定する場合、この方法は非常に扱いにくいです。これらすべての詳細をJDBC URL文字列に入力するだけです。(プールのサイズを含む...)
Stephen C

24
String url = "jdbc:mysql://127.0.0.1:3306/yourdatabase";
String user = "username";
String password = "password";

// Load the Connector/J driver
Class.forName("com.mysql.jdbc.Driver").newInstance();
// Establish connection to MySQL
Connection conn = DriverManager.getConnection(url, user, password);

ここにあなたのデータベースは何ですか?データベース名?
Koray Tugay 2013年

newInstance()は必要ありません。それは...ですか?
Mohamed Ennahdi El Idrissi 2016

いいえ。そうではありません。Java 6以降、このアプローチ全体は古くなっています。そして、ドライバークラス名が変更されました....
ステファンC

12

以下は、MySQLデータベースからデータを取得するために最低限必要なものです。

Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection conn = DriverManager.getConnection
   ("jdbc:mysql://localhost:3306/foo", "root", "password");

Statement stmt = conn.createStatement();
stmt.execute("SELECT * FROM `FOO.BAR`");
stmt.close();
conn.close();

例外処理、設定などを好みに追加します。


3
なぜ必要なのClass.forName(...).newInstance()ですか?
Don Cheadle 2015

5
@mmcrae 2007
ローン侯爵

3

useSSLを使用したMySQL JDBC接続。

private String db_server = BaseMethods.getSystemData("db_server");
private String db_user = BaseMethods.getSystemData("db_user");
private String db_password = BaseMethods.getSystemData("db_password");

private String connectToDb() throws Exception {
   String jdbcDriver = "com.mysql.jdbc.Driver";
   String dbUrl = "jdbc:mysql://" + db_server  +
        "?verifyServerCertificate=false" +
        "&useSSL=true" +
        "&requireSSL=true";
    System.setProperty(jdbcDriver, "");
    Class.forName(jdbcDriver).newInstance();

    Connection conn = DriverManager.getConnection(dbUrl, db_user, db_password);
    Statement statement = conn.createStatement();
    String query = "SELECT EXTERNAL_ID FROM offer_letter where ID =" + "\"" + letterID + "\"";
    ResultSet resultSet = statement.executeQuery(query);
    resultSet.next();
    return resultSet.getString(1);
}

2

クラスパスにmysqlコネクタjarが必要です。

Java JDBC APIでは、データベースですべてを行います。JDBCを使用してJavaアプリケーションを作成でき
ます。1。クエリを送信するか、SQLをDB(任意のリレーショナルデータベース)に更新します。2。DBから結果を取得して処理します。

以下の3つのステップで、任意のデータベースからデータを取得できます

Connection con = DriverManager.getConnection(
                     "jdbc:myDriver:DatabaseName",
                     dBuserName,
                     dBuserPassword);

Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table");

while (rs.next()) {
    int x = rs.getInt("a");
    String s = rs.getString("b");
    float f = rs.getFloat("c");
}

2

短くて甘いコード。

try {       
    Class.forName("com.mysql.jdbc.Driver");
    System.out.println("Driver Loaded");
    conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testDB","root","");
    //Database Name - testDB, Username - "root", Password - ""
    System.out.println("Connected...");         
} catch(Exception e) {
    e.printStackTrace();
}

SQL Server 2012の場合

try {
    String url = "jdbc:sqlserver://KHILAN:1433;databaseName=testDB;user=Khilan;password=Tuxedo123"; 
    //KHILAN is Host    and 1433 is port number     
    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
    System.out.println("Driver Loaded");
    conn = DriverManager.getConnection(url);
    System.out.println("Connected...");
} catch(Exception e) {
    e.printStackTrace();
}

1

Connection私は少し前に使用していた、それが最も簡単な方法のように見えたが、そこにifステートメントをすることをお勧めしました- 正確に

Connection con = DriverManager.getConnection(
                     "jdbc:myDriver:DatabaseName",
                     dBuserName,
                     dBuserPassword);
if (con != null){
 //..handle your code there 
}

またはそのようなもの:)

おそらくいくつかのケースがありgetConnectionますが、戻ることができますnull :)


1

JavaアプリケーションからMySQLデータベースに接続するためのすべての手順は、こちらで確認できます。他のデータベースの場合、最初のステップでのみドライバーを変更する必要があります。データベースへの正しいパスを指定し、ユーザー名とパスワードを修正してください。

http://apekshit.com/t/51/Steps-to-connect-Database-using-JAVAにアクセスします


1
どうやって
  • 簡単なサンプルを実行するようにドライバーを設定するには
1. Go to https://dev.mysql.com/downloads/connector/j/, get the latest version of Connector/J

2. Remember to set the classpath to include the path of the connector jar file.
If we don't set it correctly, below errors can occur:

No suitable driver found for jdbc:mysql://127.0.0.1:3306/msystem_development

java.lang.ClassNotFoundException: com.mysql.jdbc:Driver
  • CLASSPATHを設定するには

方法1:CLASSPATH変数を設定します。

export CLASSPATH=".:mysql-connector-java-VERSION.jar"
java MyClassFile

上記のコマンドでは、CLASSPATHを現在のフォルダーとmysql-connector-java-VERSION.jarファイルに設定しています。したがって、java MyClassFileコマンドが実行されると、JavaアプリケーションランチャーはすべてのJavaクラスをCLASSPATHにロードしようとします。そして、Driveクラス=> BOOMエラーがなくなったことがわかりました。

方法2:

java -cp .:mysql-connector-java-VERSION.jar MyClassFile

注:Class.forName( "com.mysql.jdbc.Driver"); これは現在2019年4月に廃止されます。

これが誰かを助けることを願っています!


-1

MySql JDBC接続:

Class.forName("com.mysql.jdbc.Driver");     

Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/DatabaseName","Username","Password");         
Statement stmt=con.createStatement();            
stmt = con.createStatement();
ResultSet rs=stmt.executeQuery("Select * from Table");  

-1

JDBCドライバーのダウンロード

ダウンロードリンク(プラットフォームに依存しない選択):https : //dev.mysql.com/downloads/connector/j/

JDBCドライバーをCドライブに移動

ファイルを解凍し、C:\ドライブに移動します。あなたのドライバーパスはC:\mysql-connector-java-8.0.19\mysql-connector-java-8.0.19

Javaを実行する

java -cp "C:\mysql-connector-java-8.0.19\mysql-connector-java-8.0.19\mysql-connector-java-8.0.19.jar" testMySQL.java

testMySQL.java

import java.sql.*;
import java.io.*;

public class testMySQL {
    public static void main(String[] args) {
    // TODO Auto-generated method stub
        try
        {  
            Class.forName("com.mysql.cj.jdbc.Driver");  
            Connection con=DriverManager.getConnection(  
                "jdbc:mysql://localhost:3306/db?useSSL=false&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC","root","");  
            Statement stmt=con.createStatement();  
            ResultSet rs=stmt.executeQuery("show databases;");  
            System.out.println("Connected");  
        }
        catch(Exception e)
        {
            System.out.println(e);
        }

    }  

}

ここに画像の説明を入力してください


-2

ショートコード

public class DB {

    public static Connection c;

    public static Connection getConnection() throws Exception {
        if (c == null) {
            Class.forName("com.mysql.jdbc.Driver");
            c =DriverManager.getConnection("jdbc:mysql://localhost:3306/DATABASE", "USERNAME", "Password");
        }
        return c;
    }

    // Send data TO Database
    public static void setData(String sql) throws Exception {
        DB.getConnection().createStatement().executeUpdate(sql);
    }

    // Get Data From Database
    public static ResultSet getData(String sql) throws Exception {
        ResultSet rs = DB.getConnection().createStatement().executeQuery(sql);
        return rs;
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.