将 Java 连接到 MySQL 数据库

Connect Java to a MySQL database

提问人:abson 提问时间:5/15/2010 最后编辑:Mark Rotteveelabson 更新时间:11/17/2023 访问量:766041

问:

如何在 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 jdbc

评论

1赞 drorw 10/10/2018
这是一个简短的 3 分钟视频教程,演示了如何从 Java 使用 MySQL。在这里查看: 快速教程:使用 Java 连接到 MySQL 数据库

答:

27赞 heffaklump 5/15/2010 #1
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);

评论

0赞 Koray Tugay 3/24/2013
这里的数据库是什么?数据库名称?
0赞 Mohamed Ennahdi El Idrissi 12/13/2016
newInstance() 不是必需的。是吗?
1赞 Stephen C 3/6/2020
不。事实并非如此。从 Java 6 开始,整个方法已经过时了。并且驱动程序类名称已更改并且....
0赞 vmrvictor 7/13/2020
有趣的是,在 DriverManager docs.oracle.com/javase/6/docs/api/java/sql/DriverManager.html 的文档中指出不再需要 Class.forName(),而是可以使用一些属性文件 java.sql.Driver
0赞 vmrvictor 7/13/2020
这里的数据库名称似乎是“YourDatabase”,正如您在 URL 中看到的那样
13赞 Kilian Foth 5/15/2010 #2

以下是从 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赞 Don Cheadle 4/22/2015
你为什么需要?Class.forName(...).newInstance()
8赞 user207421 2/13/2017
@mmcrae 自 2007 年以来,你没有。
231赞 Sean Owen 5/15/2010 #3

DataSource

DriverManager是一种相当古老的做事方式。更好的方法是获取 DataSource 对象。通过使用 JNDI 查找一个已为您配置的应用程序服务器容器:

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

...或者直接从数据库驱动程序实例化和配置一个,例如(参见文档):com.mysql.cj.jdbc.MysqlDataSource

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

在现代 Java 中,使用 try-with-resources 语法自动关闭 JDBC 资源(现在是 AutoCloseable)。

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

评论

1赞 Jason S 5/21/2010
为什么其他例子会使用?这种方法更好吗?com.mysql.jdbc.Driver
8赞 Sean Owen 5/21/2010
我认为这是与旧式驱动程序机制一起使用的旧式 Driver 类。 实现这是较新的机制。MysqlDataSourcejavax.sql.DataSource
1赞 Kamuran Sönecek 4/14/2016
嗨,@SeanOwen我想知道,为什么我们关闭并?为什么不只是 ?rsstmtconn
4赞 Myoch 5/22/2016
也许你应该添加dataSource.setDatabaseName(“database”)。
2赞 Sean Owen 5/29/2016
显式关闭()内容是一种很好的做法,尽管它更多的代码。任何好的实现都必须在连接关闭时关闭资源,是的。不过,请考虑要重用语句或连接的其他上下文。在 Java 7 的 try-with-resources 中,无论如何你都可以免费获得这种行为:
535赞 BalusC 5/15/2010 #4

