Hubungkan Java ke database MySQL

322

Bagaimana Anda terhubung ke database MySQL di Java?

Ketika saya mencoba, saya mengerti

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)

Atau

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

Atau

java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver
abson
sumber
Berikut ini adalah video tutorial 3 menit singkat yang menunjukkan penggunaan MySQL dari Java. Lihat di sini: Tutorial Cepat: Menghubungkan ke database MySQL menggunakan Java
drorw

Jawaban:

208

DriverManageradalah cara yang cukup lama dalam melakukan sesuatu. Cara yang lebih baik adalah dengan mendapatkan DataSource, baik dengan mencari satu yang sudah dikonfigurasi oleh server aplikasi Anda:

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

atau instantiating dan mengkonfigurasi satu dari driver database Anda secara langsung:

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

dan kemudian mendapatkan koneksi darinya, sama seperti di atas:

Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT ID FROM USERS");
...
rs.close();
stmt.close();
conn.close();
Sean Owen
sumber
1
kenapa contoh lain gunakan com.mysql.jdbc.Driver? Apakah metode ini lebih baik?
Jason S
7
Saya pikir ini adalah kelas Driver gaya lama yang bekerja dengan mekanisme driver gaya lama. MysqlDataSourcemengimplementasikan javax.sql.DataSourceyang merupakan mekanisme yang lebih baru.
Sean Owen
1
Hai @ Soenwen saya heran, kenapa kita tutup rsdan stmt? Kenapa tidak adil conn?
Kamuran Sönecek
3
Mungkin Anda harus menambahkan dataSource.setDatabaseName ("database").
Myoch
1
Merupakan praktik yang baik untuk menutup () hal-hal secara eksplisit, meskipun lebih banyak kode. Implementasi yang baik harus menutup sumber daya ketika koneksi ditutup, ya. Pertimbangkan konteks lain di mana Anda ingin menggunakan kembali pernyataan atau koneksi. Dalam upaya-dengan-sumber daya Java 7, Anda tetap mendapatkan perilaku ini secara gratis:
Sean Owen
476

