Java'yı bir MySQL veritabanına bağlama


322

Java'daki bir MySQL veritabanına nasıl bağlanıyorsunuz?

Denediğimde

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)

Veya

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

Veya

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

İşte Java'dan MySQL kullanımını gösteren 3 dakikalık kısa bir video eğitimi. Buradan kontrol edin: Hızlı Eğitim: Java kullanarak MySQL veritabanına bağlanma
drorw

Yanıtlar:


208

DriverManagerbir şeyler yapmanın oldukça eski bir yoludur. En iyi yol, DataSourceuygulama sunucusu kapsayıcısının sizin için önceden yapılandırılmış olana bakarak aşağıdakileri elde etmektir:

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

veya doğrudan veritabanı sürücünüzden bir örnek oluşturma ve yapılandırma:

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

ve daha sonra yukarıdakiyle aynı bağlantıları alın:

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

1
diğer örnekler nasıl kullanılır com.mysql.jdbc.Driver? bu yöntem daha mı iyi?
Jason S

7
Bu eski stil sürücü mekanizması ile çalışan eski stil Sürücü sınıfı olduğunu düşünüyorum. yeni mekanizma olanı MysqlDataSourceuygular javax.sql.DataSource.
Sean Owen

1
Merhaba @SeanOwen Acaba, neden kapatıyoruz rsve stmt? Neden sadece conn?
Kamuran Sönecek

3
Belki de dataSource.setDatabaseName ("veritabanı") eklemeniz gerekir.
Myoch

1
Daha fazla kod olmasına rağmen, şeyleri açıkça kapatmak () iyi bir uygulamadır. Herhangi bir iyi uygulama, bağlantı kapandığında kaynakları kapatmak zorunda kalacaktır, evet. Bir ifadeyi veya bağlantıyı tekrar kullanmak istediğiniz diğer bağlamları düşünün. Java 7'nin kaynaklarla denemesinde, bu davranışı yine de ücretsiz olarak alabilirsiniz:
Sean Owen

476