以下是如何安装 MySQL 和 JDBC 以及如何使用它的分步说明:

  1. 下载并安装 MySQL 服务器。就按照通常的方式去做吧。每当您更改端口号时,请记住它。这是默认的。3306

  2. 下载JDBC驱动并放入类路径,解压ZIP文件并将包含的JAR文件放入类路径中。特定于供应商的 JDBC 驱动程序是 JDBC API 的具体实现(此处为教程)。

    如果您使用的是 Eclipse 或 Netbeans 等 IDE,则可以通过将 JAR 文件作为添加到项目属性中的构建路径中,将其添加到类路径中。

    如果您在命令控制台中“普通”执行此操作,那么在执行 Java 应用程序时,您需要在 or 参数中指定 JAR 文件的路径。-cp-classpath

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

    只是在那里将当前目录添加到类路径中,以便它可以找到,并且是 Windows 中的类路径分隔符。在 Unix 中,应使用克隆。.com.example.YourClass;:

    如果您正在开发一个基于 servlet 的 WAR 应用程序,并希望手动管理连接(实际上这种做法很糟糕),那么您需要确保 JAR 最终出现在构建中。参见 如何在不面临 java.lang.ClassNotFoundException 的情况下将 JAR 库添加到 WAR 项目?类路径 vs 构建路径 vs /WEB-INF/lib。更好的做法是在服务器本身中安装物理 JDBC 驱动程序 JAR 文件,并配置服务器以创建 JDBC 连接池。下面是 Tomcat 的示例:如何在基于 servlet 的应用程序中连接到 JDBC 数据库/数据源?/WEB-INF/lib

  3. 在MySQL中创建数据库。让我们创建一个数据库。你当然想要世界统治,所以让我们也使用 UTF-8。javabase

     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';
    

    是的,是用户名,也是这里的密码。javapassword

  5. 确定 JDBC URL。要使用 Java 连接 MySQL 数据库,您需要采用以下语法的 JDBC URL:

    jdbc:mysql://hostname:port/databasename
    • hostname:安装MySQL服务器的主机名。如果它安装在运行 Java 代码的同一台机器上,则可以使用 .它也可以是 IP 地址,如 .如果您遇到连接问题并使用而不是解决它,那么您的网络/DNS/主机配置有问题。localhost127.0.0.1127.0.0.1localhost

    • port:MySQL服务器侦听的TCP/IP端口。这是默认的。3306

    • databasename:要连接到的数据库的名称。那是。javabase

    因此,最终到达网址应如下所示:

    jdbc:mysql://localhost:3306/javabase
  6. 使用 Java 测试与 MySQL 的连接。使用测试连接的方法创建一个简单的 Java 类。main()

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

    如果得到 ,则表示 JDBC 驱动程序根本没有自动加载,或者 JDBC URL 错误(即任何加载的驱动程序都无法识别它)。另请参阅臭名昭著的java.sql.SQLException:未找到合适的驱动程序。通常,当您将 JDBC 4.0 驱动程序放在运行时类路径中时,它应该会自动加载。要排除一个和另一个,您始终可以手动加载它,如下所示:SQLException: No suitable driver

     System.out.println("Loading driver ...");
    
     try {
         Class.forName("com.mysql.cj.jdbc.Driver"); // Use com.mysql.jdbc.Driver if you're not on MySQL 8+ yet.
         System.out.println("Driver loaded!");
     } catch (ClassNotFoundException e) {
         throw new IllegalStateException("Cannot find the driver in the classpath!", e);
     }
    

    请注意,此处不需要调用。在MySQL的情况下,只是为了修复旧的和有缺陷的.解释在这里。如果此行抛出 ,则包含 JDBC 驱动程序类的 JAR 文件根本没有放在类路径中。另请注意,抛出异常非常重要,以便立即阻止代码执行,而不是仅打印堆栈跟踪,然后继续执行其余代码。newInstance()org.gjt.mm.mysql.DriverClassNotFoundException

    另请注意,在连接之前,您不需要每次都加载驱动程序。在应用程序启动期间只需一次就足够了。

    如果您获得特定于 或 或 MySQL 的 ,则意味着根本无法访问数据库。这可能有以下一个或多个原因:SQLException: Connection refusedConnection timed outCommunicationsException: Communications link failure

    1. JDBC URL 中的 IP 地址或主机名错误。
    2. JDBC URL 中的主机名无法被本地 DNS 服务器识别。
    3. JDBC URL 中的端口号缺失或错误。
    4. DB服务器已关闭。
    5. DB Server不接受TCP/IP连接。
    6. DB Server连接已用完。
    7. 介于 Java 和 DB 之间的某些东西正在阻止连接,例如防火墙或代理。

    要解决其中一个问题,请遵循以下建议:

    1. 使用 验证和测试它们。ping
    2. 刷新 DNS 或改用 JDBC URL 中的 IP 地址。
    3. 基于MySQL DB进行验证。my.cnf
    4. 启动数据库。
    5. 验证 mysqld 是否在没有 .--skip-networking option
    6. 重新启动数据库并相应地修复您的代码,使其关闭 中的连接。finally
    7. 禁用防火墙和/或配置防火墙/代理以允许/转发端口。

    请注意,关闭 非常重要。如果不关闭连接并在短时间内不断获得大量连接,则数据库可能会耗尽连接,并且应用程序可能会中断。始终在 try-with-resources 语句中获取 。这也适用于 、 和 。另请参阅 JDBC 中应多久关闭一次 Connection、Statement 和 ResultSet?ConnectionConnectionStatementPreparedStatementResultSet

就连接问题而言,就是这样。您可以在这里找到一个更高级的教程,了解如何借助基本的 DAO 类在数据库中加载和存储完整的 Java 模型对象。


对数据库使用单例模式和/或变量是一种不好的做法。查看其他内容 在多线程系统中使用静态 java.sql.Connection 实例是否安全?这是一个#1的首发错误。确保你不会落入这个陷阱。staticConnection

