Kết nối Java với cơ sở dữ liệu MySQL


322

Làm thế nào để bạn kết nối với cơ sở dữ liệu MySQL trong Java?

Khi tôi cố gắng, tôi nhận được

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)

Hoặc là

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

Hoặc là

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

Đây là một video hướng dẫn ngắn 3 phút thể hiện bằng cách sử dụng MySQL từ Java. Kiểm tra nó ở đây: Hướng dẫn nhanh: Kết nối với cơ sở dữ liệu MySQL bằng Java
drorw

Câu trả lời:


208

DriverManagerlà một cách làm khá cũ. Cách tốt hơn là lấy một DataSource, bằng cách tìm kiếm một thùng chứa máy chủ ứng dụng đã được cấu hình cho bạn:

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

hoặc khởi tạo và định cấu hình một từ trình điều khiển cơ sở dữ liệu của bạn trực tiếp:

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

và sau đó có được các kết nối từ nó, giống như trên:

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

1
Làm thế nào đến các ví dụ khác sử dụng com.mysql.jdbc.Driver? phương pháp này tốt hơn?
Jason S

7
Tôi nghĩ rằng đây là lớp Driver kiểu cũ hoạt động với cơ chế trình điều khiển kiểu cũ. MysqlDataSourcethực hiện javax.sql.DataSourceđó là cơ chế mới hơn.
Sean Owen

1
Xin chào @SeanOwen Tôi tự hỏi rằng, tại sao chúng ta đóng rsstmt? Tại sao không chỉ conn?
Kamuran Sönecek

3
Có lẽ bạn nên thêm dataSource.setDatabaseName ("cơ sở dữ liệu").
Myoch

1
Đó là cách thực hành tốt để đóng () mọi thứ một cách rõ ràng, mặc dù nó có nhiều mã hơn. Bất kỳ triển khai tốt nào cũng sẽ phải đóng tài nguyên khi đóng kết nối, vâng. Xem xét các bối cảnh khác mà bạn muốn sử dụng lại một tuyên bố hoặc kết nối mặc dù. Trong tài nguyên dùng thử của Java 7, dù sao bạn cũng có được hành vi này miễn phí:
Sean Owen

476