MySQL ve JDBC'nin nasıl kurulacağı ve nasıl kullanılacağı ile ilgili adım adım açıklama:

  1. MySQL sunucusunu indirin ve kurun . Sadece her zamanki gibi yap. Her değiştirdiğinizde bağlantı noktası numarasını hatırlayın. Varsayılan olarak3306.

  2. JDBC sürücüsünü indirin ve sınıfyoluna koyun , ZIP dosyasını çıkarın ve içeren JAR dosyasını sınıfyoluna koyun. Satıcıya özgü JDBC sürücüsü, JDBC API'sinin somut bir uygulamasıdır( eğitim burada ).

    Eğer Eclipse veya Netbeans gibi bir IDE kullanıyorsanız, o zaman olarak JAR dosyası ekleyerek Sınıfyoluna ekleyebilirsiniz Kütüphane için Yapı Yol projenin özelliklerinde.

    Komut konsolunda "düz vanilya" yapıyorsanız , Java uygulamanızı yürütürken -cpveya -classpathbağımsız değişkenindeki JAR dosyasının yolunu belirtmeniz gerekir .

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

    .Eklemek için sadece orada geçerli de bu yüzden bulabilmesi sınıf için dizini com.example.YourClassve ;Windows'ta olduğu gibi sınıf yolu ayırıcı olduğunu. Unix ve klonlarda :kullanılmalıdır.

  3. Bir oluşturma veritabanı MySQL . Bir veritabanı oluşturalım javabase. Tabii ki Dünya Hakimiyeti istiyorsun, hadi UTF-8'i de kullanalım.

    CREATE DATABASE javabase DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
  4. Bir kullanıcı oluşturun Java için ve hibe , erişim . Çünkü kullanmakrootkötü bir uygulamadır.

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

    Evet, javakullanıcı adı ve passwordşifre burada.

  5. JDBC URL'sini belirleyin . MySQL veritabanını Java kullanarak bağlamak için aşağıdaki sözdiziminde bir JDBC URL'sine ihtiyacınız vardır:

    jdbc: mysql: // hostname: port / databasename
    • hostname: MySQL sunucusunun kurulu olduğu ana bilgisayar adı. Java kodunu çalıştırdığınız makineye yüklenmişse, sadece kullanabilirsiniz localhost. Bunun gibi bir IP adresi de olabilir 127.0.0.1. Bağlantı sorunlarıyla karşılaşırsanız ve bunu çözmek 127.0.0.1yerine kullanmakla karşılaşırsanız localhost, ağ / DNS / hosts yapılandırmanızda bir sorun vardır.

    • port: MySQL sunucusunun dinlediği TCP / IP bağlantı noktası. Varsayılan olarak budur 3306.

    • databasename: Bağlanmak istediğiniz veritabanının adı. İşte javabase.

    Dolayısıyla, nihai URL şöyle görünmelidir:

    jdbc: mysql: // localhost: 3306 / javabase
  6. Java kullanarak MySQL bağlantısını test edin . main()Bağlantıyı test etme yöntemiylebasit bir Java sınıfı oluşturun.

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

    Bir alırsanız SQLException: No suitable driver, JDBC sürücüsünün otomatik olarak yüklenmediği veya JDBC URL'sinin yanlış olduğu (yani yüklü sürücülerden herhangi biri tarafından tanınmadığı) anlamına gelir. Normalde, çalışma zamanı sınıf yoluna bıraktığınızda JDBC 4.0 sürücüsünün otomatik yüklenmesi gerekir. Birini ve diğerini hariç tutmak için, her zaman aşağıdaki gibi manuel olarak yükleyebilirsiniz:

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

    Burada newInstance()aramaya gerek olmadığını unutmayın . Sadece eski ve arabayı tamir etmek org.gjt.mm.mysql.Driver. Burada açıklama . Bu satır atılırsa ClassNotFoundException, JDBC sürücü sınıfını içeren JAR dosyası sınıf yoluna yerleştirilmez.

    Bağlamadan önce sürücüyü her zaman yüklemenize gerek olmadığını unutmayın . Uygulama başlatma sırasında sadece bir kez yeterlidir.

    Bir SQLException: Connection refusedveya Connection timed outMySQL'e özel alırsanız CommunicationsException: Communications link failure, DB'ye hiç ulaşılamaz demektir. Bu, aşağıdaki nedenlerden bir veya daha fazlasına sahip olabilir:

    1. JDBC URL'sindeki IP adresi veya ana bilgisayar adı yanlış.
    2. JDBC URL'sindeki ana bilgisayar adı yerel DNS sunucusu tarafından tanınmıyor.
    3. JDBC URL'sinde bağlantı noktası numarası eksik veya yanlış.
    4. DB sunucusu kapalı.
    5. DB sunucusu TCP / IP bağlantılarını kabul etmez.
    6. DB sunucusunda bağlantı yok.
    7. Java ve DB arasındaki bir şey, örneğin bir güvenlik duvarı veya proxy gibi bağlantıları engellemektir.

    Birini veya diğerini çözmek için aşağıdaki önerileri uygulayın:

    1. Bunları doğrulayın ve test edin ping.
    2. DNS'yi yenileyin veya bunun yerine JDBC URL'sinde IP adresi kullanın.
    3. my.cnfMySQL DB tabanlı olduğunu doğrulayın .
    4. DB'yi başlatın.
    5. Mysqld öğesinin --skip-networking option.
    6. DB'yi yeniden başlatın ve kodunuzu bağlantılarını kapatacak şekilde düzeltin finally.
    7. Güvenlik duvarını devre dışı bırakın ve / veya bağlantı noktasına izin vermek / yönlendirmek için güvenlik duvarını / proxy'yi yapılandırın.

    Kapanış unutmayın Connectionolduğu son derece önemlidir. Bağlantıları kapatmaz ve kısa bir süre içinde birçoğunu almaya devam ederseniz, veritabanı bağlantılarınız bitebilir ve uygulamanız bozulabilir. Her zaman Connectionbir try-with-resourcesdeyimde edin . Veya henüz Java 7'de değilseniz, açıkça finallybir try-finallyblokta kapatın . Kapatmak finally, sadece bir istisna durumunda da kapanmasını sağlamaktır. Bu Statement, PreparedStatementve için de geçerlidir ResultSet.

Bağlantı kaygısı bu kadar. Burada , temel bir DAO sınıfının yardımıyla, tam değerli Java modeli nesnelerini bir veritabanına nasıl yükleyeceğinizi ve depolayacağınızı daha gelişmiş bir öğretici bulabilirsiniz .


DB bağlantısı için bir Tekli Kalıp kullanmak kötü bir yaklaşımdır. Diğer sorulara bakınız: http://stackoverflow.com/q/9428573/ . Bu bir # 1 başlangıç ​​hatasıdır.


39

Veritabanı sabitlerini başlat

Sabit özellikler veritabanı kullanıcı adı, şifre, URL ve sürücüler, yoklama sınırı vb. Oluşturun.

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

Bağlantıyı ve Özellikleri Başlatma

Bağlantı kurulduktan sonra, yeniden kullanım amacıyla saklamak daha iyidir.

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

Özellik Oluştur

Özellikler nesnesi bağlantı bilgilerini tutar, önceden ayarlanmış olup olmadığını kontrol eder.

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

Veritabanını Bağlama

Şimdi başlatılan sabitleri ve özellikleri kullanarak veritabanına bağlanın.

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