Berikut ini adalah penjelasan langkah demi langkah cara menginstal MySQL dan JDBC dan cara menggunakannya:

  1. Unduh dan instal server MySQL . Lakukan saja seperti biasa. Ingat nomor port setiap kali Anda mengubahnya. Secara default3306.

  2. Unduh driver JDBC dan masukkan classpath , ekstrak file ZIP dan masukkan file JAR yang mengandung di classpath. Driver JDBC khusus vendor adalah implementasi konkret dari JDBC API ( tutorial di sini ).

    Jika Anda menggunakan IDE seperti Eclipse atau Netbeans, maka Anda dapat menambahkannya ke classpath dengan menambahkan file JAR sebagai Library ke Path Build di properti proyek.

    Jika Anda melakukannya "plain vanilla" di konsol perintah, maka Anda perlu menentukan path ke file JAR di argumen -cpatau -classpathketika menjalankan aplikasi Java Anda.

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

    Itu .hanya ada untuk menambahkan direktori saat ini ke classpath juga sehingga dapat menemukan com.example.YourClassdan ;pemisah classpath seperti di Windows. Di Unix dan klon :harus digunakan.

  3. Buat database di MySQL . Mari kita buat database javabase. Anda tentu saja ingin Dominasi Dunia, jadi mari kita gunakan UTF-8 juga.

    CREATE DATABASE javabase DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
  4. Buat pengguna untuk Java dan beri akses . Hanya karena menggunakanrootadalah praktik yang buruk.

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

    Ya, javaadalah nama pengguna dan passwordkata sandi di sini.

  5. Tentukan URL JDBC . Untuk menghubungkan database MySQL menggunakan Java, Anda memerlukan URL JDBC dalam sintaks berikut:

    jdbc: mysql: // hostname: port / databasename
    • hostname: Nama host tempat server MySQL diinstal. Jika diinstal di mesin yang sama di mana Anda menjalankan kode Java, maka Anda bisa menggunakannya localhost. Ini juga bisa berupa alamat IP seperti 127.0.0.1. Jika Anda mengalami masalah konektivitas dan menggunakan 127.0.0.1alih-alih localhostmenyelesaikannya, maka Anda memiliki masalah dalam konfigurasi jaringan / DNS / host Anda.

    • port: Port TCP / IP tempat server MySQL mendengarkan. Ini secara default 3306.

    • databasename: Nama database yang ingin Anda sambungkan. Itu javabase.

    Jadi URL final akan terlihat seperti:

    jdbc: mysql: // localhost: 3306 / javabase
  6. Uji koneksi ke MySQL menggunakan Java . Buat kelas Java sederhana denganmain()metode untuk menguji koneksi.

    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);
    }
    

    Jika Anda mendapatkan SQLException: No suitable driver, maka itu berarti bahwa driver JDBC sama sekali tidak dimuat secara otomatis atau bahwa URL JDBC salah (yaitu tidak dikenali oleh driver yang dimuat). Biasanya, driver JDBC 4.0 harus di-autoload ketika Anda baru saja menjatuhkannya di kelas runtime. Untuk mengecualikan satu dan lainnya, Anda selalu dapat memuatnya secara manual seperti di bawah ini:

    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);
    }
    

    Perhatikan bahwa newInstance()panggilan tidak diperlukan di sini. Itu hanya untuk memperbaiki yang lama dan buggy org.gjt.mm.mysql.Driver. Penjelasan di sini . Jika baris ini melempar ClassNotFoundException, maka file JAR yang berisi kelas driver JDBC sama sekali tidak ditempatkan di classpath.

    Perhatikan bahwa Anda tidak perlu memuat driver setiap kali sebelum menghubungkan. Hanya sekali saja selama startup aplikasi sudah cukup.

    Jika Anda mendapatkan SQLException: Connection refusedatau Connection timed outatau spesifik MySQL CommunicationsException: Communications link failure, maka itu berarti DB tidak dapat dijangkau sama sekali. Ini dapat memiliki satu atau lebih penyebab berikut:

    1. Alamat IP atau nama host di URL JDBC salah.
    2. Nama host di URL JDBC tidak dikenali oleh server DNS lokal.
    3. Nomor port tidak ada atau salah dalam URL JDBC.
    4. Server DB sedang down.
    5. Server DB tidak menerima koneksi TCP / IP.
    6. Server DB kehabisan koneksi.
    7. Sesuatu di antara Java dan DB memblokir koneksi, misalnya firewall atau proxy.

    Untuk mengatasi yang satu atau yang lain, ikuti saran berikut:

    1. Verifikasi dan ujilah dengan ping.
    2. Segarkan DNS atau gunakan alamat IP dalam URL JDBC.
    3. Verifikasi berdasarkan my.cnfMySQL DB.
    4. Mulai DB.
    5. Verifikasi apakah mysqld dimulai tanpa --skip-networking option.
    6. Nyalakan kembali DB dan perbaiki kode Anda sehingga menutup koneksi finally.
    7. Nonaktifkan firewall dan / atau konfigurasikan firewall / proxy untuk mengizinkan / meneruskan port.

    Perhatikan bahwa menutup Connectionadalah sangat penting. Jika Anda tidak menutup koneksi dan terus mendapatkan banyak dari mereka dalam waktu singkat, maka database mungkin kehabisan koneksi dan aplikasi Anda mungkin rusak. Selalu dapatkan Connectiondalam try-with-resourcespernyataan . Atau jika Anda tidak di Jawa 7 belum, secara eksplisit dekat dalam finallysebuah try-finallyblok. Menutup finallyhanya untuk memastikan bahwa itu ditutup juga dalam kasus pengecualian. Ini juga berlaku untuk Statement, PreparedStatementdan ResultSet.

Itu sejauh menyangkut konektivitas. Anda dapat menemukan di sini tutorial yang lebih maju bagaimana memuat dan menyimpan objek model Java yang layak dalam database dengan bantuan kelas DAO dasar.


Menggunakan Pola Singleton untuk koneksi DB adalah pendekatan yang buruk. Lihat di antara pertanyaan lain: http://stackoverflow.com/q/9428573/ . Ini adalah kesalahan pemula # 1.

BalusC
sumber
39

Inisialisasi konstanta basis data

Buat nama pengguna, kata sandi, URL dan driver properti konstan, batas pemungutan suara, dll.

// 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

Inisialisasi Koneksi dan Properti

Setelah koneksi dibuat, lebih baik menyimpan untuk tujuan penggunaan kembali.

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

Buat Properti

Objek properti menyimpan informasi koneksi, periksa apakah sudah disetel.

// 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;
}

Hubungkan Database

Sekarang terhubung ke database menggunakan konstanta dan properti yang diinisialisasi.

// 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;
}

Putuskan koneksi basis data

Setelah Anda selesai dengan operasi basis data, tutup saja koneksi.

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

Semuanya bersama

Gunakan kelas ini MysqlConnectsecara langsung setelah mengubah database_name, nama pengguna dan kata sandi dll.

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();
            }
        }
    }
}