Dưới đây là hướng dẫn từng bước cách cài đặt MySQL và JDBC và cách sử dụng nó:

  1. Tải xuống và cài đặt máy chủ MySQL . Chỉ cần làm theo cách thông thường. Ghi nhớ số cổng bất cứ khi nào bạn thay đổi nó. Đó là mặc định3306.

  2. Tải xuống trình điều khiển JDBC và đặt đường dẫn lớp , trích xuất tệp ZIP và đặt tệp JAR có chứa trong đường dẫn lớp. Trình điều khiển JDBC dành riêng cho nhà cung cấp là một triển khai cụ thể của API JDBC ( hướng dẫn tại đây ).

    Nếu bạn đang sử dụng một IDE như Eclipse hoặc Netbeans, thì bạn có thể thêm nó vào đường dẫn lớp bằng cách thêm tệp JAR làm Thư viện vào Đường dẫn xây dựng trong các thuộc tính của dự án.

    Nếu bạn đang thực hiện "vanilla đơn giản" trong bảng điều khiển lệnh, thì bạn cần chỉ định đường dẫn đến tệp JAR trong -cphoặc -classpathđối số khi thực thi ứng dụng Java của mình.

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

    .chỉ ở đó để thêm thư mục hiện tại vào đường dẫn lớp để nó có thể định vị com.example.YourClass;là dấu phân cách đường dẫn như trong Windows. Trong Unix và bản sao :nên được sử dụng.

  3. Tạo một cơ sở dữ liệu trong MySQL . Hãy tạo một cơ sở dữ liệu javabase. Tất nhiên bạn muốn World Domination, vì vậy hãy sử dụng UTF-8.

    CREATE DATABASE javabase DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
  4. Tạo một người dùng cho Java và cấp cho nó quyền truy cập . Đơn giản vì sử dụngrootlà một thực hành xấu.

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

    Có, javalà tên người dùng và passwordlà mật khẩu ở đây.

  5. Xác định URL JDBC . Để kết nối cơ sở dữ liệu MySQL bằng Java, bạn cần một URL JDBC theo cú pháp sau:

    jdbc: mysql: // tên máy chủ: port / databasename
    • hostname: Tên máy chủ nơi cài đặt máy chủ MySQL. Nếu nó được cài đặt tại cùng một máy nơi bạn chạy mã Java, thì bạn có thể sử dụng localhost. Nó cũng có thể là một địa chỉ IP như thế nào 127.0.0.1. Nếu bạn gặp phải sự cố kết nối và sử dụng 127.0.0.1thay vì localhostgiải quyết nó, thì bạn đã gặp sự cố trong cấu hình mạng / DNS / hosts của mình.

    • port: Cổng TCP / IP nơi máy chủ MySQL lắng nghe. Đây là mặc định 3306.

    • databasename: Tên của cơ sở dữ liệu bạn muốn kết nối. Đó là javabase.

    Vì vậy, URL cuối cùng sẽ trông như:

    jdbc: mysql: // localhost: 3306 / javabase
  6. Kiểm tra kết nối với MySQL bằng Java . Tạo một lớp Java đơn giản với mộtmain()phương thức để kiểm tra kết nối.

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

    Nếu bạn nhận được một SQLException: No suitable driver, thì điều đó có nghĩa là trình điều khiển JDBC hoàn toàn không được tải tự động hoặc URL JDBC bị sai (nghĩa là nó không được nhận ra bởi bất kỳ trình điều khiển được tải nào). Thông thường, trình điều khiển JDBC 4.0 sẽ được tự động tải khi bạn chỉ cần thả nó trong đường dẫn lớp thời gian chạy. Để loại trừ cái này và cái khác, bạn luôn có thể tải nó theo cách thủ công như sau:

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

    Lưu ý rằng newInstance()cuộc gọi không cần thiết ở đây. Nó chỉ để sửa lỗi cũ và lỗi org.gjt.mm.mysql.Driver. Giải thích tại đây . Nếu dòng này ném ClassNotFoundException, thì tệp JAR chứa lớp trình điều khiển JDBC đơn giản là không được đặt trong đường dẫn lớp.

    Lưu ý rằng bạn không cần tải trình điều khiển mọi lúc trước khi kết nối. Chỉ một lần trong quá trình khởi động ứng dụng là đủ.

    Nếu bạn nhận được một SQLException: Connection refusedhoặc Connection timed outmột MySQL cụ thể CommunicationsException: Communications link failure, thì điều đó có nghĩa là DB hoàn toàn không thể truy cập được. Điều này có thể có một hoặc nhiều nguyên nhân sau:

    1. Địa chỉ IP hoặc tên máy chủ trong URL JDBC là sai.
    2. Tên máy chủ trong URL JDBC không được máy chủ DNS cục bộ nhận ra.
    3. Số cổng bị thiếu hoặc sai trong URL JDBC.
    4. Máy chủ DB ngừng hoạt động.
    5. Máy chủ DB không chấp nhận kết nối TCP / IP.
    6. Máy chủ DB đã hết kết nối.
    7. Một cái gì đó ở giữa Java và DB đang chặn các kết nối, ví dụ như tường lửa hoặc proxy.

    Để giải quyết cái này hay cái khác, hãy làm theo các lời khuyên sau:

    1. Xác minh và kiểm tra chúng với ping.
    2. Làm mới DNS hoặc sử dụng địa chỉ IP trong URL JDBC thay thế.
    3. Xác minh nó dựa trên my.cnfMySQL DB.
    4. Bắt đầu DB.
    5. Xác minh nếu mysqld được bắt đầu mà không có --skip-networking option.
    6. Khởi động lại DB và sửa mã của bạn cho phù hợp để nó đóng các kết nối finally.
    7. Vô hiệu hóa tường lửa và / hoặc cấu hình tường lửa / proxy để cho phép / chuyển tiếp cổng.

    Lưu ý rằng việc đóng cửa Connectionvô cùng quan trọng. Nếu bạn không đóng các kết nối và tiếp tục nhận được nhiều kết nối trong một thời gian ngắn, thì cơ sở dữ liệu có thể hết kết nối và ứng dụng của bạn có thể bị hỏng. Luôn luôn có được Connectiontrong một try-with-resourcestuyên bố . Hoặc nếu bạn chưa có trên Java 7, hãy đóng nó một cách rõ ràng trong finallymột try-finallykhối. Đóng cửa finallychỉ để đảm bảo rằng nó cũng được đóng lại trong trường hợp ngoại lệ. Điều này cũng áp dụng cho Statement, PreparedStatementResultSet.

Đó là mối quan tâm kết nối. Bạn có thể tìm thấy ở đây một hướng dẫn nâng cao hơn về cách tải và lưu trữ các đối tượng mô hình Java đầy đủ trong cơ sở dữ liệu với sự trợ giúp của lớp DAO cơ bản.


Sử dụng một mẫu Singleton cho kết nối DB là một cách tiếp cận tồi. Xem trong số các câu hỏi khác: http://stackoverflow.com/q/9428573/ . Đây là một sai lầm bắt đầu số 1.


39

Khởi tạo hằng cơ sở dữ liệu

Tạo tên người dùng cơ sở dữ liệu không đổi, mật khẩu, URL và trình điều khiển, giới hạn bỏ phiếu, v.v.

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

Khởi tạo kết nối và thuộc tính

Sau khi kết nối được thiết lập, tốt hơn là lưu trữ cho mục đích tái sử dụng.

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

Tạo thuộc tính

Đối tượng thuộc tính giữ thông tin kết nối, kiểm tra xem nó đã được đặt chưa.

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

Kết nối cơ sở dữ liệu

Bây giờ kết nối với cơ sở dữ liệu bằng cách sử dụng các hằng và thuộc tính khởi tạo.

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

Ngắt kết nối cơ sở dữ liệu

Khi bạn đã hoàn tất các hoạt động cơ sở dữ liệu, chỉ cần đóng kết nối.

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

