将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

这是一个简短的3分钟视频教程,演示了如何使用Java中的MySQL。在此处进行检查:快速教程:使用Java连接到MySQL数据库
drorw

Answers:


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?这种方法更好吗?
杰森(Jason S)2010年

7
我认为这是与旧版驱动程序机制一起使用的旧版Driver类。MysqlDataSource实现javax.sql.DataSource哪个是更新的机制。
肖恩·欧文

1
嗨@SeanOwen我不知道为什么我们为什么要关闭rsstmt?为什么不只是conn呢?
KamuranSönecek'16

3
也许您应该添加dataSource.setDatabaseName(“ database”)。
Myoch

1
尽管要编写更多代码,但最好明确地关闭()事物。任何好的实现都必须在连接关闭时关闭资源,是的。考虑其他要重用语句或连接的上下文。在Java 7的try-with-resources中,您仍然可以免费获得以下行为:
Sean Owen

476

这是逐步说明如何安装MySQL和JDBC以及如何使用它:

  1. 下载并安装MySQL服务器。只需按照通常的方式进行即可。每次更改时都请记住端口号。默认情况下3306

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

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

    如果要在命令控制台中执行“普通香草”操作,则在执行Java应用程序时,需要在-cpor -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:安装MySQL服务器的主机名。如果将它安装在运行Java代码的同一台计算机上,则可以使用localhost。也可以是IP地址,例如127.0.0.1。如果遇到连接问题并使用127.0.0.1而不是localhost解决了连接问题,则说明网络/ DNS /主机配置中存在问题。

    • port:MySQL服务器侦听的TCP / IP端口。默认情况下3306

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

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

    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 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,则意味着该数据库根本无法访问。可能有以下一种或多种原因:

    1. JDBC URL中的IP地址或主机名错误。
    2. 本地DNS服务器无法识别JDBC URL中的主机名。
    3. JDBC URL中的端口号丢失或错误。
    4. 数据库服务器已关闭。
    5. DB服务器不接受TCP / IP连接。
    6. 数据库服务器已用尽连接。
    7. Java和DB之间的某种事物正在阻止连接,例如防火墙或代理。

    要解决一个或另一个,请遵循以下建议:

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

    需要注意的是关闭Connection极为重要的。如果您不关闭连接并在短时间内保持大量连接,则数据库可能会用尽连接,您的应用程序可能会中断。始终Connectiontry-with-resources声明中获得。或者,如果您尚未使用Java 7,则在finally一个try-finally块中显式关闭它。关闭finally只是为了确保在发生异常时也将其关闭。这也适用于StatementPreparedStatementResultSet

就连接性而言,仅此而已。您可以在这里找到更高级的教程,该教程如何在基本DAO类的帮助下将有价值的Java模型对象加载和存储在数据库中。


对数据库连接使用单例模式是一种不好的方法。参见其他问题: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();
        }
    }
}

一切都在一起

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

这就是所有:)如果有任何改进之处,请编辑!希望这会有所帮助。


马克,假设每个类都需要与数据进行交互,那么每个类是否都需要始终保持自己单独的MysqlConnect实例打开?我只是想知道此设置如何在类之间工作。
Michael Sims's

替代com.mysql.jdbc.Driverjdbc:mysql://localhost:3306/stocks方法,因为前者已弃用。
Chaudhry Waqas

如果您要使用硬连线的帐户名,密码,数据库名等,这种方式非常笨拙。只需将所有这些详细信息放入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

newInstance()是不必要的。是吗?
Mohamed Ennahdi El Idrissi '12

不。不是。而且自Java 6起,整个方法已经过时了。和驱动程序类的名称已更改,并....
Stephen 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()
唐·奇德尔

5
@mmcrae自2007
Lorne侯爵

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

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
怎么样
  • 设置驱动程序以运行快速样本
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中。它发现Driveclass => 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

测试MySQL.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;
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.