Cara Penggunaan?

Inisialisasi kelas basis data.

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

Di tempat lain dalam kode Anda ...

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();
}

Ini semua :) Jika ada yang perlu diperbaiki sunting! Semoga ini bisa membantu.

Madan Sapkota
sumber
Mark, apakah masing-masing kelas perlu mempertahankan instance MysqlConnect terpisah sendiri terbuka setiap saat - dengan asumsi mereka perlu berinteraksi dengan data? Saya hanya ingin tahu bagaimana pengaturan ini bekerja antar kelas.
Michael Sims
di tempat com.mysql.jdbc.Driverini jdbc:mysql://localhost:3306/stocksharus digunakan sebagai yang sudah usang.
Chaudhry Waqas
Jika Anda akan menggunakan nama akun, kata sandi, nama database dll, cara ini sangat ceroboh. Masukkan saja semua detail itu ke dalam string URL JDBC. (Termasuk ukuran kolam ...)
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);
heffaklump
sumber
apa databasemu di sini? nama basis data?
Koray Tugay
newInstance () tidak perlu. Apakah itu?
Mohamed Ennahdi El Idrissi
Nggak. Bukan itu. Dan karena Java 6 seluruh pendekatan ini sudah ketinggalan zaman. Dan nama kelas pengemudi telah berubah dan ....
Stephen C
12

Inilah jumlah minimum yang Anda butuhkan untuk mendapatkan data dari database 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();

Tambahkan penanganan pengecualian, konfigurasi, dll. Sesuai selera.

Kilian Foth
sumber
3
mengapa Anda perlu Class.forName(...).newInstance()?
Don Cheadle
5
@mmcrae Anda tidak, sejak 2007.
Marquis dari Lorne
3

Koneksi MySQL JDBC dengan useSSL.

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);
}
AJC
sumber
2

Anda perlu memiliki stoples konektor mysql di classpath Anda.

di Java JDBC API membuat semuanya dengan database. menggunakan JDBC kita dapat menulis aplikasi Java ke
1. Kirim pertanyaan atau perbarui SQL ke DB (semua basis data relasional) 2. Ambil dan proses hasil dari DB

dengan tiga langkah di bawah ini kami dapat mengambil data dari Database apa pun

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");
}
kapil das
sumber
2

Kode pendek dan manis.

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();
}

Untuk 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();
}
KhiLan PaTeL
sumber
1

ConnectionSaya menggunakan beberapa waktu yang lalu, itu tampak seperti cara termudah, tetapi juga ada rekomendasi untuk membuat ifpernyataan di sana- persis

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

Atau sesuatu seperti itu :)

Mungkin ada beberapa kasus, sementara getConnectiondapat kembali null :)

xxxvodnikxxx
sumber
1

Anda dapat melihat semua langkah untuk menghubungkan database MySQL dari aplikasi Java di sini . Untuk database lain, Anda hanya perlu mengubah driver di langkah pertama saja. Pastikan Anda memberikan jalur yang benar ke basis data dan memperbaiki nama pengguna dan kata sandi.

Kunjungi http://apekshit.com/t/51/Steps-to-connect-Database-using-JAVA

Jwalant
sumber
1
BAGAIMANA
  • Untuk mengatur Driver untuk menjalankan sampel cepat
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
  • Untuk mengatur CLASSPATH

Metode 1: mengatur variabel CLASSPATH.

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

Dalam perintah di atas, saya telah mengatur CLASSPATH ke folder saat ini dan file mysql-connector-java-VERSION.jar. Jadi ketika java MyClassFileperintah dieksekusi, peluncur aplikasi java akan mencoba memuat semua kelas Java di CLASSPATH. Dan ditemukan bahwa Drivekesalahan BOOM class => hilang.

Metode 2:

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

Catatan: Class.forName ("com.mysql.jdbc.Driver"); Ini sudah usang saat ini 2019 Apr.

Semoga ini bisa membantu seseorang!

Nhat Dinh
sumber
-1

Koneksi 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");  
Sarat Chandra
sumber
-1

Unduh Driver JDBC

Tautan unduhan (Pilih platform independen): https://dev.mysql.com/downloads/connector/j/

Pindahkan Driver JDBC ke Drive C

Buka zip file dan pindah ke C: \ drive. Jalur driver Anda harus sepertiC:\mysql-connector-java-8.0.19\mysql-connector-java-8.0.19

Jalankan Java Anda

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);
        }

    }  

}

masukkan deskripsi gambar di sini

Kunyah Zai
sumber
-2

Kode pendek

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;
    }
}
Corrupted_S.K
sumber