Veritabanının bağlantısını kesin

Veritabanı işlemlerini tamamladıktan sonra bağlantıyı kapatmanız yeterlidir.

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

Her şey birlikte

MysqlConnectVeritabanı_adı, kullanıcı adı ve şifre vb. Değiştirildikten sonra bu sınıfı doğrudan kullanın .

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

Nasıl kullanılır?

Veritabanı sınıfını başlatın.

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

Kodunuzda başka bir yerde ...

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

Hepsi bu :) Geliştirmek için bir şey varsa düzenleyin! Umarım bu yardımcı olur.


Mark, her sınıfın kendi ayrı MysqlConnect örneğini her zaman açık tutması gerekiyor mu - verilerle etkileşim kurmaları gerektiği varsayılarak? Sadece bu kurulumun sınıflar arasında nasıl çalıştığını merak ediyorum.
Michael Sims

yerine com.mysql.jdbc.Driverbu jdbc:mysql://localhost:3306/stockseski kullanımdan kaldırılmıştır olarak kullanılmalıdır.
Chaudhry Waqas

Hesap adı, şifre, veritabanı adı vb. Tüm bu ayrıntıları JDBC URL dizesine koyun. (Havuz büyüklüğü dahil ...)
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);

burada veritabanınız nedir? veri tabanı ismi?
Koray Tugay

newInstance () gerekli değildir. Bu mu?
Mohamed Ennahdi El Idrissi

Hayır! Öyle değil. Java 6'dan beri bu yaklaşımın tamamı güncel değil. Ve sürücü sınıfı adı değişti ve ....
Stephen C

12

MySQL veritabanından veri alabilmeniz için gereken minimum miktar şudur:

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

Tatmak için istisna işleme, yapılandırma vb. Ekleyin.


3
neden ihtiyacın var Class.forName(...).newInstance()?
Don Cheadle

5
@mmcrae 2007'den beri yapmıyorsunuz.
Lorne Marquis

3

UseSSL ile MySQL JDBC Bağlantısı.

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

Sınıf yolunuzda mysql konektör kavanozu olması gerekir.

Java JDBC API veritabanları ile her şeyi yapar. JDBC kullanarak Java uygulamalarını
1'e yazabiliriz. Sorgu gönderme veya SQL'i DB'ye (herhangi bir ilişkisel Veritabanı) güncelleme 2. DB'den sonuçları alma ve işleme

aşağıdaki üç adımla herhangi bir Veritabanından veri alabiliriz

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

Kısa ve Tatlı kod.

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 için

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

ConnectionBir süre önce kullanıyordum, en kolay yol gibi görünüyordu, ama aynı zamanda orada iftam olarak ifade etme önerisi vardı - tam olarak

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

Ya da böyle bir şey :)

Muhtemelen bir dava var, getConnectiondönebilirken null :)


1

Java uygulamasından MySQL veritabanını bağlamak için tüm adımları burada görebilirsiniz . Diğer veritabanı için, sürücüyü yalnızca ilk adımda değiştirmeniz yeterlidir. Lütfen veritabanına doğru yolu sağladığınızdan ve kullanıcı adı ile şifreyi düzelttiğinizden emin olun.

Http://apekshit.com/t/51/Steps-to-connect-Database-using-JAVA adresini ziyaret edin.


1
NASIL
  • Sürücüyü hızlı bir örnek çalıştıracak şekilde ayarlamak için
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'ı ayarlamak için

Yöntem 1: CLASSPATH değişkenini ayarlayın.

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

Yukarıdaki komutta, CLASSPATH değerini geçerli klasöre ve mysql-connector-java-VERSION.jar dosyasına ayarladım. Yani java MyClassFilekomut yürütüldüğünde, java uygulama başlatıcısı CLASSPATH'e tüm Java sınıfı yüklemeye çalışacaktır. Ve Driveclass => BOOM hatalarının gittiğini buldu.

Yöntem 2:

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

Not: Class.forName ("com.mysql.jdbc.Driver"); Bu 2019 Nisan'da kullanımdan kaldırıldı.

Umarım bu birine yardımcı olabilir!


-1

MySql JDBC Bağlantısı:

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 Sürücüsünü İndirin

İndirme bağlantısı (Platformdan bağımsız seçin): https://dev.mysql.com/downloads/connector/j/

JDBC Sürücüsünü C Sürücüsüne Taşıma

Dosyaları açın ve C: \ sürücüsüne gidin. Sürücü yolunuz şöyle olmalıdırC:\mysql-connector-java-8.0.19\mysql-connector-java-8.0.19

Java'nızı çalıştırın

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

    }  

}

resim açıklamasını buraya girin


-2

Kısa kod

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;
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.