评论

0赞 Nafees Ahmad 6/5/2022
我遇到了同样的错误。更新驱动程序版本对我有用。downloads.mysql.com/archives/c-j
0赞 marc 10/30/2023
如果连接到 MySQL docker 容器(使用 docker-compose.yaml),JDBC url 中的主机名和端口值应该是什么?它仍然是 or (docker0) 还是 mysql 服务名称?localhost172.17.0.1
1赞 BalusC 10/31/2023
@marc:hostname 确实是 docker 服务名称(对象的键)。Port 是您在 ports 配置中指定的第二个值。如果是,那么它仍然是.services3306:33063306
0赞 marc 10/31/2023
@BalusC:我通过将database.driver值从更改为 来摆脱连接被拒绝错误。然而,这真的是因为大写字母吗?我只想确认,谢谢com.mysql.jdbc.Drivercom.mysql.jdbc.driver
2赞 Jwalant 1/21/2012 #5

您可以在此处查看从 Java 应用程序连接 MySQL 数据库的所有步骤。对于其他数据库,您只需要在第一步中更改驱动程序即可。请确保您提供正确的数据库路径以及正确的用户名和密码。

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

3赞 kapil das 8/15/2013 #6

您的类路径中需要有MySQL连接器JAR。

在 Java 中,JDBC API 使用数据库实现一切。使用 JDBC,我们可以将 Java 应用程序编写为
1。发送查询或将 SQL 更新到 DB(任何关系数据库) 2. 从数据库中检索和处理结果

通过以下三个步骤,我们可以从任何数据库中检索数据

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");
}
1赞 xxxvodnikxxx 5/28/2015 #7

Connection我前段时间使用过,它看起来是最简单的方法,但也有人建议在那里发表声明 - 确切地说if

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

或者类似的东西:)

可能有一些情况,虽然可以返回:)getConnectionnull

47赞 Madan Sapkota 6/14/2015 #8

初始化数据库常量

创建常量属性数据库用户名、密码、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;

创建属性

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

一切尽在掌握

更改database_name、用户名和密码等后直接使用此类。MysqlConnect

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

这就是全部:) 如果有什么改进的话,请编辑它!希望这对您有所帮助。

评论

0赞 Michael Sims 11/20/2017
Mark,每个类是否需要始终保持自己单独的 MysqlConnect 实例处于打开状态 - 假设它们需要与数据交互?我只是想知道这种设置在类之间是如何工作的。
0赞 StealthTrails 10/23/2018
应该使用它来代替它,因为前者已被弃用。com.mysql.jdbc.Driverjdbc:mysql://localhost:3306/stocks
0赞 Stephen C 3/6/2020
如果您要硬连线帐户名,密码,数据库名称等,这种方式非常笨拙。只需将所有这些详细信息放入 JDBC URL 字符串中即可。(包括游泳池大小...
0赞 Basil Bourque 10/1/2023
我建议使用 DataSource 实现,而不是这些硬编码属性。前任:。请参阅文档com.mysql.cj.jdbc.MysqlDataSource
0赞 Basil Bourque 10/1/2023
我建议使用 DataSource 实现,而不是这些硬编码属性。前任:。请参阅文档。参见 Sean Oven 的回答com.mysql.cj.jdbc.MysqlDataSource
2赞 KhiLan PaTeL 10/6/2015 #9

简短而甜蜜的代码。

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赞 Sarat Chandra 1/10/2017 #10

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");  
2赞 AJC 4/1/2017 #11

MySQL JDBC与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);
}

评论

0赞 BigMac66 4/8/2021
查询字符串的创建方式是一个非常糟糕的做法的示例,它容易受到 SQL 注入攻击。
-1赞 Corrupted_S.K 9/17/2017 #12

短代码

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;
    }
}
1赞 Nhat Dinh 4/24/2019 #13
如何
  • 设置驱动程序以运行快速示例
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

方法一:设置CLASSPATH变量。

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

在上面的命令中,我将 CLASSPATH 设置为当前文件夹和 mysql-connector-java-VERSION.jar 文件。因此,当命令执行时,java 应用程序启动器将尝试加载 CLASSPATH 中的所有 Java 类。 它发现 class => BOOM 错误消失了。java MyClassFileDrive

方法2:

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

注意: Class.forName(“com.mysql.jdbc.Driver”);这在 2019 年 4 月现已弃用。

希望这可以帮助某人!

-2赞 Chew Zai 2/22/2020 #14

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

    }  

}

enter image description here