Mọi thứ cùng nhau

Sử dụng lớp này MysqlConnecttrực tiếp sau khi thay đổi cơ sở dữ liệu, tên người dùng và mật khẩu, v.v.

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

Sử dụng như thế nào?

Khởi tạo lớp cơ sở dữ liệu.

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

Một nơi nào khác trong mã của bạn ...

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

Đây là tất cả :) Nếu bất cứ điều gì để cải thiện chỉnh sửa nó! Hy vọng điều này là hữu ích.


Đánh dấu, mỗi lớp có cần duy trì cá thể MysqlConnect riêng của mình mở mọi lúc không - giả sử họ cần tương tác với dữ liệu? Tôi chỉ tự hỏi làm thế nào thiết lập này hoạt động giữa các lớp.
Michael Sims

ở vị trí com.mysql.jdbc.Drivernày jdbc:mysql://localhost:3306/stocksnên được sử dụng như trước đây là không dùng nữa.
Chaudhry Waqas

Nếu bạn đang đi đến tên tài khoản hardwire, mật khẩu, tên cơ sở dữ liệu, vv, cách này rất vụng về. Chỉ cần đặt tất cả các chi tiết đó vào chuỗi URL JDBC. (Bao gồm kích thước bể bơi ...)
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);

Cơ sở dữ liệu của bạn ở đây là gì? tên cơ sở dữ liệu?
Koray Tugay

newInstance () là không cần thiết. Là nó?
Mohamed Ennahdi El Idrissi

Không. Không phải vậy. Và kể từ Java 6, toàn bộ cách tiếp cận này đã lỗi thời. Và tên lớp tài xế đã thay đổi và ....
Stephen C

12

Đây là mức tối thiểu bạn cần để lấy dữ liệu từ cơ sở dữ liệu 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();

Thêm xử lý ngoại lệ, cấu hình, vv để nếm thử.


3
tại sao bạn cần Class.forName(...).newInstance()?
Don Cheadle

5
@mmcrae Bạn không, kể từ năm 2007
Hầu tước Lorne

3

Kết nối MySQL JDBC với 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);
}

2

bạn cần phải có jar kết nối mysql trong đường dẫn lớp của bạn.

trong Java JDBC API làm cho mọi thứ với cơ sở dữ liệu. sử dụng JDBC, chúng ta có thể viết các ứng dụng Java lên
1. Gửi truy vấn hoặc cập nhật SQL lên DB (bất kỳ Cơ sở dữ liệu quan hệ nào) 2. Truy xuất và xử lý kết quả từ DB

với ba bước dưới đây, chúng tôi có thể truy xuất dữ liệu từ bất kỳ Cơ sở dữ liệu nào

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

Mã ngắn và ngọt ngào.

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

Đối với máy chủ SQL 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

ConnectionTôi đã sử dụng một thời gian trước đây, nó trông giống như cách dễ nhất, nhưng cũng có khuyến nghị để đưa ra iftuyên bố - chính xác

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

Hoặc một cái gì đó giống như vậy :)

Có lẽ có một số trường hợp, trong khi getConnectioncó thể trở lại null :)


1

Bạn có thể xem tất cả các bước để kết nối cơ sở dữ liệu MySQL từ ứng dụng Java tại đây . Đối với cơ sở dữ liệu khác, bạn chỉ cần thay đổi trình điều khiển trong bước đầu tiên mà thôi. Vui lòng đảm bảo rằng bạn cung cấp đúng đường dẫn đến cơ sở dữ liệu và tên người dùng và mật khẩu chính xác.

Truy cập http://apekshit.com/t/51/Steps-to-connect-Database-USE-JAVA


1
LÀM SAO
  • Để thiết lập Trình điều khiển để chạy mẫu nhanh
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
  • Để thiết lập CLASSPATH

Phương pháp 1: đặt biến CLASSPATH.

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

Trong lệnh trên, tôi đã đặt CLASSPATH vào thư mục hiện tại và tệp mysql-Connector-java-VERSION.jar. Vì vậy, khi java MyClassFilelệnh được thực thi, trình khởi chạy ứng dụng java sẽ cố gắng tải tất cả các lớp Java trong CLASSPATH. Và nó tìm thấy Drivelớp => lỗi BOOM đã biến mất.

Cách 2:

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

Lưu ý: Class.forName ("com.mysql.jdbc.Driver"); Điều này không được chấp nhận tại thời điểm này 2019 tháng Tư.

Hy vọng điều này có thể giúp ai đó!


-1

Kết nối JDBC MySql:

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

Tải xuống trình điều khiển JDBC

Liên kết tải xuống (Chọn nền tảng độc lập): https://dev.mysql.com/doads/connector/j/

Di chuyển trình điều khiển JDBC sang ổ đĩa C

Giải nén các tệp và di chuyển đến ổ C: \. Đường dẫn lái xe của bạn sẽ giống nhưC:\mysql-connector-java-8.0.19\mysql-connector-java-8.0.19

Chạy Java của bạ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

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

    }  

}

nhập mô tả hình ảnh ở đây


-2

Mã ngắn

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;
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.